區塊鏈 默克爾樹 Merkle Tree

2021-08-18 08:38:54 字數 1675 閱讀 9958

merkle tree 也被成為 hash tree,見名思意,這種樹其實就是用來儲存 hash 值的一種樹。關於hash我們在之前的文章已經說過了,對於乙個輸入,都有乙個唯一的長度的固定的輸出,且以我們目前的科技狀況,無法找到兩個不同的輸入使得輸出一樣。

簡單來說就是

y = h(x), y』 = h(x』)

我們無法找到 x != x』, 但 y = y』

從以上這張圖,我可以看出,我們有 n 個資料,分別對這個 n 個資料進行hash之後,可以得 n 個節點。 然後對 n 個節點進行兩兩配對,生成 n/2 個節點,直到只剩下乙個單獨的節點,也即根節點。 時間複雜度是 o(n),這裡的 o(n) 是指做了 n 次 hash,樹的高度是 log(n) + 1。

我們再來看一下位元幣是如何應用默克爾樹,一下這張圖是位元幣的區塊圖

看中間這個區塊,矩形是區塊頭,包含了前乙個節點的hash值(prev hash), 用於工作量證明的隨機值(nonce),區塊時間戳(timestamp),和默克爾樹的根節點(merkle root)。

根據位元幣的設計,它把所有的交易生成一棵默克爾樹,然後節點可以根據自己身情況是否要儲存整棵樹,對於礦工來說,需要儲存整個區塊鏈的資料,然而這是乙個相當大的資料,普通電腦的容量明顯不夠,這時候我們可以選擇只儲存區塊頭,也即只儲存默克爾樹的各節點,捨棄其它子節點,這將極大地減少儲存容量(這個其實就是位元幣輕量級錢包)。

附上用 node.js 實現的 merkle tree

p.s. 雖然我的本命是 c++,但是node.js用起來確實蠻爽的,核心**才30行

/*

* @author: lip wang ([email protected])

* @date: 2018-04-07 19:52:07

*/const sha256 = require("crypto-js/sha256");

const queue = require("../utils/queue.js");

class node

}class merkletree

generatetree(values)

if (!values.length)

let nodes = ;

for (let i in values)

while (nodes.length > 1) else

parents.push(node);

i += 2;

}nodes = parents;

}this.tree = nodes[0];

return

this.tree;

}// displaytree(tree)

// if (item.right)

// }

// }

}module.exports = exports = merkletree;

這裡推薦一篇博文,非常詳細地講解了merkle tree

merkle tree(默克爾樹)演算法解析

默克爾樹是什麼

區塊鏈中的每個區塊 什麼是區塊 都使用默克爾樹來代表區塊中所有交易的摘要。又稱二叉雜湊樹 binary hash tree merkle tree。什麼是merkle樹 merkle樹是一種樹 資料結構中所說的樹 通常稱為merkle hash tree。組成merkle樹的所有節點都是雜湊值。默克...

《區塊鏈寶典》位元幣默克爾根生成演算法及原理

一 默克爾樹 二 默克爾根 一 只有唯一一次鑄幣交易 只有唯一一筆coinbase交易的hash就是默克爾根的hash值 二 默克爾根的生成步驟 將每乙個葉子節點下的分支節點進行兩兩hash,之後大小端顛倒然後拼接到一起,拼接好的資料進行雜湊運算,之後在進行一次大小端顛倒 如下 package ma...

SPV中如何利用默克爾樹證明某個交易是否存在

spv是 simplified payment verification 簡單支付驗證 的縮寫。中本聰 簡要地提及了這一概念,指出 不執行完全節點也可驗證支付,使用者只需要儲存所有的block header就可以了。使用者雖然不能自己驗證交易,但如果能夠從 區塊鏈的某處找到相符的交易,他就可以知道網...