Private-Blockchain

Merkle Tree 如何獲取根節點雜湊(來自“了解乙太坊樹”的範例)?

  • November 27, 2017

我閱讀了Understanding the ethereum trie並嘗試從那篇文章中做例子。現在我在ex1.py- 首先是例子。查看該範例中的程式碼:

import sys
sys.path.append('src')
import trie, utils, rlp

#initialize trie
state = trie.Trie('triedb', trie.BLANK_ROOT)
state.update('\x01\x01\x02', rlp.encode(['hello']))
print 'root hash', state.root_hash.encode('hex')
k, v = state.root_node
print 'root node:', [k, v]
print 'hp encoded key, in hex:', k.encode('hex')

繞行後:

state.update('\x01\x01\x02', rlp.encode(['hello']))

我看到了程式碼state.root_hash是如何創建的,例如:

15da97c42b7ed2e1c0c8dab6a6d7e3d9dc0a75580bbc4f1f29c33996d1415dcc

我得到另一個,但不明白如何得到它。誰能解釋我?

所以我們有:

key = pack_nibbles(with_terminator('\x01\x01\x02')
value = rlp.encode(['hello'])

我們是怎麼得到的state.root_hash

我讀程式碼不好:當我們得到

key = pack_nibbles(with_terminator('\x01\x01\x02')
value = rlp.encode(['hello'])

這相當於:

key = '\x01\x01\x02'
value = '\xc6\x85hello'

這個值像[key, value]pair in一樣儲存root_node。然後我們得到root_node(例如rlp(['\x01\x01\x02', \xc6\x85hello']))的常見RLP。並在新值的 key = sha3 下獲取 LevelDB 中新入口行的密鑰:

// one line in DB with
key:   '̈́ �ƅhello
value: 'J[�Q�H+�� ���^�$q�b�����*{'

這相當於:

key:   [' \x01\x01\x02', '\xc6\x85hello']
value: '4a5b19d151e796482b08a1e020f1f7ef5ea7240c0171fd629598fee612892a7b'

我們得到的這個值trie.py,第 151 行,func get_root_hash:

def get_root_hash(self):
   #...
   val = rlp.encode(self.root_node)
   key = utils.sha3(val)
   self.db.put(key, val)
   return key

所以我們得到了state.root_hash

引用自:https://ethereum.stackexchange.com/questions/31802