根据最新版本的黄纸和实心装配规范,还原操作码可以返回一个错误代码。
http://solidity.readthedocs.io/en/develop/assembly.html
恢复(p,s) -结束执行,恢复状态更改,返回数据mem[p.(p+s)]
然而,纯实体中的还原函数有0个参数。我想它还不支持返回码。
问::如何使用来自Solidity程序集的还原将错误代码传递给调用的web3 JavaScript应用程序?如果这是不可能的,请解释原因。
发布于 2018-03-02 09:39:12
正如注释中所讨论的,在Dapp中没有一种简单的方法可以获得还原原因。不过,将来可能会支持这个特性。
以下是初步的环境影响政策及其讨论:
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-658.md https://github.com/ethereum/EIPs/pull/658
先前的回答
据我所知,像web3这样的客户机不可能读取还原输出,就像在正常事务完成的情况下不可能读取输出一样。Revert使用黄纸中定义的输出数据o,它可以用于消息调用,但对于事务则被忽略。
消息调用还有一个额外的组件--字节数组o表示的输出数据。这在执行事务时被忽略,但是由于VM代码的执行,消息调用可以启动,在这种情况下,这种信息被使用。
还原操作码的效果由公式140给出,该公式引用输出o。
但是,混合显示了使用JavaScript VM时的输出,因为它同步执行事务:
pragma solidity^0.4.11;
contract C {
function testRevert() pure public returns (uint result) {
uint memOffset;
assembly {
memOffset := msize() // Get the highest available block of memory
mstore(add(memOffset, 0x00), 6) // Set value
mstore(0x40, add(memOffset, 0x20)) // Update the msize offset to be our memory reference plus the amount of bytes we're using
revert(memOffset, 0x20) // revert returning 1 byte
}
}
}解码产出:
{
"0": "uint256: result 6"
}在testnets或mainnet上执行时,没有输出。
当使用低级别程序集call、delegatecall、callcode时,应该可以读取还原输出(只要有一个工作代码示例,我就会更新这个答案)。
我预计,当使用try-catch-like特性的call、delegatecall、callcode和通过接口调用契约时(每当我有引用时将更新答案),它的功能将是可靠的。
https://ethereum.stackexchange.com/questions/40993
复制相似问题