首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果调用使用address.call()失败,如何防止状态完全丢失?

如果调用使用address.call()失败,如何防止状态完全丢失?
EN

Ethereum用户
提问于 2022-03-22 17:25:23
回答 1查看 97关注 0票数 0

代码:

代码语言:javascript
复制
interface MyInterface {
    function functionName(uint256 x, uint256 y, uint256 z) external returns (uint256[] memory k);
}

然后,在我的合同中有以下内容,它使用外部契约addr

代码语言:javascript
复制
MyInterface(addr).functionName(x,y,z);
MyInterface(addr).functionName(x,y,z);
MyInterface(addr).functionName(x,y,z);

如果3个函数调用中的任何一个失败,我希望在那里停止执行,但确保保存了由前一个函数调用引起的任何状态更改。

我多次在以太扫描上看到这样的事务部分执行。据我所知,如果有错误,稳固不会保存任何更改。

在这个答案:当发生抛出时,整个事务会恢复吗?中,有人提到可以使用较低级别的代码。

以下是我正在考虑的解决方案:

代码语言:javascript
复制
addr.call(abi.encodeWithSignature("functionName(uint256, uint256, uint256)",x,y,z));
addr.call(abi.encodeWithSignature("functionName(uint256, uint256, uint256)",x,y,z));
addr.call(abi.encodeWithSignature("functionName(uint256, uint256, uint256)",x,y,z));

如果其中一个调用失败,由prevoius调用引起的先前状态更改是否仍然存在?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-03-23 03:09:19

如果使用低级别函数(如call ),则状态更改将持续存在,您必须显式检查“调用”的返回值,并还原整个事务。

代码语言:javascript
复制
(bool success,) = address.call(.....)
if(!success){
 revert("Failed")
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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