web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中

news2024/12/26 21:39:50

好 上文web3通过antd 在React dapp中构建订单组件基本结构我们算是把一个基本的订单组件展示做出来了

然后 我们继续 起一下环境先
ganache 终端运行

ganache -d

在这里插入图片描述 MetaMask 登录一下
在这里插入图片描述
然后 打开项目 发布一下合约

truffle migrate --reset

在这里插入图片描述
然后 运行一下 测试脚本 转入交易所 ETH和grToken 还创建两个订单

truffle exec .\scripts\test.js

在这里插入图片描述
然后 运行起 dapp项目
在这里插入图片描述
好 那我们就开始啦

我们还是要用 redux 来管理全局的订单数据
这样就不需要考虑界面更新的问题了 redux 都会帮我们处理

这里 我们先找到 根目录下 src下的 redux下的 balanceSlice 目录
下面创建一个 orderSlice.js
参考代码如下

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";;

const orderSlice = createSlice({
    name:"order",
    initialState: {
        Cancelorders: [],  //已经取消的订单
        Fillorders: [],   //已经完成的订单
        Allorders: []  //全部的订单
    },
    reducers: {
        setCancelorders(state,action) {
            state.Cancelorders = action.payload
        },
        setFillorders(state,action) {
            state.Fillorders = action.payload
        },
        setAllorders(state,action) {
            state.Allorders = action.payload
        }
    }
})

export const { setCancelorders, setFillorders, setAllorders } = orderSlice.actions;

export default orderSlice.reducer;

export const loadCancelorderData = createAsyncThunk(
    "order/fetchCancelorderData",
    async (data, {dispatch}) => {
        
    }
)

这里 我们还是简单书写了一个 redux 数据结构 里面数据分为三个集合 分别是 所有取消的订单 所有已经完成的订单 所有的订单
然后 分别给他们三个写上了 对应的set函数

但是呢 我们异步这里 不能写成一个了 很多人可能觉得 我们写一个异步函数 先获取 Cancelorders 然后获取 Fillorders 最后获取 Allorders
这个作为现在的开发视角没问题 但后面我们需要考虑订阅和取消订阅的情况
所以 获取数据不能放在一起
这里 我们先写一个Cancelorders的试试水
当然 还是要先引入 我们找到 根目录下 src下的 redux 下的index.js
导入一下这个刚写的 orderSlice
在这里插入图片描述
然后 我们在 src下的 view 中 index.jsx 组件中 去使用这个函数
在这里插入图片描述
这里 我们导入了 自己写的 loadCancelorderData 并调用他 虽然 loadCancelorderData和loadBalanceData 都是异步的 但是 我们并不需要考虑先后执行的问题 因为他们之间并不关联 谁先谁后执行 影响不大

然后 我们来到 loadCancelorderData 函数 这里最关键的是拿到交易所的合约
因为订单都在交易所中
在这里插入图片描述
我们先打印在控制台中看一下
在这里插入图片描述
可以看到 这个交易所的合约是拿得到的

然后 我们打开交易所的合约 看到订单的整体结构 之前我们就是这样去做一个存储的
在这里插入图片描述
但是 这里 我们用的是mapping 一个对象的形式 我们想拿到对应数据 需要传入id
那么 解决办法 最基本的就是 改成一个数组结构 但显然 我不会选择写到一半再去改合约
那么 大家应该还记得 之前我说过 区块链就是能对事件信息进行存储 而且 不可篡改

还记得我们之前写的事件吗? 我们在 发布订单 取消订单 执行订单 都会记录事件 而我们直接可以去拿取这些事件的记录
在这里插入图片描述
这里 我们直接 将 loadCancelorderData事件 代码更改如下

export const loadCancelorderData = createAsyncThunk(
    "order/fetchCancelorderData",
    async (data, {dispatch}) => {
        const {
            Exchange
        } = data;

        const result = await Exchange.getPastEvents("Cancel", {
          fromBlock:0,
          toBlock: "latest"
        })
        console.log(result)
    }
)

这里 我们调用了交易所自带的一个事件 叫 getPastEvents 这个函数可以拿到合约之前记在链上的事件
然后 我们要拿到事件是 Cancel 这是之前我们在合约上写的 用来记录取消订单的事件
在这里插入图片描述然后里面的两个参数 fromBlock 表示 我们要第0个区块 简单说 最新的 然后 latest 表示我们要最新的
然后 输出打印结果
运行代码后 我们看控制台
在这里插入图片描述
很明显 我们成功了 拿到了一个数组 因为我们就一个取消的订单 所以 只有一条数据

