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
相关文章:
6-5,web3浏览器链接区块链(react+区块链实战)
6-5,web3浏览器链接区块链(react区块链实战) 6-5 web3浏览器链接区块链(调用读写合约与metamask联动) 6-5 web3浏览器链接区块链(调用读写合约与metamask联动) 这里就是浏览器端和智能合约的交…...
C# 多态性
C# 多态性 介绍 多态性是面向对象编程(OOP)的一个核心概念,它允许不同类的对象对同一消息做出响应,并产生不同的结果。在C#中,多态性主要通过继承、接口和虚方法来实现。本文将深入探讨C#中的多态性,包括其原理、实现方式以及在实际编程中的应用。 原理 多态性允许将…...
Visual Studio 安装程序无法执行修复或更新
一.问题场景 出现问题的场景:当你的VS已经安装但是无法在工具中下载新组件或者卸载了当时一直无法安装。 二.问题原因 如果计算机上的 Visual Studio 实例已损坏,则可能会出现此问题。 三.解决方法 如果之前尝试修复或更新 Visual Studio 失败&…...
C#与PLC通信——如何设置电脑IP地址
前言: 我们与PLC通过以太网通信时,首先要做的就是先设置好电脑的IP,这样才能实现上位机电脑与PLC之间的通信,并且电脑的ip地址和PLC的Ip地址要同处于一个网段,比如电脑的Ip地址为192.168.1.1,那么PLC的Ip地…...
Milvus 核心设计(1) ---- 数据一致性的等级及使用场景
目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…...
EasyCVR视频技术:城市电力抢险的“千里眼”,助力抢险可视化
随着城市化进程的加速和电力需求的不断增长,电力系统的稳定运行对于城市的正常运转至关重要。然而,自然灾害、设备故障等因素常常导致电力中断,给城市居民的生活和企业的生产带来严重影响。在这种情况下,快速、高效的电力抢险工作…...
【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS
局域网设备访问WampServer 参考:https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied,改为Require all granted <…...
采用自动微分进行模型的训练
自动微分训练模型 简单代码实现: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的线性回归模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …...
k8s怎么配置secret呢?
在Kubernetes中,配置Secret主要涉及到创建、查看和使用Secret的过程。以下是配置Secret的详细步骤和相关信息: ### 1. Secret的概念 * Secret是Kubernetes用来保存密码、token、密钥等敏感数据的资源对象。 * 这些敏感数据可以存放在Pod或镜像中&#x…...
算法篇 滑动窗口 leetcode 长度最小的子数组
长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示...
数据库作业d8
要求: 一备份 1 mysqldump -u root -p booksDB > booksDB_all_tables.sql 2 mysqldump -u root -p booksDB books > booksDB_books_table.sql 3 mysqldump -u root -p --databases booksDB test > booksDB_and_test_databases.sql 4 mysql -u roo…...
前后端数据交互设计到的跨域问题
前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000,后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…...
非洲猪瘟监测设备的作用是什么?
TH-H160非洲猪瘟监测设备的主要作用是迅速、准确地检测出非洲猪瘟病毒,从而帮助控制和预防疫情的扩散。这些设备利用先进的生物传感技术和PCR分子生物学方法,能够在极短的时间内提供精确的检测结果<sup>1</sup><sup>2</sup><…...
移动硬盘损坏无法读取?专业恢复策略全解析
在数字化信息爆炸的今天,移动硬盘作为我们存储和传输大量数据的重要工具,其安全性和稳定性直接关系到个人与企业的数据安全。然而,当移动硬盘突然遭遇损坏,无法正常读取时,我们该如何应对?本文将深入探讨移…...
神经网络以及简单的神经网络模型实现
神经网络基本概念: 神经元(Neuron): 神经网络的基本单元,接收输入,应用权重并通过激活函数生成输出。 层(Layer): 神经网络由多层神经元组成。常见的层包括输入层、隐藏层…...
java中压缩文件的解析方式(解析文件)
背景了解:java中存在IO流的方式,支持我们对文件进行读取(Input,从磁盘到内存)或写入(output,从内存到磁盘),那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件&…...
巧用 VScode 网页版 IDE 搭建个人笔记知识库!
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述:最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记,考虑到在线 VScode 支持终…...
Jupyter Lab 使用
Jupyter Lab 使用详解 Jupyter Lab 是一个基于 Web 的交互式开发环境,提供了比 Jupyter Notebook 更加灵活和强大的用户界面和功能。以下是使用 Jupyter Lab 的详细指南,包括安装、基本使用、设置根目录和扩展功能等内容。 一、Jupyter Lab 安装与启动…...
MyBatis where标签内嵌foreach标签查询报错‘缺失右括号‘或‘命令未正确结束‘
MyBatis <where>标签内嵌<foreach>标签查询报错’缺失右括号’或’命令未正确结束’ <where>标签内嵌<foreach>标签 截取一段脱敏xml,写明大概意思 <select id"queryLogByIds" resultMap"BaseResultMap">SELE…...
重生奇迹MU 群战王牌
圣导师是重生奇迹MU游戏中八大职业之一,拥有风度翩翩、潇洒自如的形象和神一样的实力。无论是刷怪、PK、打boss还是混战,圣导师都表现出压制其他职业的强大气势。因此,这个职业在游戏中备受欢迎,人气非常高。 实力强大的二代隐藏…...
微电网优化调度:PSO与SSA算法的奇妙碰撞
Matlab代码:微电网的优化调度,以微电网的运行成本最小为目标进行优化,并把失负荷惩罚成本计入总目标当中,分别采用PSO算法和麻雀搜索算法(SSA算法,2020年新提出)进行优化求解,可分别…...
解锁3大网页设计黑科技:从像素到原型的无缝转换
解锁3大网页设计黑科技:从像素到原型的无缝转换 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 作为设计师,你是否曾为获取网页设计灵感而频繁截图&#x…...
Word以后一个空白页删除方法
https://cloud.tencent.com/developer/news/492607 参考上面的方法,点击显示编辑标记(下图右下角的那个),让分页符显示出来,然后直接delete就好了,然后再点击选择隐藏编辑标记即可。 如果在这个过程中导致…...
Arroyo分布式流处理引擎的完整测试策略指南:单元测试、集成测试与SQL测试框架详解
Arroyo分布式流处理引擎的完整测试策略指南:单元测试、集成测试与SQL测试框架详解 【免费下载链接】arroyo Distributed stream processing engine in Rust 项目地址: https://gitcode.com/gh_mirrors/ar/arroyo Arroyo是一个用Rust编写的分布式流处理引擎&a…...
解决pnpm安装esbuild时ELIFECYCLE错误的3种方法(附详细步骤)
彻底解决pnpm安装esbuild时ELIFECYCLE错误的实战指南 最近在Vite项目中使用pnpm安装esbuild时,不少开发者遇到了令人头疼的ELIFECYCLE错误。这个错误通常伴随着exit code 1,导致构建流程突然中断。作为一名长期使用pnpm的前端工程师,我深刻理…...
别再只会用assign了!手把手教你用Verilog for循环实现4位乘法器(附Modelsim仿真对比)
从assign到for循环:Verilog乘法器的硬件思维进阶指南 在FPGA开发中,乘法器是最基础却又最容易被忽视的运算单元。许多初学者会直接使用assign out a*b;这样的简洁写法,却很少思考这行代码背后究竟生成了怎样的硬件电路。本文将带你从硬件思维…...
SPM12处理fMRI数据时,如何从OpenNeuro下载的JSON文件里自动提取SliceTiming参数?
SPM12处理fMRI数据时,如何从OpenNeuro下载的JSON文件里自动提取SliceTiming参数? 当你第一次从OpenNeuro下载fMRI数据集时,可能会被附带的JSON文件搞得一头雾水。这些看似复杂的元数据文件实际上藏着预处理所需的关键参数——尤其是SliceTim…...
全球工业不间断电源行业市场规模与增长预测
工业不间断电源(简称工业UPS),专为严苛工业环境而设计,在复杂工业环境下为关键负荷提供高可靠性、高稳定性、强抗干扰能力的电力保护专。它的核心功能是在市电发生波动、短时断电或其他电力异常情况下,为关键设备提供持续、稳定的…...
当LabVIEW遇见AI:使用快马平台集成机器学习实现数据趋势预测
当LabVIEW遇见AI:使用快马平台集成机器学习实现数据趋势预测 最近在做一个工业设备状态监测的项目,需要实时预测电机振动趋势。传统LabVIEW开发虽然擅长数据采集和可视化,但加入AI预测能力一直让我头疼。直到尝试了InsCode(快马)平台&#x…...
VSCode插件Console Ninja详解:把DevTools搬进编辑器,调试效率翻倍
作为前端/Node.js开发者,我们每天都会和console.log打交道——调试时写日志、看输出、找错误,却总被“切换窗口”困扰:一边是VSCode编辑器,一边是浏览器DevTools或终端,来回切换不仅打断思路,还浪费大量时间…...
