首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用同一个合同中的函数

调用同一个合同中的函数
EN

Ethereum用户
提问于 2023-01-31 09:36:59
回答 1查看 50关注 0票数 2

我有一个包含函数onTokenTransfer(address _sender, uint256 _fee, bytes memory _data)的合同,当我使用ERC-677函数transferAndCall传输一些ERC-20令牌时,我的合同触发逻辑中的函数onTokenTransfer调用了我的合同中的另一个函数,为此我找到了两个备选方案:

第一个:

我用低级电话:

代码语言:javascript
复制
function onTokenTransfer(
    address _sender,
    uint256 _fee,
    bytes memory _data
) public {
    require(_fee >= fee, "NOT ENOUGH FUNDS");
    (bool success, ) = address(this).call(_data);
    require(success, "NOT SUCCESS");
}

但我发现,出于不同的原因,我不得不尽可能少地使用它。

第二个:

解码数据,然后调用我的函数:

代码语言:javascript
复制
function onTokenTransfer(
    address _sender,
    uint256 _fee,
    bytes memory _data
) public {
    require(_fee >= fee, "NOT ENOUGH FUNDS");

    myFunction(parameter); // for this i have to decode data to get the parameter value
    require(success, "NOT SUCCESS");
}

这两者之间的最佳解决方案是什么,如果是第二个解决方案,如何解码数据以获得参数值?谢谢

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-01-31 13:28:26

只要有可能,就应该在契约中指定要调用的函数,以减少攻击面。否则,攻击者可能会以意想不到的方式调用您的契约。

如果您总是调用同一个契约函数,您只需将编码的函数参数传递给transferAndCall,然后使用abi.decode方法在契约中对它们进行解码。

如果希望能够调用多个函数,则必须首先删除调用数据的前4个字节,因为这表示函数选择器。您可以按以下方式单独使用slice字节:

代码语言:javascript
复制
function slice(bytes calldata _data) external pure returns(bytes calldata){
    return _data[4:];
}

然后解码剩下的函数参数,如上面所示。

或者,如果您知道输入值,则可以通过将_data与用encodeWithSelector方法构造的预期calldata进行比较来检查输入数据是否正确,然后进行低级别调用。

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

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

复制
相关文章

相似问题

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