然后 外面很多都是区块的信息 其实我们真正的订单自己写的信息在 returnValues中
在这里插入图片描述
每一条订单数据中都有一个 returnValues 这才是我们自己写的字段
我们可以把他过滤出来

我们可以这样写
在这里插入图片描述
还是整理成一个数组 但是 我们只要他里面的 returnValues字段
运行结果如下
在这里插入图片描述
那么 既然数据拿到了 我们调用 dispatch 调用指定set函数 将他写回到对应的数据中
在这里插入图片描述
然后 所有的 也是一样的 这里 我们再写一个事件 参考代码如下

export const loadAllrderData = createAsyncThunk(
    "order/fetchAlorderData",
    async (data, {dispatch}) => {
        const {
            Exchange
        } = data;

        const result = await Exchange.getPastEvents("Order", {
          fromBlock:0,
          toBlock: "latest"
        })
        const Allorders = result.map(item=>item.returnValues)
        dispatch(setAllorders(Allorders))
    }
)

和我们 刚才写的 获取取消的订单的数据的格式基本是一样的
只是 这里 我们改了个名字 然后调用的事件是 Order
这是我们之前合约用来记录 已创建订单的
在这里插入图片描述
然后 拿到数据 做一个数据的回写

然后 就是 完成订单的查询 也是一模一样

export const loadFillorderData = createAsyncThunk(
    "order/fetchFillorderData",
    async (data, {dispatch}) => {
        const {
            Exchange
        } = data;

        const result = await Exchange.getPastEvents("Fill", {
          fromBlock:0,
          toBlock: "latest"
        })
        const Fillorders = result.map(item=>item.returnValues)
        dispatch(setFillorders(Fillorders))
    }
)

这里 改个名字 然后 这里 我们要调用的是 Fill 之前我们合约定义来记录填充订单的事件
在这里插入图片描述
最后 拿到数据写入一下

写完之后 我们来到 src目录下的 view 目录下的index.jsx 将其他两个事件一起导入 然后调用一下
在这里插入图片描述
然后 我们运行代码 数据明显是进去了的
在这里插入图片描述
但是 我们控制台会报一个警告
在这里插入图片描述
好家伙 还是非常可怕的 满山红

其实这个问题 是因为 我们订单是一个非序列化数据 存在redux 中会出现的一个问题

他这里 我们明显看到数据是进去了的 而且存储看着也和我们预期的格式是一样的
她这个警告是说 你这个是个非序列化的数据 不符合我们的规范 将来如果出问题 你可别怪我们的框架

这个问题 如果你不想他出来 就可以直接关闭redux中对数据的一个检查

我们找到 src目录下 redux 目录下 index.js 中 在configureStore 加入一个这样的配置

middleware:getDefaultMiddleware => getDefaultMiddleware({
    serializableCheck:false
})

关闭掉他对数据的检查
在这里插入图片描述
然后 我们再次运行 控制台就干净了
在这里插入图片描述
好 那这样 我们的订单数据就拿到啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云尘靶场 --JIS-CTF-VulnUpload

重新下vpn连接的文件 还是fscan扫 访问一下13 到了/login.php 随便弱口令试试 好吧没成功,那目录扫描一下 那就先看一下robots.txt了 flag有点快的 抱着试一试的态度看一下admin_area 没想到源代码里面居然有 这么这么多 本来还以为密码要去爆破的&#xff0…

webrtc推拉流 srs报错:DTLS_HANG DTLS: > Hang, done=0, version=-1, arq=0

执行了./objs/srs -c conf/rtc.conf 打开了srs的推拉流网页: 推流 拉流 srs报错如下: [2023-11-08 21:55:23.489][Warn][44992][8xvf4d62][104][DTLS_HANG] DTLS: Hang, done0, version-1, arq0 观看srs日志,在sdp offer,answer…

Qlik Sense : Fetching data with Qlik Web Connectors

目录 Connecting to data sources Opening a connector Connecting to a data source Authenticating the connector Defining table parameters Using standard mode or legacy mode Standard mode Connector overview Using multi-line input parameters to fetch da…

提前尝鲜!铁威马TOS 6内测招募中,赢取“遥遥领先”!

