首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解码abi.encodeWithSignature并获取编码值?

如何解码abi.encodeWithSignature并获取编码值?
EN

Ethereum用户
提问于 2023-02-06 23:35:52
回答 1查看 246关注 0票数 0

我正在运行Foundry并试图解码编码的签名,但是在运行下面的代码时,我会得到"EvmError: Revert“错误。这似乎是我用abi.decode做的不正确的事情

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

这是解码编码函数签名的正确方法吗?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-02-07 01:22:09

让我们回顾一下调用abi.encodeWithSignature生成的有效负载。它应包括以下内容:

[4-byte function selector] [32-byte zero-padded address] [32-byte uint256]

它的特别之处在于开头的4字节函数选择器。为了正确地解码有效负载,您需要从其中移除前4个字节。为了能够在基于内存的字节(bytes memory)上执行此操作,您需要使用一个库。但为了演示,我将向您展示如何在基于调用数据的有效负载上执行此操作:

代码语言:javascript
复制
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不可用的特性。

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

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

复制
相关文章

相似问题

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