Transactions

什麼是默克爾根?

  • November 6, 2019

比特幣維基詞彙文章解釋了默克爾根存在的原因:

每筆交易都有一個與之關聯的雜湊。在一個區塊中,區塊中的所有交易雜湊本身都經過雜湊處理(有時是多次——確切的過程很複雜),結果就是 Merkle 根。換句話說,默克爾根是區塊中所有交易的所有雜湊值的雜湊值。Merkle 根包含在塊頭中。使用這種方案,可以通過僅下載微小的塊頭和 Merkle 樹來安全地驗證交易是否已被網路接受(並獲得確認的數量)——無需下載整個區塊鏈。此功能目前未在比特幣中使用,但將來會使用。

如何檢查交易是否僅使用 Merkle 根進行驗證?該機制如何運作?

這個想法(據我所知)是 Merkle 樹允許您根據需要驗證交易,而不是將每個交易的主體包含在塊頭中,同時仍然提供一種驗證整個區塊鏈的方法(因此是工作量證明) ) 在每筆交易中。

要理解這一點,首先要了解樹的概念。考慮一個 8 個事務塊。想像一下金字塔底部的這 8 個交易中的每一個:這些交易稱為葉子。在金字塔的第二層放置四個“分支”,並從每個分支到葉子畫兩條線,以便每個分支都附有兩片葉子。現在將這四個分支連接到金字塔第 3 層上的兩個分支和金字塔頂部的一個分支(稱為樹的根)。(在這個例子中,我們的樹是倒著生長的。)

現在我們可以開始了解散列過程了。散列“葉子”的雜湊值,並將其作為這些葉子附加到的第二級分支的一部分(這些稱為子節點和父節點)。現在散列這些散列的散列,並將其作為第三級分支的一部分。等等。(如果您有超過 8 筆交易,您所需要的只是金字塔的更多級別。)

所以現在你有一個根節點,它有效地有一個雜湊來驗證所有交易的完整性。如果添加/刪除或更改一個事務,它將更改其父事務的雜湊。這將改變其父節點的雜湊值,依此類推,從而導致根節點的雜湊值(即 Merkle 根)也發生變化。

那麼這如何幫助我們不必擁有整個區塊鏈呢?因為我們可以根據需要驗證交易。如果我們有一個聲稱來自 #234133 塊的交易,我們可以獲取該塊的交易,驗證 Merkle 樹,並知道該交易是有效的。我們可以做到這一點,而不必知道 #234132 或 #234134 中的所有交易,因為我們知道這些塊是防篡改的。

更好的是,如果我們知道它在 Merkle 樹中的位置並且我們知道分支的雜湊值,我們甚至不需要來自 #234132 的所有事務。(那個區塊中有 868 個。)我們只從我們的交易及其兄弟(如果有的話)開始,計算這兩者的雜湊值並驗證它是否與預期值匹配。從那裡我們可以要求它的兄弟分支併計算它的雜湊並驗證它。並繼續這個過程,上樹。868 筆交易只需要十次驗證。(這是樹的一大優點,它們可以用相對較少的層數保存很多值。)

我們怎麼知道這些數據的來源沒有對我們撒謊?因為散列函式是單向的,所以欺騙方無法猜測一個值,該值將與我們的倒數第二個值進行散列以創建 Merkle 根。(我們從經過驗證的區塊鏈中知道這一點。)這種推理在樹的下方更進一步:沒有辦法創建一個可以散列到我們預期值的假值。另一種思考方式是,即使在樹的基礎上對事務進行一次更改,也會導致其分支中節點的所有雜湊值一直到根的雜湊值發生波動變化。

簡而言之,Merkle 樹創建了一個單一的值來證明其下所有交易的完整性。中本聰本可以在比特幣標頭中包含所有交易的大列表的雜湊值。但是,如果他這樣做了,那將需要您對整個交易列表進行雜湊處理,以驗證其完整性。通過這種方式,即使有大量事務,您需要做的工作(以及您需要請求/下載的雜湊數)以驗證完整性也只是 log(O)。

[與往常一樣,請隨時編輯。這主要是我從規範中推斷出來的。]

引用自:https://bitcoin.stackexchange.com/questions/10479