Go-Ethereum
在 Merkle Patricia Trie 中編碼路徑僅包含十六進制前綴的葉節點
葉節點定義為元組
$$ encodedPath, value $$,並且 encodedPath 使用 Hex-Prefix 編碼。是否有可能我們有一個葉節點,其編碼路徑僅包含前綴且不包含部分路徑? 獲取以下數據…
<5e 52> : 'val1' <ac 40> : 'val2' <ac 4f> : 'val3'
…特里會看起來像這樣還是我錯了?
rootHash: [ <>, <>, <>, <>, <>, hashA, <>, <>, <>, <>, hashB, <>, <>, <>, <>, <>, <> ] hashA: [ <3e 52>, 'val1' ] hashB: [ <00 c4>, hashC ] hashC: [ hashD, <>, <>, <>, <>, <>, <>, <>, <>, <>, <>, <>, <>, <>, <>, hashE, <> ] hashD: [ <20>, 'val2' ] hashE: [ <20>, 'val3' ]
注意
rootHash
和hashC
是分支節點;hashB
是擴展節點;和hashA
,hashD
和hashE
是葉節點。我的疑問hashD
與hashE
編碼路徑有關。如果我理解20
在 HP 編碼中放置一個具有均勻路徑長度(在這些情況下為 0)的葉節點是正確的,應該得到前綴2
和一個額外的0
填充半字節。
我以與您相同的格式建構了 trie(鑑於https://github.com/ethereum/wiki/wiki/Patricia-Tree中的資訊),這導致我得到相同的結果。回答您的問題:是的,如果葉節點在部分路徑中不包含進一步的半字節,則以前綴 20 結束它(如您所寫,2 表示路徑中的偶數半字節計數,0 表示填充)並且沒有進一步的路徑。
編碼路徑將儲存為字節數組。該算法的工作原理如下:給定一個編碼路徑b作為字節數組:
# Python style code flag = b[0] & 0xF0 nodetype = flag & 0x2 parity = flag & 0x1 partial_path = [] # parity odd? if parity: partial_path.append(b[0] & 0x0F) # append all other bytes from the encoded path (or do nothing if there is no encoded path) for item in b[1:]: partial_path.append(item) # extension node if not nodetype: # do stuff ... # and so on