Merkle樹與SPV驗證

Merkle Tree,也叫哈希樹,是由Ralph Merkle於1979年提出申請的專利。它是一種用做快速歸納和校驗大規模數據完整性的樹形數據結構。

它具有以下特點:

它是一種樹,大多數是二叉樹,也可以是多叉樹,具有樹結構的所有特點。

Merkle Tree的葉子節點是數據塊的哈希。

Merkle Tree的非葉子節點的哈希值是根據它下面所有葉子節點的值哈希計算得到,如下圖所示。

備註:如果最開始葉子節點是奇數個,可以複製最後一個葉子節點,湊成偶數個

可以發現,只要存儲的葉子節點數據有任何的變動,就會逐級向上傳遞到相應的父節點,最終使得Merkle樹的根節點哈希值發生變化。

3.Merkle樹的應用

Merkle樹的應用場景有以下幾種:

快速比較大量數據:當兩個Merkle樹的根哈希值相同時,說明所代表的的數據都相同

快速定位修改:如上圖,如果交易C發生改變,那麼就會導致N2、N5和Merkle Root發生改變。所以,我們想要快速定位,只需要沿着Root==>N5==>N2就可以定位到交易C發生改變。

 零知識證明:例如,想要證明一組交易中包含某個交易A,但又不想讓對方知道交易A的具體內容,那麼就可以構建Merkle樹(如上圖),向對方公佈N0、N1、N4和Root,對方就可以確認交易A的存在,但無法知道交易A的具體內容。

那麼,從用戶A在購買商品時通過比特幣支付,並聲稱自己已經轉了1BTC給商家,到商家驗證支付有效(SPV驗證),這個過程是怎樣的呢?

SPV驗證

       用戶A在購買商品時通過比特幣支付,並聲稱自己已經轉了1BTC給商家,到商家驗證支付有效(SPV驗證),這個過程是怎樣的呢?

第一步:SPV節點如果只關心某個支付到自己比特幣地址的交易,則可以通過建立布隆過濾器(布隆過濾器是一種基於哈希的高效查找結構,能夠快速確定某個元素是否在一個集合內)限制只接收含有目標比特幣地址的交易。

第二步:一旦比特幣網絡中其他當節點探測到某個交易符合SPV節點設置的布隆過濾器條件時,其它節點將以Merkleblock消息的形式發送該區塊,Merkleblock消息包含區塊頭和一條連接目標交易與Merkle根的Merkle路徑。

第三步:接下來,SPV節點需要驗證交易,需要做2個檢查,分別是:交易的存在性檢查和交易是否重花的檢查。

第四步:SPV節點通過該Merkle路徑找到跟該交易相關的區塊,並驗證對應區塊中是否存在目標交易。SPV節點所收到的Merkleblock數據量通常少於1KB,只有一個完整區塊(大約1MB)大小的千分之一左右。

第五步:現在通過Merkle Path Proof,SPV節點確認了交易確實存在於區塊鏈中,但是這個還是無法保證這筆交易(Transaction)的Input(引用的上一筆UTXO)沒有被重花(雙重支付)。這時候SPV節點通過去看這筆交易所在區塊之後的區塊個數,Block個數越多說明該區塊被全網更多節點共識,一般來說,一筆交易所屬區塊之後的區塊個數達到6個時,就說明這筆交易是被大家覈准過(達成共識)的,沒有重花,而且被篡改的可能性也很低
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章