当前位置: 首页 > news >正文

6-5,web3浏览器链接区块链(react+区块链实战)

6-5,web3浏览器链接区块链(react+区块链实战)

  • 6-5 web3浏览器链接区块链(调用读写合约与metamask联动)

6-5 web3浏览器链接区块链(调用读写合约与metamask联动)

这里就是浏览器端和智能合约的交互

两个库

Web3
Truffle contract //truffle在链接前端合约简单包了一层,比较好用

来到react项目的根目录下(在第一章进行了创建),
在这里插入图片描述

这里重新创建一个react项目
https://blog.csdn.net/u012118993/article/details/87288516
react创建新项目 使用creat-react-app快速新建一个react项目

(1)npm install -g create-react-app 全局安装(安装到整体)

(2)create-react-app reactproject 新建并对react项目进行命名(注:项目名称不能有大写)

(3)cd reactproject 通过命令进入文件夹内部,准备运行项目

(4)npm start 运行项目

E:\truffle\woniu-pet-shop

在truffle目录下创建
在这里插入图片描述

在react的项目下安装下面的文件
安装web3(安装到文件夹下面)

npm install web3 --save

在这里插入图片描述

再安装truffle-contract

npm install truffle-contract --save

Demo完成

1.链接合约
2.执行一下合约内部函数
3.添加ant.design ui库支持
4.完成项目

在这里插入图片描述

注意新的
在这里插入图片描述

App.js中的内容
如下

import React from 'react'
import Web3 from 'web3'
import TruffleContract from 'truffle-contract'
import AdoptionJson from './truffle/build/contracts/Adoption.json'	//引入前面智能合约编译好得到的json文件class App extends React.Component{constructor(props){super(props)this.web3 = nullthis.Adoption = nullthis.init()this.state = {//name:'woniu'}}init(){//如果网页中的web3不是undefinedif(typeof window.web3 != 'undefined'){}}render(){return <button></button>//hello,{this.state.name}}
}export default App

在这里插入图片描述

如果浏览器中装入了metamask插件

在浏览器中全局变量就有值
在这里插入图片描述

可以手动链接metamask,也可以自动连接
在这里插入图片描述

进行脚本启动,之前web3在浏览器控制台undefined是因为空网页,此时

在react项目自建的petshop中启动

Npm start

在浏览器打开
http://localhost:3000/

视频效果
在这里插入图片描述

视频安装新的包
在这里插入图片描述
在这里插入图片描述

自己的有报错,原因init函数没有保存

在这里插入图片描述

实际成功后如下效果
在这里插入图片描述

在这里插入图片描述

新加入

