我們回到兩個人轉賬交易的過程中,去理解比特幣區(qū)塊鏈的數據結構。
我發(fā)起一筆交易,即我向整個區(qū)塊鏈網絡廣播,我和你兩個人想進行這筆交易:我向你的地址中轉入一筆比特幣,無須你的許可。
但只有當這筆交易被打包進最新的比特幣區(qū)塊中時,這筆交易才真正完成。通常來說,當在一筆交易所在的區(qū)塊之后又增加 5 個區(qū)塊,即包括它自己在內一共經過 6 次確認時,這筆交易可認為被完全確認。按比特幣每個區(qū)塊的確認時間 10 分鐘估算,即一筆交易最終確認要經過約 1 小時。
這里包括了兩步:一是交易被打包進候選區(qū)塊,每個節(jié)點可以按規(guī)則生成不同的候選區(qū)塊;二是節(jié)點挖礦成功,候選區(qū)塊被成功地加到區(qū)塊鏈的尾部,成為最新的正式區(qū)塊。
那么,把一筆交易打包進區(qū)塊是什么意思呢?這涉及區(qū)塊鏈最基礎的數據結構,這也是它不可篡改的基礎。
以下討論可能略顯枯燥,但卻是認識比特幣與區(qū)塊鏈的最基礎的知識,我盡量以通俗的語言來解釋。
區(qū)塊鏈之所以被稱為 blockchain,是因為它的數據塊以鏈狀的形式存儲著。從第一個區(qū)塊即所謂的創(chuàng)世區(qū)塊開始,新增的區(qū)塊不斷地被連到上一個區(qū)塊的后面,形成一條鏈條。
每個區(qū)塊由兩個部分組成——區(qū)塊頭部和區(qū)塊數據。其中,區(qū)塊頭部中有一個哈希指針指向上一個區(qū)塊,這個哈希指針包含前一個數據塊的哈希值。哈希值可以被看成是數據塊的指紋,即在后一個區(qū)塊的頭部中均存儲有上一個區(qū)塊數據的指紋。如果上一個區(qū)塊中的數據被篡改了,那么數據和指紋就對不上號,篡改行為就被發(fā)現(xiàn)了。要改變一個區(qū)塊中的數據,對其后的每個區(qū)塊都必須相應地進行修改。
比特幣區(qū)塊鏈設計有一種機制讓這種修改難以發(fā)生,我們稍后在談到“工作量證明”和“比特幣挖礦”時再詳細討論。
一個區(qū)塊中的數據是被打包進這個區(qū)塊的一系列交易。這些交易按照既定的規(guī)則被打包形成特定的二叉樹數據結構——梅克爾樹(Merkle trees)。按目前的比特幣區(qū)塊的大小,一個區(qū)塊中能容納的交易數量在 2000 個左右,比如在第 526957 個區(qū)塊中容納了 1804 個交易。
比特幣區(qū)塊鏈的數據結構中包括兩種哈希指針,它們均是不可篡改特性的數據結構基礎。一個是形成“區(qū)塊+鏈”(block+chain)的鏈狀數據結構,另一個是哈希指針形成的梅克爾樹(見圖 1)。鏈狀數據結構使得對某一區(qū)塊內的數據的修改很容易被發(fā)現(xiàn);梅克爾樹的結構起類似作用,使得對其中的任何交易數據的修改很容易被發(fā)現(xiàn)。