如何在Solidity中“紧密包装”数组

时间:2017-09-12 12:18:05

标签: sha256 sha ethereum solidity

我正在尝试创建一个数组的哈希(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);
}

hash与hash2不同,hash3与hash4不同...为什么?

“紧密打包”数据应该导致相同的散列...没有?

最佳,

2 个答案:

答案 0 :(得分:1)

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

基本上是这样的:

哈希之前的数据= ca35b7d915458ef540ade6068dfe2f44e8fa733cca35b7d915458ef540ade6068dfe2f44e8fa733c

hash2之前的数据= 000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c

hash3之前的数据= 0000000000000000000000000000000000000000000000000000000000000000000000000000000000

hash4之前的数据= 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

答案 1 :(得分:0)

"紧密包装"处理数组时不再适用。你必须zerofill到32个字节。

不幸的是,我找不到要验证的文档,所以我只能举一个例子来证明它有效。

旁注:您确定需要keccak256代替sha3吗?这是在以太坊中大多数其他地方使用的?

演示

我将使用keccak256演示(与sha3([0xca35b7d915458ef540ade6068dfe2f44e8fa733c, 0xca35b7d915458ef540ade6068dfe2f44e8fa733c]); 相同),但概念是相同的。

<强>基线

在混音中,你会发现:

0x77e5189111eb6557e8a637b27ef8fbb15bc61d61c2f00cc48878f3a296e5e0ca

给出结果: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.py重建

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

对于它的价值,你也可以得到结果:

{{1}}