我正在运行Foundry并试图解码编码的签名,但是在运行下面的代码时,我会得到"EvmError: Revert“错误。这似乎是我用abi.decode做的不正确的事情
uint256 internal constant TOKENS_IN_POOL = 1_000_000e18;
address payable internal attacker;
bytes memory approvePaylaod = abi.encodeWithSignature("approve(address,uint256)",address(attacker),TOKENS_IN_POOL);
address payable addressAttacker;
uint256 num;
(addressAttacker,num) = abi.decode(approvePaylaod, (address,uint256));这是解码编码函数签名的正确方法吗?
发布于 2023-02-07 01:22:09
让我们回顾一下调用abi.encodeWithSignature生成的有效负载。它应包括以下内容:
[4-byte function selector] [32-byte zero-padded address] [32-byte uint256]
它的特别之处在于开头的4字节函数选择器。为了正确地解码有效负载,您需要从其中移除前4个字节。为了能够在基于内存的字节(bytes memory)上执行此操作,您需要使用一个库。但为了演示,我将向您展示如何在基于调用数据的有效负载上执行此操作:
pragma solidity 0.8.x;
contract TestArray {
uint256 internal constant TOKENS_IN_POOL = 1_000_000e18;
address internal attacker = 0xBAd0000000000000000000000000000000000Bad;
function encode() public view returns(bytes memory) {
bytes memory approvePaylaod = abi.encodeWithSignature("approve(address,uint256)",address(attacker),TOKENS_IN_POOL);
return approvePaylaod;
}
function decode(bytes calldata approvePaylaod) public pure returns(address,uint256) {
address addressAttacker;
uint256 num;
// `approvePaylaod[4:]` basically ignores the first 4 bytes of the payload
(addressAttacker,num) = abi.decode(approvePaylaod[4:], (address,uint256));
return (addressAttacker,num);
}
}请注意,我使用的是solidityv0.8.x,因为切片调用数据字节是一个旧版本的Solidity不可用的特性。
https://ethereum.stackexchange.com/questions/144414
复制相似问题