reactjs - 使用 web3 和 go-ethereum 在私有以太坊区块链上打开和进行交易时未捕获(承诺)错误
问题描述
我正在尝试使用 web3js 将 react 应用程序与 go-ethereum 集成。
一个事件 Onsubmit 将执行以下操作: 1. 创建一个帐户。2. 开户。3. 使用创建的账户批准智能合约。
这是我的代码
import React, { Component } from 'react';
import './App.css';
import web3 from './web3';
……
class App extends Component {
constructor(props){
super(props);
this.state = {requester : '', receiver:'', balance: '', message:''};
}
async componentDidMount(){
const requester = await auth.methods.requester().call();
const receiver = await auth.methods.receiver().call();
const approvers = await auth.methods.approvers(0).call();
const balance = await web3.eth.getBalance(auth.options.address);
this.setState({requester,receiver,balance});
}
onSubmit = async (event)=>{
event.preventDefault();
console.log('Approving the smart contract ..... Mining in process ! ');
var pass = "xxxxxxx"
var newaccount = web3.eth.personal.newAccount(pass);
var promise1 = Promise.resolve(newaccount);
promise1.then(function(value) {
var accountnumber = value;
console.log(accountnumber);
web3.eth.personal.unlockAccount(accountnumber,pass, 1500);
auth.methods.approve().send({gas: '1000000',from: accountnumber});
console.log('Smart Contract approved ! ');
});
};
正在创建帐户,但在进行交易时,我收到以下错误。
批准智能合约.....正在挖矿!应用程序.js:57
0x98f76b2673d545F55c0ff1e961f15EF0a7DfBaD3
App.js:71 智能合约
得到正式认可的 !errors.js:29 Uncaught (in promise) 错误:返回错误:需要身份验证:在 XMLHttpRequest.request.onreadystatechange (index.js:103) 处 index.js:125 处的 Object.ErrorResponse (errors.js:29) 处密码或解锁) 在 XMLHttpRequest._setReadyState (xml-http-request.js:288) 在 XMLHttpRequest._onHttpResponseEnd (xml-http-request.js:459) 的 XMLHttpRequestEventTarget.dispatchEvent (xml-http-request-event-target.js:50)在 push../node_modules/stream-http/lib/response.js.exports.IncomingMessage。(xml-http-request.js:413) 在 push../node_modules/stream-http/lib/response.js.exports.IncomingMessage.emit (events.js:139) 在 endReadableNT (_stream_readable.js:1030) 在在Item.push ../node_modules/process/browser.js.Item.run(browser.js:
编辑:更改代码以捕获错误
web3.eth.personal.unlockAccount(accountnumber,pass, 1500, function(err, result){
if(err){
alert("Error"+ err);
return;}
alert("Account Opening: "+ result);});
......
auth.methods.approve().send({gas: '1000000',from: accountnumber}, function(err, result){
if(err){
alert("Error"+ err);
return;}
alert("Account address: "+ result);
console.log('Smart Contract approved ! ');});
返回“ web3.eth.personal.unlockAccount
true”,但仍然auth.methods.approve
给我错误。
解决方案
因此,在对代码进行了一些重大更改后,我可以通过 react 应用程序上的 onSubmit 事件执行以下操作。
- 创建一个帐户。
- 转移一些气体给它。
- 解锁帐户。
- 与该帐户签订合同。
这是代码
onSubmit = async (event)=>{
event.preventDefault();
console.log('Approving the smart contract ..... Mining in process ! ');
var pass = "passsword1"
var newaccount = web3.eth.personal.newAccount(pass);
var promise1 = Promise.resolve(newaccount);
promise1.then(function(value) {
var accountnumber = value;
console.log(accountnumber);
web3.eth.personal.unlockAccount('0x197022acd263e8be0f6b65b10d1e5cdbaa244c17',"*****", 1500, function(err, result){
if(err){
alert("Error"+ err);
return;
}else {
alert("Parent Opening: "+ result);
web3.eth.sendTransaction({
from: "0x197022acd263e8be0f6b65b10d1e5cdbaa244c17",
to: accountnumber,
value: '100000000000000000',
}, function(err, transactionHash) {
if (err) {
console.log(err);
} else {
web3.eth.personal.unlockAccount(accountnumber,pass, 1500, function(err, result){
if(err){
alert("Error"+ err);
return;
}else{
console.log(web3.eth.getBalance(accountnumber));
alert("Child Opening: "+ result);
auth.methods.approve().send({gas: '20000000',from: accountnumber}, function(err, result){
if(err){
alert("Error"+ err);
return;
}else{
console.log("Account address: "+ result);
console.log('Smart Contract approved ! ');
}
});
}
});
}
});
}
});
};