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 内容就被成功输出在控制台了
在这里插入图片描述

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

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

相关文章

Ipython和Jupyter Notebook介绍

Ipython和Jupyter Notebook介绍 Python、IPython和Jupyter Notebook是三个不同但密切相关的工具。简而言之,Python是编程语言本身,IPython是对Python的增强版本,而Jupyter Notebook是一种在Web上进行交互式计算的环境,使用IPytho…

数据科学家的编程语言

数据科学家的编程语言 在今天有256种编程语言可供选择,选择要学习的语言可能会令人不知所措和困难。有些语言更适用于构建游戏,而有些更适用于软件工程,还有一些更适用于数据科学。 编程语言的类型 低级编程语言是计算机用来执行操作的最容…

主流的图像—文本的多模态技术实现方法有哪些?

大体上可划分为3类: 1)训练中间层以对齐视觉模块和语言模型。该类方法首先预训练视觉模块,将这些视觉模块与LLM冻结,然后在视觉模块与LLM之间插入可训练的中间层,构建多模态模型。接着在大规模的图像—文本对数据集上…

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…

Unity实现设计模式——解释器模式

Unity实现设计模式——解释器模式 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的模式,现实项目中用得较少。 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来…

python读取vivo手机截图,将满屏图片文件移动别的路径

问题之初 python读取vivo手机截图, 将满屏图片文件移动别的路径好多这样的图片,占用手机大量的内存,食之无味弃之可惜!那么会复制粘贴👀代码的我们我们今天就把这些图片筛选清理掉。 这段代码 原有逻辑的基础上&…

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有对象来生成新的对象,而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象,而无需显式地调用构造函数或暴露对象的创建…

Fiddle日常运用手册(3)-对移动端产品进行数据接口抓包

一般如果在做安卓移动端产品测试的时候,一般不像WEB端产品,可以直接进行F12进行接口日志查看开发预留的打印信息,将会影响测试人员的问题定位精准度以及效率。 这里,我们就介绍一下使用Fiddle进行移动端产品的抓包教程。 一、pc端…

JavaAPI---replace

package daysreplace;public class ReplaceTest {public static void main(String[] args) {String str "wwxhhhhhhhhhhh333";System.out.println("替换前的字符串" str);String newstr str.replace("333", "111");System.out.prin…

CRMEB商城源码开源标准版v5.2.0+后端+前端uni-app开源包安装教程

CRMEB打通版是一款全开源支持商用的PHP多语言商城系统,历经年时间匠心之作!系统采用前后端分离技术,基于TP6Uui-app框架开发;客户移动端采用uni-app开发,管理后台前端使用iviewUI开发。系统支持微信公众号端、微信小程序端、H5端、…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析: Code: LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,n…

@SpringBootApplication剖析

一、前言 在SpringBoot项目中启动类必须加一个注解SpringBootApplication,今天我们来剖析SpringBootApplication这个注解到底做了些什么。 二、SpringBootApplication简单分析 进入SpringBootApplication源代码如下: 可以看出SpringBootApplication是…

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期,并且字体颜色啥的样式也要修改(在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的,特此记录 官方文档 按照官方的说明,给v-model绑定一个字符串就可以了 在j…

关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果,话不多说,先来看看视频效果吧:链接 在这里具体的代码就不放出来了,还是利用了uniapp的 uni.createAnimation 方法,因为cover-view 不支持一些css 的动画效果,所以这…

文举论金:非农到来!黄金原油全面走势分析策略独家指导

市场没有绝对,涨跌没有定势,所以,对市场行情的涨跌平衡判断就是你的制胜法宝。欲望!有句意大利谚语:让金钱成为我们忠心耿耿的仆人,否则,它就会成为一个专横跋扈的主人。空头,多头都…

24 mysql all 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

基于可解释性特征矩阵与稀疏采样全局特征组合的人体行为识别

论文还未发表,不细说,欢迎讨论。 Title: A New Solution to Skeleton-Based Human Action Recognition via the combination usage of explainable feature extraction and sparse sampling global features. Abstract: With the development of deep …

集群服务器

文章目录 项目名:实现集群服务器技术栈通过这项目你学到(或者复习到)实现功能编码环境json环境muduo库boost库MySql数据库登录mysql:查看mysql服务开启了没有?mysql的服务器及开发包库chat,表 allgroup friend groupuser offlinemessage user…

记录本地部署Stable-diffusion所依赖的repositories和一些插件

今天按照其他文章的步骤拉取好了https://github.com/AUTOMATIC1111/stable-diffusion-webui后,点击webui-user.bat后发现,repositories和models还得慢慢拉取,好吧,GitHub Desktop,启动! BLIP: https://git…