我有一个包含函数onTokenTransfer(address _sender, uint256 _fee, bytes memory _data)的合同,当我使用ERC-677函数transferAndCall传输一些ERC-20令牌时,我的合同触发逻辑中的函数onTokenTransfer调用了我的合同中的另一个函数,为此我找到了两个备选方案:
我用低级电话:
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");
}但我发现,出于不同的原因,我不得不尽可能少地使用它。
解码数据,然后调用我的函数:
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");
}这两者之间的最佳解决方案是什么,如果是第二个解决方案,如何解码数据以获得参数值?谢谢
发布于 2023-01-31 13:28:26
只要有可能,就应该在契约中指定要调用的函数,以减少攻击面。否则,攻击者可能会以意想不到的方式调用您的契约。
如果您总是调用同一个契约函数,您只需将编码的函数参数传递给transferAndCall,然后使用abi.decode方法在契约中对它们进行解码。
如果希望能够调用多个函数,则必须首先删除调用数据的前4个字节,因为这表示函数选择器。您可以按以下方式单独使用slice字节:
function slice(bytes calldata _data) external pure returns(bytes calldata){
return _data[4:];
}然后解码剩下的函数参数,如上面所示。
或者,如果您知道输入值,则可以通过将_data与用encodeWithSelector方法构造的预期calldata进行比较来检查输入数据是否正确,然后进行低级别调用。
https://ethereum.stackexchange.com/questions/144000
复制相似问题