Go-Ethereum
如何使用 web3.eth.call 恢復原因
我有一個帶有所需消息的智能合約,並假裝在前端使用所需/驗證消息。
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 控制台中,我清楚地看到了值err
並errdata
返回了正確的消息。如果我在方法
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!