我正在尝试创建一个数组的哈希(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不同...为什么?
“紧密打包”数据应该导致相同的散列...没有?
最佳,
答案 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}}