2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Hier ist die Interaktion zwischen dem Browser und dem Smart Contract
Zwei Bibliotheken
Web3
Truffle-Vertrag //truffle verpackt einfach den Front-End-Vertrag in den Link, was einfacher zu verwenden ist.
kommenReaktionsprojektim Stammverzeichnis (erstellt in Kapitel 1),
Erstellen Sie hier ein Reaktionsprojekt neu
https://blog.csdn.net/u012118993/article/details/87288516
reagierenErstellen Sie ein neues ProjektVerwenden Sie creat-react-app, um schnell ein Reaktionsprojekt zu erstellen
(1)npm install -g create-react-app
Globale Installation (insgesamt installieren)
(2)create-react-app reactproject
Erstellen Sie ein neues Reaktionsprojekt und benennen Sie es (Hinweis: Der Projektname darf keine Großbuchstaben enthalten).
(3)cd reactproject
Geben Sie den Ordner über den Befehl ein und bereiten Sie die Ausführung des Projekts vor
(4)npm start
Führen Sie das Projekt aus
E:trufflewoniu-pet-shop
Erstellt im Trüffelverzeichnis
Installieren Sie die folgenden Dateien unter dem React-Projekt
Web3 installieren (im folgenden Ordner installieren)
npm install web3 --save
Dann installieren Sie truffle-contract
npm install truffle-contract --save
Demo abgeschlossen
1. Linkvertrag
2. Führen Sie die interne Funktion des Vertrags aus
3. Fügen Sie die Unterstützung für die ant.design-UI-Bibliothek hinzu
4. Schließen Sie das Projekt ab
Hinweis neu
Inhalte in App.js
wie folgt
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 = null
this.Adoption = null
this.init()
this.state = {
//name:'woniu'
}
}
init(){
//如果网页中的web3不是undefined
if(typeof window.web3 != 'undefined'){
}
}
render(){
return <button></button>//hello,{this.state.name}
}
}
export default App
Wenn das Metamask-Plugin im Browser installiert ist
Globale Variablen haben Werte im Browser
Metamask kann manuell oder automatisch verknüpft werden
Zuvor war web3 in der Browserkonsole nicht definiert, da es sich zu diesem Zeitpunkt um eine leere Webseite handelte
Beginnen Sie in der vom React-Projekt erstellten Petshop
Npm start
Im Browser öffnen
http://localhost:3000/
Videoeffekte
Video zur Installation neuer Pakete
Ich habe eine Fehlermeldung erhalten, weil die Init-Funktion nicht gespeichert wurde.
Der tatsächliche Effekt nach Erfolg ist wie folgt:
neu beigetreten
init(){
//如果网页中的web3不是undefined
if(typeof window.web3 != 'undefined'){
this.web3Provider = window.web3.currentProvider; //metamask内置了web3的实例,实际可以手动链接
}else{
alert('请按照metamask')
}
}
Nachdem Sie den geänderten Code gespeichert haben, greifen Sie erneut auf das Netzwerk zu, ohne es zu schließen, und starten Sie erneut NPM
Aktualisieren Sie es jetzt
Natürlich gibt es derzeit kein Popup-Fenster. Nach dem Löschen der Metamask-Brieftasche wird ein Popup-Fenster angezeigt.
Verwenden Sie zu diesem Zeitpunkt den Chrome-Browser ohne Wallet, um darauf zuzugreifen
Es erscheint ein Popup-Fenster, aber einige Zeichen sind verstümmelt
Code erneut hinzufügen
Alle Codes lauten wie folgt
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 = null
this.Adoption = null
this.init()
this.state = {
//name:'woniu'
}
}
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()
}
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()也可以,这里用
//调用合约内部函数getAdopters
const adopters = await adoptionInstance.getAdopters.call()
console.log(adopters)
}
render(){
return <button></button>//hello,{this.state.name}
}
}
export default App
Aktualisieren Sie die Schnittstelle wie folgt
Die Adresse des Vertrags erhalten
Verwenden Sie die oben genannten Variablen, um die lokale Adresse und die Standardkontoadresse der Metamaske abzurufen.
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
Der Grund, warum die Adresse der Metamaske hier nicht abgerufen werden kann, ist wie oben beschrieben
https://blog.csdn.net/weixin_39421014/article/details/103323245
Sie können zunächst die Datenschutzberechtigungen von Metamask deaktivieren.
https://www.freesion.com/article/8518937500/
Einstellungen für den Datenschutzmodus und kompatibler JS-Code
https://blog.csdn.net/JackieDYH/article/details/115380677?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
Kontoinformationen abrufen
Ändern Sie nach dem Ändern des Codes den Initialisierungsfunktionsteil.
Mit Metamask können Sie auf die Website verlinken und die aktuelle Metamask-Adresse ausdrucken.
Nehmen Sie als Nächstes die Codeänderungen für das Klickereignis vor
Wenn Sie hier auf Adoption klicken, wird ein Zahlungsfeld angezeigt, da die Schreibfunktion aufgerufen und in die Kette geschrieben werden muss. Hier muss kein Geld für die Adoption überwiesen werden, es ist jedoch eine Bearbeitungsgebühr für die Eltern erforderlich.
Rufen Sie die Funktion, die lokal in die Blockchain geschrieben werden muss, erfolgreich auf (wie folgt, wenn Sie auf die Schaltfläche klicken).
Der gesamte Code, der schließlich erfolgreich ausgeführt wurde, lautet wie folgt:
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 = null
this.Adoption = null
this.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 =account
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()也可以,这里用
//调用合约内部函数getAdopters
const 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
Alle Funktionen wurden erfolgreich ausgeführt, einschließlich Lese- und Schreibfunktionen.
Dieser Code weist noch einige Mängel auf. Wenn die Transaktion fehlschlägt, wird ein Fehler gemeldet, und die Seite meldet ebenfalls einen Fehler.
Wenn Sie auf „Ablehnen“ oder „Direkt Beenden“ klicken
Der nächste Schritt besteht darin, die Benutzeroberfläche zu verschönern