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就可以了。使用者雖然不能自己驗證交易,但如果能夠從 區塊鏈的某處找到相符的交易,他就可以知道網...