铁威马NAS的出现为我们解决了绝大部分的数据存储难题,而作为国民专业级NAS的铁威马,也从未停止前进的脚步,不断的升级和改造,致力于为用户打造一个更友好更安全的存储环境。 铁威马全新操作系统TOS 6来了!40多项新功能…

制药企业如何提高员工的GMP合规意识

在上期的文章中,我们介绍了>>制药企业计算机化系统验证(CSV)的重要性,本期我们深入探讨制药企业如何培养员工形成GMP良好的合规意识。 良好的药品质量是保障患者安全和有效治疗的基石。为了确保药品的质量、安全性和一致性,制药企业必…

美国财政部制裁俄罗斯洗钱人士打击网络犯罪

导语 美国财政部近日对一名37岁的俄罗斯女子实施了制裁,原因是她参与了为俄罗斯精英和网络犯罪团伙洗钱的行为。这一行动旨在打击网络犯罪活动,保护国际金融市场的安全。本文将详细介绍制裁对象以及网络犯罪的持续演变。 制裁俄罗斯洗钱人士 根据美国财政…

20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz

20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz 2023/11/8 17:28 缘起,编译cv180zb的时候提示说cmake的版本低! OBJCOPY platform/generic/firmware/payloads/test.bin OBJCOPY platform/generic/firmware/fw_dynamic.bin OBJCOPY platfor…

【AntDesign】Docker部署

docker部署是主流的部署方式,极大的方便了开发部署环境,保持了环境的统一,也是实现自动化部署的前提。 1 项目的目录结构 dist: 使用build打包命令,生成的打包目录 npm run build : 打包项目命令 docker: 存放docker容器需要修改…

2023年11月IDE流行度最新排名

点击查看最新IDE流行度最新排名(每月更新) 2023年11月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

串口中断(10)自定义通讯协议-协议带数据长度及接收应答处理

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

2023年11月数据库流行度最新排名

点击查看最新数据库流行度最新排名(每月更新) 2023年11月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

微信小程序登录后端

一、 概念 code code是用户登录凭证,个人理解为用户的授权码(需要用户本人授权给小程序,小程序才有权力获取到你这个用户的数据),code需要由小程序向微信服务器获取。 注意: 每个code只能使用一次,且有效…

射频功率放大器应用中GaN HEMT的表面电势模型

标题:A surface-potential based model for GaN HEMTs in RF power amplifier applications 来源:IEEE IEDM 2010 本文中的任何第一人称都为论文的直译 摘要:我们提出了第一个基于表面电位的射频GaN HEMTs紧凑模型,并将我们的工…

kubernetes集群编排——k8s认证授权

pod绑定sa [rootk8s2 ~]# kubectl create sa admin [rootk8s2 secret]# vim pod5.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec:serviceAccountName: admincontainers:- name: nginximage: nginxkubectl apply -f pod5.yamlkubectl get pod -o yaml 认证 [rootk8s…

SpringBoot案例学习(黑马程序员day10,day11)

1 环境准备&#xff1a; 1.idea 创建spring项目&#xff0c;选择springweb,mybatis framework ,sql drive框架 2.添加pom.xml依赖&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependen…

关于 pthread_create 传参的疑问

对于函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) 里的参数 arg&#xff0c;之前一直有疑问&#xff0c;就是把 &thread 传给 arg时&#xff0c;新创建的线程里是否能取到这个值呢&#xff1…

小程序多文件上传 Tdesign

众所周知&#xff0c;小程序文件上传还是有点麻烦的&#xff0c;其实主要还是小程序对的接口有诸多的不便&#xff0c;比如说&#xff0c;文件不能批量提交&#xff0c;只能一个个的提交&#xff0c;小程序的上传需要专门的接口。 普通的小程序的页面也比普通的HTML复杂很多 现…

SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作

OLE DB链接器 OLE DB插件下载&#xff1a;https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?viewsql-server-ver16 配置OLE DB Connection Manager 在点击“新建”时&#xff0c;会弹出警告信息“不支持指定的提供程序&#xff0…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目&#xff0c;提供了很多企业级实践&#xff0c;比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

k8s 目录和文件挂载到宿主机

k8s生产中常用的volumes挂载方式有&#xff1a;hostPath、pv&#xff0c;pvc、nfs 1.hostPath挂载 hostPath是将主机节点文件系统上的文件或目录挂载到Pod 中&#xff0c;同时pod中的目录或者文件也会实时存在宿主机上&#xff0c;如果pod删除&#xff0c;hostpath中的文…