Go-Ethereum

如何使用 web3.eth.call 恢復原因

  • June 26, 2020

我有一個帶有所需消息的智能合約,並假裝在前端使用所需/驗證消息。

require(bytes(hashAlreadyRegistered[hash]).length  == 0, "Hash already registered");

我正在嘗試使用web3.eth.call.

根據我的理解,如果我通過它生成的對象,閱讀文件sendTransaction將起作用。我認為這是我正在嘗試做的,但到目前為止還沒有工作。

我的程式碼

sendTransaction方法:

await canManipuleContract.methods.setDocumentHash('#_' + request.body.hash)
   .send({
     from: fromAddress,
     gas: 400000,
     gasPrice: 21000000000
   })
   .then(function(txRaw) {
     console.log(txRaw)
     return response.json( txRaw.transactionHash );
   })
   .catch(function(error) {
     handleRevert(error);
     console.log("Error: \n" + error);
     return response.json( 'error' )
   })
 }

web3.eth.call方法:

function handleRevert( transactionObject ) {
   web3.eth.call( transactionObject, function( err, result ) {
     if ( ! err ) {
       console.log( 'result ' + result )
     }
     console.log( 'err ' +  err)
     //return response.json( 'Error: Returned error: execution reverted' )
   })
 }

的返回值handleRevert始終是err 0x。在 geth 控制台中,我清楚地看到了值errerrdata返回了正確的消息。

如果我在方法contract address中傳遞它,它總是返回,但從來沒有它自己需要的消息。transactionObject``web3.eth.call``Error: Returned error: execution reverted

版本:

Geth:1.9.15-穩定

web3.js:^1.2.8

我在這裡想念什麼?任何其他獲取智能合約所需消息的方法都將在這裡有所幫助。

試試這個,

async function getRevertReason(txHash){

 const tx = await web3.eth.getTransaction(txHash)

 var result = await web3.eth.call(tx, tx.blockNumber)

 result = result.startsWith('0x') ? result : `0x${result}`

 if (result && result.substr(138)) {

   const reason = web3.utils.toAscii(result.substr(138))
   console.log('Revert reason:', reason)
   return reason

 } else {

   console.log('Cannot get reason - No return value')

 }

}

Web3 現在支持還原字元串:https ://web3js.readthedocs.io/en/v1.2.8/web3-eth.html#handlerevert 。

您可以通過設置輕鬆啟動它web3.eth.handleRevert = true。現在,當您使用呼叫或發送功能時,恰好是以下之一:

  • web3.eth.call()
  • web3.eth.sendTransaction()
  • contract.methods.myMethod(…).send(…)
  • contract.methods.myMethod(…).call(…)

您將看到一條新消息,例如

Error: Your request got reverted with the following reason string: This is the revert reason!

引用自:https://ethereum.stackexchange.com/questions/84545