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

时间:2018-07-11 21:32:24

标签: ethereum

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

   contract simple{

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

    } 

生成的输入数据:-0x3c38b7fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000

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

  • 功能签名:0x3c38b7fd
  • _status值:737461747573,
  • _deliveryID:0c,但我不知道为什么要出现4个,而在737461747573之前加6。
  • 函数“ stringAndUint”的输入为:“ status”,12 有人可以帮我了解输入数据是如何生成的以及如何以十六进制字符串的形式打包的吗?

2 个答案:

答案 0 :(得分:3)

尝试在这里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(功能签名)
  • 0000000000000000000000000000000000000000000000000000000000000000000000000040(第一个参数的数据部分的位置,从参数块开始处以字节为单位)
  • 000000000000000000000000000000000000000000000000000000000000000000000c(12)
  • 0000000000000000000000000000000000000000000000000000000000000000000006(“状态”的长度。此处较早的0..040点)
  • 7374617475730000000000000000000000000000000000000000000000000000000000(“状态”,然后用零填充到32字节的下一个倍数)

答案 1 :(得分:1)

使用什么编码?

Solidity使用"Contract ABI" spec进行编码。

多余的(十六进制)40和6有什么用?

@Brendan关于这些值的答案比我的要好,因此我将删除此部分。因为下面的部分仍然有用,所以我会保留答案。

以编程方式复制

在python中有一个名为eth-abi的ABI解码工具,您可以像这样使用它:

from eth_utils import to_bytes

encoded = to_bytes(hexstr="0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000067374617475730000000000000000000000000000000000000000000000000000")

from eth_abi import decode_abi

decoded = decode_abi(['string', 'uint256'], encoded)

assert decoded == (b'status', 12)