init(){//如果网页中的web3不是undefinedif(typeof window.web3 != 'undefined'){this.web3Provider = window.web3.currentProvider;	//metamask内置了web3的实例,实际可以手动链接}else{alert('请按照metamask')}}

更改代码保存后,再次访问网络,无需关闭重新npm start

此时刷新一下
当然这时无弹窗,将metamask钱包删掉之后就有弹窗

这时使用chrome没有钱包的浏览器访问
在这里插入图片描述

有弹窗出现,但是有些乱码了

又加入代码

在这里插入图片描述

所有代码如下

import React from 'react'
import Web3 from 'web3'
import TruffleContract from 'truffle-contract'
import AdoptionJson from './truffle/build/contracts/Adoption.json'	//引入前面智能合约编译好得到的json文件//1.链接合约
//2.执行一下合约内部函数
//3.添加ant.design ui库支持
//4.完成项目
class App extends React.Component{constructor(props){super(props)this.web3 = nullthis.Adoption = nullthis.init()this.state = {//name:'woniu'}}init(){//如果网页中的web3不是undefinedif(typeof window.web3 != 'undefined'){this.web3Provider = window.web3.currentProvider;	//metamask内置了web3的实例,实际可以手动链接}else{alert('please install metamask')}this.web3 = new Web3(this.web3Provider)		//将我们的this.web3Provider装载进来this.initAdoption()}initAdoption(){this.Adoption = TruffleContract(AdoptionJson)	//使用TruffleContract传入编译后的合约,然后创建实例,可以调用合约内部函数this.Adoption.setProvider(this.web3Provider)	//设置来源,链接合约return this.markAdopted()}//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//this.markAdopted(){//部署链接一下//	const adoptionInstance = this.Adoption.deployed().then()	//}async markAdopted(){//部署链接一下//await同步方式获取异步数据const adoptionInstance = await this.Adoption.deployed()	//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//调用合约内部函数getAdoptersconst adopters = await adoptionInstance.getAdopters.call()console.log(adopters)}render(){return <button></button>//hello,{this.state.name}}
}export default App

刷新界面如下
在这里插入图片描述

获取到合约的address了
在这里插入图片描述

使用上方的变量可以获取本地的地址及metamask的默认账号地址了
在这里插入图片描述

https://blog.csdn.net/weixin_41937552/article/details/106990561?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242

这里无法获得metamask的地址的原因如上
https://blog.csdn.net/weixin_39421014/article/details/103323245

可以先把metamask的隐私权限关闭
https://www.freesion.com/article/8518937500/
隐私模式的设置与兼容JS代码
在这里插入图片描述

https://blog.csdn.net/JackieDYH/article/details/115380677?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
获取账户信息

经过代码的修改后在初始化的函数部分修改,

可以使用metamask链接网站了,并且能够打印出当前的metamask地址
在这里插入图片描述

接下来进行点击事件的代码更改
在这里插入图片描述

此处点击领养会弹出框用来支付的,因为要调用写入函数,写到链上的,此处的领养不用转钱但需要父手续费

本地成功调用需要写入区块链的函数(当点击按钮时如下)
在这里插入图片描述

最终成功运行的所有的代码如下:

import React from 'react'
import Web3 from 'web3'
import TruffleContract from 'truffle-contract'
import AdoptionJson from './truffle/build/contracts/Adoption.json'	//引入前面智能合约编译好得到的json文件//1.链接合约
//2.执行一下合约内部函数
//3.添加ant.design ui库支持
//4.完成项目
class App extends React.Component{constructor(props){super(props)this.web3 = nullthis.Adoption = nullthis.init()this.state = {//name:'woniu'}}async init(){//如果网页中的web3不是undefined//if(typeof window.web3 != 'undefined'){//	this.web3Provider = window.web3.currentProvider;	//metamask内置了web3的实例,实际可以手动链接//}else{//	alert('please install metamask')//}//this.web3 = new Web3(this.web3Provider)		//将我们的this.web3Provider装载进来//this.initAdoption()/* 新版的方式 *///var web3Provider;if (window.ethereum) {this.web3Provider = window.ethereum;try {// 请求用户授权await window.ethereum.enable();} catch (error) {// 用户不授权时console.error("User denied account access")}} else if (window.web3) {   // 老版 MetaMask Legacy dapp browsers...this.web3Provider = window.web3.currentProvider;} else {this.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');}this.web3 = new Web3(this.web3Provider);//web3js就是你需要的web3实例this.web3.eth.getAccounts(function (error, result) {if (!error)console.log(result)//授权成功后result能正常获取到账号了//this.account = result});//this.account =result//this.account =accountthis.initAdoption()}initAdoption(){this.Adoption = TruffleContract(AdoptionJson)	//使用TruffleContract传入编译后的合约,然后创建实例,可以调用合约内部函数this.Adoption.setProvider(this.web3Provider)	//设置来源,链接合约return this.markAdopted()}//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//this.markAdopted(){//部署链接一下//	const adoptionInstance = this.Adoption.deployed().then()	//}async markAdopted(){//部署链接一下//await同步方式获取异步数据const adoptionInstance = await this.Adoption.deployed()	//部署,这个是异步的,使用this.Adoption.deployed().then()也可以,这里用//调用合约内部函数getAdoptersconst adopters = await adoptionInstance.getAdopters.call()console.log(adopters)}async adopt(petId){//const account = window.web3.eth.defaultAccount		//获取metamask中默认的账户// 授权获取账户const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });const myAccount = accounts[0];	//获取当前metamask的地址const adoptionInstance = await this.Adoption.deployed()		//再次进行部署await adoptionInstance.adopt(petId,{from:myAccount})	//调用adopt只传递唯一一个参数,以及来源之前获取的地址,进行写入函数this.markAdopted()}render(){//onclick点击事件,调用领养函数return <button onClick={()=>this.adopt(2)}>领养第二个</button>//hello,{this.state.name}}
}export default App

已经成功执行所有的函数,读取写入函数

此代码还有一些缺陷,若交易失败会报错,页面也会报错,
点击拒绝,或者直接退出时
在这里插入图片描述

在这里插入图片描述

接下来就是美化ui

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenCV解决验证码(数字和字母)识别(Python)
  • 了解redis
  • YOLOv5和LPRNet的车牌识别系统
  • Java二十三种设计模式-单例模式(1/23)
  • mysql不初始化升级
  • ArcGIS识别不GDB文件地理数据库显示为空?
  • Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理
  • Django前后端打通
  • 基于机器学习的锂离子电池容量估计(MATLAB R2021B)
  • 深度学习基础:Numpy 数组包
  • ps导入图片的方式
  • javascript this
  • windows10开启防火墙,增加入站规则后不生效,还是不能访问后端程序
  • 视觉/AIGC面经->多模态
  • Open3D点云算法与点云深度学习案例汇总(长期更新)
  • ES6 学习笔记(一)let,const和解构赋值
  • Hibernate最全面试题
  • JavaScript 一些 DOM 的知识点
  • Octave 入门
  • PHP面试之三:MySQL数据库
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 分布式任务队列Celery
  • 记一次和乔布斯合作最难忘的经历
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前嗅ForeSpider采集配置界面介绍
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何解决微信端直接跳WAP端
  • 入门级的git使用指北
  • 源码安装memcached和php memcache扩展
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • scrapy中间件源码分析及常用中间件大全
  • 说说我为什么看好Spring Cloud Alibaba
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (二)JAVA使用POI操作excel
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计高校学生选课系统
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (五)网络优化与超参数选择--九五小庞
  • (转)平衡树
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NetCore项目nginx发布
  • .NET开源、简单、实用的数据库文档生成工具