在发送到以太坊网络之前,智能合约函数的输入数据如何打包成十六进制字符串

Aas*_*ali 1 ethereum

我想了解这一点以解析来自私有链交易的数据并获取为特定交易发送的输入数据,我尝试了许多解码器,但在某些时候,它们失败了。这是我尝试使用 remix 的简单智能合约

   contract simple{

     uint256 deliveryID;
     string status;
     function stringAndUint(string _status,uint256 _deliveryID){
               status=_status;
               deliveryID=_deliveryID;
     }

    } 
Run Code Online (Sandbox Code Playgroud)

产生的输入数据: - 0x3c38b7fd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000067374617475730000000000000000000000000000000000000000000000000000

我可以从上面解释以下内容。

  • 函数签名:0x3c38b7fd
  • _状态值:737461747573,
  • _deliveryID:0c 但我不知道为什么 737461747573 之前有 4 个和额外的 6 个。
  • 函数“stringAndUint”的输入是:“status”,12有人能帮我理解输入数据是如何生成的,并以一个长的十六进制字符串分组

Bre*_*dan 5

尝试看看这里http://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#argument-encoding和这里http://solidity.readthedocs.io/en/v0.4.24/abi- spec.html#use-of-dynamic-types

将编码拆分为 32 字节块给出:

  • 3c38b7fd(函数签名)
  • 00000000000000000000000000000000000000000000000000000000000040(第一个参数的数据部分的位置,从参数块的开始以字节为单位)
  • 000000000000000000000000000000000000000000000000000000000000c (12)
  • 000000000000000000000000000000000000000000000000000000000000006(“状态”的长度。这里较早的0..040个点)
  • 737461747573000000000000000000000000000000000000000000000000000(“状态”然后将零填充到下一个32字节的倍数)