首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >块头rlp中的块散列

块头rlp中的块散列
EN

Ethereum用户
提问于 2019-02-19 00:28:59
回答 1查看 1.3K关注 0票数 2

给定块头的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,我无法重新创建上述块哈希值。请给我任何建议。

EN

回答 1

Ethereum用户

发布于 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。将带有数字的值转换为十六进制

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/67279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档