Go-Ethereum

在 Merkle Patricia Trie 中編碼路徑僅包含十六進制前綴的葉節點

  • September 3, 2018

葉節點定義為元組

$$ 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' ]

注意rootHashhashC是分支節點;hashB是擴展節點;和hashAhashDhashE是葉節點。我的疑問hashDhashE編碼路徑有關。如果我理解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

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