WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi
好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的
那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了
在整个过程中 确实是没有我们后端的操作 或者说 我们自己就是后端 solidity 就是服务端
虽然我个人并不是很开好 WEB3的前景 我觉得很可能无法推广 但是 如果之后WEB3真的起来了 那么 可能会延伸成 前端开发Dapp工程师 和 新的 solidity 开发工程师 而我们这种从一开始就一直在做学习的 也很可能成为这一领域的 全栈开发工程师
我们还是先将 ganache 的环境起起来

然后 部署一下我们的合约

然后呢 这年头 我们写前端 不用个框架 都会让人笑话 所以 我们用目前大家用的比较多的 React
可能这种很多人会觉得vue会更平易近人 或者是 可能很多人不太了解React 但WEB3在国外比较火 所以做这块基本都是React的 我要是用vue写给你们 搞不好你们拿出去会被别人笑话啊
正好我这也有很多React的文章 大家也可以补补基础
我们在本地创建一个文件夹 作为项目目录

然后 我们终端执行
create-react-app webdapp
前提你电脑要安装了 React
创建一个 叫 webdapp的react项目
项目可能要创建有点久

创建好之后 我们用编辑器打开这个项目

然后 我们尝试在终端输入
npm start
能够运行起这个React 项目的欢迎界面 我们就算成功了

然后 这里 因为 我们是 前端和solidity一起写 我们完全可以做一个框架的整合
这里 我们知道 每次部署合约 json都会有一定变化,而这个Abi是前端链接合约的途径

那么 我们开发过程中 总不想重新部署一次合约 前端就要重新复制一次
其实我们完全可以将这些东西搬到前端项目中
然后 我们来到智能合约项目的所在目录下
然后 将除了 node_modules 依赖包 package-lock.json 如果你的项目中有package.json 则也不要
其他的文件都复制过来

然后扔掉 我们react项目的根目录下

但是 之前我们也说了 没有带一切有关依赖的工具和文件
那么 我们此时 合约项目是没有依赖 执行不起来的
我们可以在react项目 终端下执行
npm i openzeppelin-solidity
引入 openzeppelin-solidity 这是 一个开源的 solidity 库

好 安装好之后 为了证明这是没问题的 我们在react项目下执行
truffle migrate --reset
尝试部署智能合约

但这里显然报错了 他说 我们之前用的这个 
找不到 我们终端输入
npm install @openzeppelin/contracts
安装一下依赖
然后 再次部署合约
这样 我们的合约就部署成功了

