Merkle-Tree
為什麼是二叉樹?使用二叉樹而不是更高的基數有什麼特別的好處嗎?
比特幣將交易儲存在二叉默克爾樹中。他們需要 O(log2 n) 來遍歷。
如果我使用三叉樹之類的東西,其中每個節點(包括根)引用三個分支/葉子而不是兩個,則遍歷需要 O(log3 n)。為什麼不選擇大於 2 的基數?是因為 SPV 的空間效率,還是類似的原因?
比特幣交易不儲存在 Merkle 樹中。這只是代表他們的一種方式。
塊最常見的序列化只是:
- 標頭(prevhash、merkleroot、時間、隨機數、難度、版本)
- 交易數量
- 所有這些交易的串聯
這種序列化用於 P2P 網路的
block
消息中,以及用於各種軟體實現的磁碟上。存在其他序列化,例如 BIP152 緊湊塊將它們序列化為事務的串聯,其中大多數被替換為短標識符,希望接收者已經擁有它們。Merkle 樹與區塊的承諾結構相關;關於如何從其內容計算塊的雜湊的問題。僅此而已 - 樹從未真正實現過。
這只對一個目的很重要:能夠提供包含區塊中交易的簡短證明。為此,您必須提供交易以及與該交易進行雜湊處理的所有合作夥伴,以便接收者可以遞歸地重新計算父節點,直到他們遇到 merkle 根(他們提前知道)。
如果你使用三元樹會發生什麼?是的,樹中的log(3)/log(2)步數將減少,但對於每個內部節點,您需要提供兩個夥伴雜湊值。使用任何更高的數字只會使頻寬成本變得更糟。
簡而言之:就包含證明大小而言,二叉默克爾樹是最好的。