Wie erhält Merkle Tree Root-Node-Hash (Beispiel aus „Understanding the ethereum trie“)?

Ich habe den Ethereum-Versuch verstehen gelesen und versuche, Beispiele aus diesem Artikel zu machen. Jetzt bin ich bei ex1.py- erstes Beispiel. Sehen Sie sich den Code aus diesem Beispiel an:

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')

nach der Arbeit um die Linie:

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

Ich habe gesehen, wie Code erstellt state.root_hashwird, im Beispiel ist es:

15da97c42b7ed2e1c0c8dab6a6d7e3d9dc0a75580bbc4f1f29c33996d1415dcc

Ich bekomme eine andere, aber nicht verstanden, wie man sie bekommt. Kann mir jemand erklären?

Wir haben also:

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

Wie sind wir davon gekommen state.root_hash?

Antworten (1)

Ich habe Code schlecht gelesen: als wir kamen

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

was gleichbedeutend ist mit:

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

[key, value]Dieser Wert wird als Paar in gespeichert root_node. Dann erhalten wir ein gemeinsames RLP von root_node(z . B. rlp(['\x01\x01\x02', \xc6\x85hello'])). und erhalten Sie den Schlüssel für die neue Eintragszeile in LevelDB unter key = sha3 dieses neuen Werts:

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

was gleichbedeutend ist mit:

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

Diese Werte haben wir in trie.pyZeile 151, func get_root_hash erhalten:

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

also haben wirstate.root_hash