如何在固体中"tightly packed"数组



我正在尝试创建一个数组的哈希(sha256),但我不明白它是如何工作的。

例如:

pragma solidity 0.4.11;
contract test { bytes32 public hash; bytes32 public hash2; bytes32 public hash3; bytes32 public hash4;
function test () {
    address[2] memory _add;
    _add[0] = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
    _add[1] = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
    hash = sha256(_add[0],_add[1]);
    hash2 = sha256(_add);
    _add[0] = 0;
    _add[1] = 0;
    hash3 = sha256(_add[0],_add[1]);
    hash4 = sha256(_add);
}

哈希与hash2和hash3不同于hash4 ...为什么?

"紧密包装"的数据应导致相同的哈希...否?

最好,

实际上,问题是数组的所有元素都转换为bytes32(添加零的填充)...

基本上:

哈希之前的数据= CA35B7D915458EF540ADE6068DFE2F44E8FA733CCA35B7D915458F5454540ADE6068DFE2FFE2F44EE8F44E8FA733C

哈希之前的数据

"紧密包装"在处理数组时不再适用。您必须将其调整为32个字节。

不幸的是,我找不到可以验证它的文档,所以我所能做的就是举例说明它有效。

旁注:您确定要sha256而不是keccak256,它在以太坊中使用了大多数其他位置?

demo

我将用sha3演示(与keccak256相同),但是概念是相同的。

基线

在混音中,您会发现:

sha3([0xca35b7d915458ef540ade6068dfe2f44e8fa733c, 0xca35b7d915458ef540ade6068dfe2f44e8fa733c]);

给出结果:0x77e5189111eb6557e8a637b27ef8fbb15bc61d61c2f00cc48878f3a296e5e0ca

重建,使用web3.py

from web3 import Web3, IPCProvider
web3 = Web3(IPCProvider())
addr = 'ca35b7d915458ef540ade6068dfe2f44e8fa733c'
zerofilled = addr.zfill(64)  # 64 hex chars == 32 bytes
two_packed = zerofilled * 2
sha = web3.sha3('0x' + two_packed, encoding='hex')
assert sha == '0x77e5189111eb6557e8a637b27ef8fbb15bc61d61c2f00cc48878f3a296e5e0ca'

对于它的价值,您也可以通过以下方式获得结果:

web3.soliditySha3(
  ['address[2]'],
  [[
    '0xca35b7d915458ef540ade6068dfe2f44e8fa733c',
    '0xca35b7d915458ef540ade6068dfe2f44e8fa733c',
  ]],
)

最新更新