然后 我们将 scripts 目录下的 test.js 测试文件代码更改如下
//指定以token grtoken合约
const GrToken = artifacts.require("grToken.sol")
//交易所合约
const Exchange = artifacts.require("Exchange.sol")
//定义E代理地址
const ETHER_ADDRESS = '0x0000000000000000000000000000000000000000';const fromWei = (bn) => {return web3.utils.fromWei(bn, "ether");
}
const toWei = (bn) => {return web3.utils.toWei(bn.toString(), "ether");
}module.exports = async function(callback) {const grTokenDai = await GrToken.deployed();const exchage = await Exchange.deployed();//获取用户列表const accounts = await web3.eth.getAccounts();//第一个账户 调用transfer 发送100000 grtoken给第二个用户 accounts[1]await grTokenDai.transfer(accounts[1],toWei(100000),{from: accounts[0]})//通过 exchage 交易所提供的 depositEther 函数 accounts[0] 第一个用户往交易所存入 100 Eawait exchage.depositEther({from: accounts[0],value: toWei(100)})//给第一个用户 accounts[0] 交易所 授权 100000 GRTOKEN 就是我自己定义的tokenawait grTokenDai.approve(exchage.address,toWei(100000),{from: accounts[0]})//第一个用户 accounts[0] 通过交易所提供的 depositToken函数 存入100000 grTokenawait exchage.depositToken(grTokenDai.address,toWei(100000),{from: accounts[0]})//通过 exchage 交易所提供的 depositEther 函数 accounts[1] 第二个用户往交易所存入 50 Eawait exchage.depositEther({from: accounts[1],value: toWei(50)})//给第二个用户 accounts[1] 交易所 授权 50000 GRTOKEN 就是我自己定义的tokenawait grTokenDai.approve(exchage.address,toWei(50000),{from: accounts[1]})//第二个用户 accounts[1] 通过交易所提供的 depositToken函数 存入50000 grTokenawait exchage.depositToken(grTokenDai.address,toWei(50000),{from: accounts[1]})//存储订单idlet orderId = 0;//存储创建订单返回结果let res ;//调用交易所创建订单 两千 gr 对 0.2E 由第一个用户发布res = await exchage.makeOrder(grTokenDai.address,toWei(2000), ETHER_ADDRESS ,toWei(0.2),{from: accounts[0]});//接收创建完成的订单idorderId = res.logs[0].args.id//告诉我们订单创建好了console.log("创建成功"+res.logs[0].args.id)//通过id取消订单await exchage.cancelorder(orderId,{from: accounts[0]})console.log(orderId,"取消订单成功")//调用交易所创建订单 一千 gr 对 0.1E 由第一个用户发布res = await exchage.makeOrder(grTokenDai.address,toWei(1000), ETHER_ADDRESS ,toWei(0.1),{from: accounts[0]});//接收创建完成的订单idorderId = res.logs[0].args.id//告诉我们订单创建好了console.log("创建成功"+res.logs[0].args.id)//利用用户 accounts[1] 来完成这个订单await exchage.fillorder(orderId,{from: accounts[1]})console.log("完成订单")// 获取第一个用户在交易所中的E数值let res1 = await exchage.tokens(ETHER_ADDRESS,accounts[0])console.log(fromWei(res1)+":E");//获取第一个用户 在交易所中 grtoken的数量let res2 = await exchage.tokens(grTokenDai.address,accounts[0])console.log(fromWei(res2)+":grtoken");// 获取第二个用户在交易所中的E数值let res3 = await exchage.tokens(ETHER_ADDRESS,accounts[1])console.log(fromWei(res3)+":第二个用户 E");// 获取第二个用户的 grtoken 并输出let res4 = await exchage.tokens(grTokenDai.address,accounts[1])console.log(fromWei(res4)+":第二个用户 grtoken");callback()
}
然后我们终端执行
truffle exec .\scripts\test.js
尝试运行测试文件
运行上也是没有任何问题 那就OK了呗

但是 这不代表完全成功 大家可以尝试一下 你用react组件尝试导入 src目录外的文件 是会报错的
所以 我们还得想办法将 build/contracts 内的json拿到src里面来
但是 这里 我们不能手动移 因为之后你重新部署 他还是在那个位置
我们如果还要每次发不完手动将文件夹放到src里面 那还不如不要给他们合在一起 每次去复制 abi 就好了
这里 我们需要研究一个问题 合约json的生成位置是谁配置的?
其实这些内容 我们都是可以在 truffle-config.js 中配置的

我们加一个字段
"contracts_build_directory" : "./src/build"

指定他将编译好的json 放到 当前目录下的 src下的 build 目录下面
然后 我们重写终端执行
truffle migrate --reset
部署智能合约

此时 可以看到 我们的目录就成功的生成出来了 里面的json也没什么问题

那么 我们就可以将原来最外面的这个

build 直接给它干掉了 已经没用了
然后 我们用 App.js 引入一个json合约 并控制台输出一下内容试试

然后 我们再次运行项目 打开控制台 你就会发现 这个json 内容就被成功输出在控制台了

相关文章:
WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi
好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就…...
rust运算
不同类型不能放在一起运算。如果非要计算,必须先强转成一个类型再运算。 一 、数字运算 (一)算术运算 a 10且b 5 名称运算符范例加ab的结果为15减-a-b的结果为5乘*a*b的结果为50除/a / b的结果为2求余%a % b的结果为0 Rust语言不支持自增…...
游戏引擎,脚本管理模块
编辑器中删除脚本,然后立即恢复删除的脚本关系正常编辑器中删除脚本,关掉编辑器,然后只恢复脚本,不恢复meta,然后再打开编辑器关系丢失编辑器中删除脚本,关掉编辑器,然后恢复脚本且恢复meta,然后再打开编辑…...
2023年7月工作经历三
年龄危机 传言:程序员干不过37岁,架构师干不过45岁,总监干不过55岁。我已经43岁了。当总监需要机遇;首下犯错,会扣领导工资;有的公司总监还需要出资。为了方便以后当总监,我还在超音速带过小团…...
1801_codesys产品主样本了解
全部学习汇总: GreyZhang/g_codesys: some codesys learning notes (github.com) 有些技术、学术的成长,氛围也是很重要的。我觉得工业控制,德国做得算是世界上很突出的。而这个巴伐利亚,更是突出中的佼佼者了。从这里的介绍看&am…...
flink的计时器
背景 在flink中,我们经常使用ontimer计时器实现很多逻辑的功能,常见的比如某个传感器温度增加连续超过1分钟的告警输出等,本文就来简单记录下计时器的作用 计时器 ontimer的定义 public void onTimer(long timestamp, OnTimerContext ctx…...
@SpringBootApplication剖析
一、前言 在SpringBoot项目中启动类必须加一个注解SpringBootApplication,今天我们来剖析SpringBootApplication这个注解到底做了些什么。 二、SpringBootApplication简单分析 进入SpringBootApplication源代码如下: 可以看出SpringBootApplication是…...
浅谈wor2vec,RNN,LSTM,Transfermer之间的关系
浅谈wor2vec,RNN,LSTM,Transfermer之间的关系 今天博主谈一谈wor2vec,RNN,LSTM,Transfermer这些方法之间的关系。 首先,我先做一个定位,其实Transfermer是RNN,LSTM&…...
【11】c++设计模式——>单例模式
单例模式是什么 在一个项目中,全局范围内,某个类的实例有且仅有一个(只能new一次),通过这个唯一的实例向其他模块提供数据的全局访问,这种模式就叫单例模式。单例模式的典型应用就是任务队列。 为什么要使…...
深度学习-卷积神经网络-AlexNET
文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数9.双GPU10.单GPU模型 1.LeNet-52.AlexNet1.架构2.局部响应归一化(VGG中取消了)3.重叠/不重叠池化4…...
人机关系不是物理关系也不是数理关系
人机关系是一种复杂的社会技术系统,涉及到人类和机器、环境之间的相互作用和影响。它不仅限于物理接触和数理规律,同时还包括了思维、情感、意愿等方面的交流和互动。在人机关系中,人类作为使用者和机器作为工具(将来可能会上升到…...
<html dir=ltr>是什么意思?
<html dirltr>的意思是: 文字默认从左到右排列 说明: HTML--超级文本标记语言 dir 属性 -- (文字的)排列方式属性 取值: ltr -- 代表左到右的排列方式 rtl -- 代表右到左的排列方式 默认值:ltr 示例: ltr左到右的对…...
工厂模式:简化对象创建的设计思想 (设计模式 四)
引言 在软件开发中,我们经常需要创建各种对象实例来满足不同的需求。通常情况下,我们会使用new关键字直接实例化对象,但这种方法存在一些问题,比如对象的创建逻辑分散在代码中,难以维护和扩展,同时也违反了…...
【2023最新】微信小程序中微信授权登录功能和退出登录功能实现讲解
文章目录 一、讲解视频二、小程序前端代码三、后端Java代码四、备注 一、讲解视频 教学视频地址: 视频地址 二、小程序前端代码 // pages/profile/profile.js import api from "../../utils/api"; import { myRequest } from "../../utils/reques…...
复习 --- C++运算符重载
.5 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另外一种功能,以适应不同的数据类型 4.5.1 加号运算符重载 作用:实现两个自定义数据类型相加的运算 1 #include<iostream>2 using namespace std;3 /…...
复习 --- select并发服务器
selectIO多路复用并发服务器,是通过轮询检测文件描述符来实现并发 将内核要检测文件描述符放入集合中,调用select函数,通知内核区检测文件描述符集合中的文件描述符是否准备就绪,即对应的空间中是否有数据 对准备就绪的文件描述…...
程序三高的方法
程序三高的方法 目录概述需求: 设计思路实现思路分析1.1)高并发 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,c…...
全志ARM926 Melis2.0系统的开发指引⑦
全志ARM926 Melis2.0系统的开发指引⑦ 编写目的11. 调屏11.1. 调屏步骤简介11.1.1. 判断屏接口。11.1.2. 确定硬件连接。11.1.3. 配置显示部分 sys_config.fex11.1.3.1. 配置屏相关 IO 11.1.4. Lcd_panel_cfg.c 初始化文件中配置屏参数11.1.4.1. LCD_cfg_panel_info11.1.4.2. L…...
全志ARM926 Melis2.0系统的开发指引⑧
全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…...
区别对比表:阿里云轻量服务器和云服务器ECS对照表
阿里云轻量应用服务器和云服务器ECS区别对照表,一看就懂的适用人群、使用场景、优缺点、使用限制、计费方式、网路和镜像系统全方位对比,阿里云服务器网分享ECS和轻量应用服务器区别对照表: 目录 轻量应用服务器和云服务器ECS区别对照表 轻…...
Python自动化红头文件生成:ReportLab与Jinja2技术实践
1. 项目概述:一个自动化的红头文件生成工具 最近在整理一些行政和项目文档时,经常需要处理格式要求极为严格的“红头文件”。这类文件通常用于正式通知、公告或批复,其版头、字体、字号、间距乃至印章位置都有近乎刻板的规定。手动在Word里调…...
过零电压比较器基础知识及Multisim电路仿真
目录 2.9 过零电压比较器 2.9.1 过零电压比较器基础知识 1.电路结构与核心定义 2. 工作原理 3. 核心特点与用途 2.9.2 过零电压比较器Multisim电路仿真 2. 仿真逻辑与工作原理 3. 波形解读(右侧瞬态分析结果) 摘要:过零电压比较器是一种阈值电压为0V的单限比较器,利…...
收藏!小白程序员必看:详解7种RAG分块策略,轻松提升大模型检索效果
收藏!小白程序员必看:详解7种RAG分块策略,轻松提升大模型检索效果 本文深入解析了RAG系统中7种主流分块策略,包括固定大小、语义、递归、文档结构、智能体、句子和段落分块。强调了分块策略对检索增强生成(RAG…...
【Oracle数据库指南】第17篇:Oracle逻辑与物理存储结构——表空间、段、区、数据块全解析
上一篇【第16篇】Oracle连接模式与内存管理——专用服务器、共享服务器与AMM 下一篇【第18篇】Oracle数据库规划与前期准备——创建数据库前的系统工作 摘要 本文系统讲解Oracle数据库的存储结构体系,包括逻辑存储(数据库→表空间→段→区→数据块&…...
基于Next.js与Tailwind CSS构建高性能数学学院官网实战指南
1. 项目概述:从零构建一个现代数学学院官网 最近接手了一个为一家数学学院构建全新官网的项目。客户的核心诉求很明确:需要一个专业、可信赖且信息清晰的线上门户,主要面向关心孩子教育的家长群体。这个项目没有复杂的后端逻辑,也…...
Go项目安全左移实践:集成Security-Shield实现自动化漏洞与密钥检测
1. 项目概述与核心价值 在当今的软件开发与运维实践中,应用安全已经从“附加题”变成了“必答题”。无论是个人开发者的小型项目,还是企业级的复杂系统,都面临着来自网络的各种潜在威胁。然而,安全工具的引入往往伴随着陡峭的学习…...
为什么你的Ziatype输出总是发灰?3分钟定位CMYK→RGB色域坍缩根源并一键修复
更多请点击: https://intelliparadigm.com 第一章:Ziatype印相发灰现象的直观诊断与认知重构 Ziatype是一种基于铁-银工艺的古典摄影印相法,其典型特征是高对比度、深沉黑位与细腻中间调。然而在实际操作中,“发灰”(…...
口碑好的芯片老化座哪家专业
在芯片制造与测试领域,芯片老化座是一个至关重要的设备。它能够模拟芯片在长期使用中的各种环境条件,提前发现潜在问题,确保芯片在实际应用中的稳定性和可靠性。那么,口碑好的芯片老化座哪家专业呢?今天我们就来详细探…...
对比了8款测试管理平台,最适合中小团队的居然是它
在软件研发的生命周期中,测试用例管理早已不是简单的“记录-执行-通过”的线性流程。随着敏捷开发、DevOps乃至AI辅助测试的全面渗透,测试管理平台承载的职责已扩展至需求追溯、缺陷闭环、自动化集成和质量度量等多个维度。然而,对于中小型测…...
Cartographer闭环优化里的‘分支定界’:一个机器人SLAM工程师的实战笔记与避坑心得
Cartographer闭环优化中的分支定界算法:工程实践与性能调优指南 在SLAM(即时定位与地图构建)领域,闭环检测的准确性直接决定了系统长期运行的稳定性。作为Cartographer算法的核心组件之一,分支定界(Branch …...
