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