使用 web3 和 go-ethereum 在私有以太坊区块链上打开和进行交易时未捕获(承诺)错误

Posted

技术标签:

【中文标题】使用 web3 和 go-ethereum 在私有以太坊区块链上打开和进行交易时未捕获(承诺)错误【英文标题】:Uncaught (in promise) Error while opening and doing transaction on private ethereum blockchain using web3 and go-ethereum 【发布时间】:2019-12-05 16:31:09 【问题描述】:

我正在尝试使用 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 ! ');


            );
  ;

正在创建帐户,但在进行交易时我收到以下错误。

批准智能合约.....挖矿正在进行中! App.js:57

0x98f76b2673d545F55c0ff1e961f15EF0a7DfBaD3

App.js:71 智能合约

批准! errors.js:29 Uncaught (in promise) 错误:返回错误: 需要身份验证:密码或解锁 在 Object.ErrorResponse (errors.js:29) 在 index.js:125 在 XMLHttpRequest.request.onreadystatechange (index.js:103) 在 XMLHttpRequestEventTarget.dispatchEvent (xml-http-request-event-target.js:50) 在 XMLHttpRequest._setReadyState (xml-http-request.js:288) 在 XMLHttpRequest._onHttpResponseEnd (xml-http-request.js:459) 在 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) 在 afterTickTwo (index.js:31) 在 Item.push../node_modules/process/browser.js.Item.run (browser.js:167) 在 drainQueue (browser.js:131) ErrorResponse @errors.js:29 (匿名) @index.js:125 request.onreadystatechange @index.js:103 XMLHttpRequestEventTarget.dispatchEvent @ xml-http-request-event-target.js:50 XMLHttpRequest._setReadyState @ xml-http-request.js:288 XMLHttpRequest._onHttpResponseEnd @ xml-http-request.js:459(匿名)@ xml-http-request.js:413 发出@ events.js:139 endReadableNT @ _stream_readable.js:1030 afterTickTwo @ index.js:31 push../node_modules/process/browser.js.Item.run @ browser.js:167 drainQueue @ browser.js:131 setTimeout (async) _fireError@index.js:72 sendTxCallback@index.js:465(匿名)@index.js:125 request.onreadystatechange@index.js:103 XMLHttpRequestEventTarget.dispatchEvent @ xml-http-request-event-target.js:50 XMLHttpRequest._setReadyState @ xml-http-request.js:288 XMLHttpRequest._onHttpResponseEnd @ xml-http-request.js:459(匿名)@ xml-http-request.js:413 发出@ events.js:139 endReadableNT @ _stream_readable.js:1030 afterTickTwo @ index.js:31 push../node_modules/process/browser.js.Item.run @ browser.js:167 drainQueue @ browser.js:131 setTimeout (async) 运行超时@browser.js:43 推../node_modules/process/browser.js.process.nextTick @ browser.js:156 nextTick @ index.js:30 也许ReadMore @ _stream_readable.js:521 addChunk @ _stream_readable.js:300 可读AddChunk @ _stream_readable.js:278 push../node_modules/readable-stream/lib/_stream_readable.js.Readable.push @_stream_readable.js:242(匿名)@response.js:47 写@ response.js:44

编辑:更改代码以捕获错误

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 仍然给我错误。

【问题讨论】:

【参考方案1】:

因此,在对代码进行一些重大更改后,我可以通过 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 ! ');

                
                );
              
            );
          
          );
       

      );
;

【讨论】:

以上是关于使用 web3 和 go-ethereum 在私有以太坊区块链上打开和进行交易时未捕获(承诺)错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Go-Ethereum 1.7.2搭建以太坊私有链

权威证明问题中的 Go-ethereum 私有网络:调用合约方法但没有响应

CentOS 7 部署以太坊私有链 go1.13.2 + go-ethereum1.9.12

如何搭建以太坊私有链

如何搭建以太坊私有链

如何搭建以太坊私有链