首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回带有还原的错误代码

返回带有还原的错误代码
EN

Ethereum用户
提问于 2018-02-26 21:12:19
回答 1查看 4.9K关注 0票数 8

根据最新版本的黄纸和实心装配规范,还原操作码可以返回一个错误代码。

http://solidity.readthedocs.io/en/develop/assembly.html

恢复(p,s) -结束执行,恢复状态更改,返回数据mem[p.(p+s)]

然而,纯实体中的还原函数有0个参数。我想它还不支持返回码。

问::如何使用来自Solidity程序集的还原将错误代码传递给调用的web3 JavaScript应用程序?如果这是不可能的,请解释原因。

更新:另见稳固性:我们如何在“要求”中写入错误消息?

EN

回答 1

Ethereum用户

回答已采纳

发布于 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时的输出,因为它同步执行事务:

代码语言:javascript
复制
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
        }
    }
}

解码产出:

代码语言:javascript
复制
{
    "0": "uint256: result 6"
}

在testnets或mainnet上执行时,没有输出。

当使用低级别程序集calldelegatecallcallcode时,应该可以读取还原输出(只要有一个工作代码示例,我就会更新这个答案)。

我预计,当使用try-catch-like特性的calldelegatecallcallcode和通过接口调用契约时(每当我有引用时将更新答案),它的功能将是可靠的。

票数 6
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/40993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档