繁体   English   中英

具有数组输出的以太坊合约的 web3py ABI 必须是什么样子?

[英]How does a web3py ABI for an ethereum contract with array outputs have to look like?

我必须对属于以太坊合约的未记录的 function 的 ABI 进行逆向工程。

这是原始的 output 分成 256 位块的样子:

'0000000000000000000000000000000000000000000000000000000000000060' # unknown
'0000000000000000000000000000000000000000000000000000000000000220' # unknown
'00000000000000000000000000000000000000000000000000000000000003e0' # unknown
'000000000000000000000000000000000000000000000000000000000000000d' # 13, the array size
'0000000000000000000000000000000000000000000000000000000000000001' # array of quantities
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'0000000000000000000000000000000000000000000000000000000000000001'
'000000000000000000000000000000000000000000000000000000000000000d' # 13, the array size
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251' # array of addresses
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000a96760f0efa3a9bc2388915d045acd4da9e23251'
'000000000000000000000000000000000000000000000000000000000000000d' # 13, the array size
'0000000000000000000000000000000100000000000000000000000000000405' # array of indices
'0000000000000000000000000000000d00000000000000000000000000000409'
'0000000000000000000000000000000d0000000000000000000000000000040b'
'0000000000000000000000000000001c000000000000000000000000000003a7'
'0000000000000000000000000000001c000000000000000000000000000003a8'
'00000000000000000000000000000064000000000000000000000000000003f2'
'00000000000000000000000000000067000000000000000000000000000003b0'
'00000000000000000000000000000070000000000000000000000000000003c4'
'000000000000000000000000000000850000000000000000000000000000038e'
'0000000000000000000000000000008e000000000000000000000000000003ea'
'0000000000000000000000000000009a000000000000000000000000000003d6'
'0000000000000000000000000000009d000000000000000000000000000003a2'
'0000000000000000000000000000009d000000000000000000000000000003a3'

数组大小不同。 大多数电话都是 1。 这是我使用的 ABI:

abi = {"constant":True,"inputs":[{"internalType":"uint256","name":"dataIndex","type":"uint256"}],
    "name":"getData", "outputs":[{"internalType":"uint256","name":"parameter0","type":"uint256"},
                                 {"internalType":"uint256","name":"parameter1","type":"uint256"},
                                 {"internalType":"uint256","name":"parameter2","type":"uint256"},
                                 {"internalType":"uint256","name":"amountArraySize","type":"uint256"},
                                 {"internalType":"uint256","name":"amount","type":"uint256"},
                                 {"internalType":"uint256","name":"addressArraySize","type":"uint256"},
                                 {"internalType":"address","name":"address","type":"address"},
                                 {"internalType":"uint256","name":"indexArraySize","type":"uint256"},
                                 {"internalType":"uint256","name":"index","type":"uint256"}],
    "payable":False, "stateMutability":"view", "type":"function"},

只要所有数组大小都是 1,这就可以正常工作。但是当 arrays 更大时,它只会用第一个数组的值填充所有 output 字段并丢弃 rest。

我查看了其他合约的 ABI,对于 arrays,只是将[]添加到类型名称中。 但是将输出更改为

[
    {"internalType":"uint256","name":"parameter0","type":"uint256"},
    {"internalType":"uint256","name":"parameter1","type":"uint256"},
    {"internalType":"uint256","name":"parameter2","type":"uint256"},
    {"internalType":"uint256","name":"amountArraySize","type":"uint256"},
    {"internalType":"uint256[]","name":"amount","type":"uint256[]"},        #changed
    {"internalType":"uint256","name":"addressArraySize","type":"uint256"},
    {"internalType":"address[]","name":"address","type":"address[]"},       #changed
    {"internalType":"uint256","name":"indexArraySize","type":"uint256"},
    {"internalType":"uint256[]","name":"index","type":"uint256[]"}          #changed
] 

只引发web3.exceptions.BadFunctionCallOutput: Could not decode contract function call to getData with return data:

我查看的其他带有 arrays 的 ABI 在 output 列表中没有大小字段,所以我猜它是隐式的。 所以我删除了这些行:

[
    {"internalType":"uint256","name":"parameter0","type":"uint256"},
    {"internalType":"uint256","name":"parameter1","type":"uint256"},
    {"internalType":"uint256","name":"parameter2","type":"uint256"},
    {"internalType":"uint256[]","name":"amount","type":"uint256[]"},       
    {"internalType":"address[]","name":"address","type":"address[]"},       
    {"internalType":"uint256[]","name":"index","type":"uint256[]"}
]        

但它仍然会引发相同的错误。

output 和输入 arrays 的正确 ABI 声明是什么?

前 3 个返回值是二进制返回数据中 3 个 arrays 的起始位置。 这些也是隐式的,不需要在 output 字段中声明。

删除前 3 行也修复了错误,web3py 现在可以正确返回大于 1 的 arrays 的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM