给定块头的RLP,如何获得块哈希?
https://github.com/ethereum/go-ethereum/blob/master/core/types/block.go#L99
上面的链接是:哈希返回报头的块哈希,这就是它的RLP编码的keccak256哈希。
使用本例中的值(https://github.com/ethereum/tests/blob/develop/BlockchainTests/bcRandomBlockhashTest/randomStatetest109BC.json#L30),我尝试在这里获取RLP值,在其上应用Keccak256函数,并查看是否可以返回上述哈希值。
示例:- rlp:"0xf90267f901fca09d6563c8b.............................47d2e96bfdffc0",Hash:"0xc061b982e871fb4a41bfee1a4e6aa859df15ac44bdc23643cb072c4d2b9e7ba1“
给定块头RLP,我无法重新创建上述块哈希值。请给我任何建议。
发布于 2019-02-19 23:09:10
下面是计算blockHash的步骤,给定一个blockNumber:
Step1。eth.getBlock(400000)
输出:{ hash:'6022643743806',extraData:'0xd583010202844765746885676f312e35856c696e7578',gasLimit: 3141592,gasUsed: 0,hash:'0x5d15649e25d8f3e2c0374946078539d200710afc977cdfc6a977bd23f20fa8e8',logsBloom:'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',miner:‘0x2a65Aca4D5fC5C8590a6c34d164135398226’,mixHash:'0x3fbea7af642a4e20cd93a945a1f5e23bd72fc5261153e09102cf718980aeff38',nonce:'0x6af23caae95692ef',编号: 400000,parentHash:'0x1e77d8f1267348b516ebc4f4da1e2aa59f85f0cbd853949500ffac8bfc38ba14',receiptsRoot:'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',sha3Uncles:'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',size: 539,mixHash:'2014130882275463845',transactions:[],parentHash:en8 en8 en8#叔叔们:[] }
上面的对象中的散列引用了我们正在尝试验证的blockHash。这是实际的输出,稍后将用于比较测试结果。
Step2。从上面的对象中删除一些元素,只保留那些输入到blockHeader中的元素,然后按如下方式重新排序:
[‘'ParentHash','0x1e77d8f1267348b516ebc4f4da1e2aa59f85f0cbd853949500ffac8bfc38ba14’,‘'UncleHash','0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347’,“‘Coinbase”,’0x2a65Aca4D5fC5B5C8590a6c34d164135398226‘,“”,‘0x0b5e4386680f43c224c5c037efc0b645c8e1c3f6b30da0eec07272b4e6f8cd89‘根,‘'TxHash','0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,‘'ReceiptHash','0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,“”,‘0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000‘布鲁姆,“困难”,6022643743806,“号码”,“0x400000”,“GasLimit”,3141592,“GasUsed”,0,“时间”,1445130204,“”,‘0xd583010202844765746885676f312e35856c696e7578‘额外,‘'MixDigest','0x3fbea7af642a4e20cd93a945a1f5e23bd72fc5261153e09102cf718980aeff38’,“无”,“0x6af23caae95692ef”]
Step3。将带有数字的值转换为十六进制
console.log(web3.utils.toHex(gasLimit));
console.log(web3.utils.toHex(gasUsed));
console.log(web3.utils.toHex(time));
console.log(web3.utils.toHex(difficulty));
console.log(web3.utils.toHex(number));Step4。对于值为0的元素,请使用0x而不是0x0。
示例:对于块400000,gasUsed的值为0。所以用于gasUsed的值应该是0x,而不是0x0。
Step5。在将数字更改为十六进制并使用0处理值之后,我们可以继续删除Step2中列出的所有键,并调整数组如下:
‘0x1e77d8f1267348b516ebc4f4da1e2aa59f85f0cbd853949500ffac8bfc38ba14’,‘0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347’,‘0x2a65aca4d5fc5b5c8590a6c34d164135398226’,‘0x0b5e4386680f43c224c5c037efc0b645c8e1c3f6b30da0eec07272b4e6f8cd89’,‘0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,‘0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,‘0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’,‘0x57a418a7c3e’,‘0x61a80’,‘0x2fefd8’,‘0x’,‘0x5622‘0x1e77d8f1267348b516ebc4f4da1e2aa59f85f0cbd853949500ffac8bfc38ba14’,‘0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347’,‘0x2a65aca4d5fc5b5c8590a6c34d164135398226’,‘0x0b5e4386680f43c224c5c037efc0b645c8e1c3f6b30da0eec07272b4e6f8cd89’,‘0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,‘0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421’,‘0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’,‘0x57a418a7c3e’,‘0x61a80’,‘0x2fefd8’,‘0x’,‘0x5622’,‘0xd583010202844765746885676f312e35856c696e7578’,‘0x3fbea7af642a4e20cd93a945a1f5e23bd72fc5261153e09102cf718980aeff38’,‘0x6af23caae95692ef‘’,’0xd583010202844765746885676f312e35856c696e7578‘,’0x3fbea7af642a4e20cd93a945a1f5e23bd72fc5261153e09102cf718980aeff38‘,’0x6af23caae95692ef‘
Step6。现在可以将上面的值数组输入到rlp.encode函数中。
输出: 0xf90213a01e77d8f1267348b516ebc4f4da1e2aa59f85f0cbd853949500ffac8bfc38ba14a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942a65aca4d5fc5b5c859090a6c34d164135398226a00b5e4386680f43c224c5c037efc0b645c8e1c3f6b30da0eec07272b4e6f8cd89a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086057a418a7c3e83061a80832fefd880845622efdc96d583010202844765746885676f312e35856c696e7578a03fbea7af642a4e20cd93a945a1f5e23bd72fc5261153e09102cf718980aeff38886af23caae95692ef
Step7。通过keccak256函数传递上述RLP。以下是产出:
TestOutput: 0x5d15649e25d8f3e2c0374946078539d200710afc977cdfc6a977bd23f20fa8e8 ActualOutput: 0x5d15649e25d8f3e2c0374946078539d200710afc977cdfc6a977bd23f20fa8e8
结论:使用eth.getBlock()。以它返回的对象作为输出。删除不需要的元素,只保留那些输入到blockHeader的元素。将数字转换为十六进制,并使用0处理值。重组对象以形成字符串数组。将此数组传递到rlp.encode函数中。获取rlp输出并在其上应用keccak256散列。
链接:https://github.com/ethereum/go-ethereum/blob/master/core/types/block.go#L69
https://ethereum.stackexchange.com/questions/67279
复制相似问题