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还是混战,圣导师都表现出压制其他职业的强大气势。因此,这个职业在游戏中备受欢迎,人气非常高。 实力强大的二代隐藏…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
