3.4 比特幣的區塊

現在,我們已經瞭解了單個交易是如何創建的,但是在第2章裡提到,所有交易都是被打包放入區塊的,為什麼要這麼做呢?其實這是為了性能優化,如果每一個交易都要礦工單獨去達成共識,那整個系統的交易處理速度將會變得非常慢。而如果我們把大量交易組織起來放入一個區塊,得到的哈希鏈就更短,大大提高了驗證區塊鏈數據結構的效率。

區塊鏈(塊鏈)非常聰明地把兩個基於哈希值的數據結構結合起來:第一個數據結構是區塊的哈希鏈,每一個區塊都有一個區塊頭部,裡面有一個哈希指針指向上一個區塊。第二個數據結構是一個樹狀數據結構,也就是以樹狀結構把區塊內所有交易的哈希值進行排列存儲。也叫梅克爾樹(請參考第1章),它以一種非常高效的形式把所有交易組織起來。為了證明某個交易在某個區塊內,可以通過樹內路徑來進行搜索,而樹的長度就是區塊內所包含的交易數目的對數(見圖3.7)。

我們在第2章中提到過(在第5章還將繼續涉及),區塊頭部還包含了挖礦謎題[1]相關的信息。還記得,區塊頭部的哈希函數必須以一大堆零開頭才有效,此外,區塊頭部還要包含一個礦工可以修改的「臨時隨機數」、一個時間戳和一個點數(點數用來表示找到這個區塊的難度)。區塊頭部是挖礦過程中唯一哈希值化的,所以要驗證一個區塊的鏈,只要檢查區塊頭部即可。在區塊頭部唯一的交易數據是交易樹的樹根——「mrkl_root」。

圖3.7 比特幣的區塊鏈有兩個哈希結構

註:一個就是把區塊聯結在一起的哈希鏈,另一個就是區塊內部的交易哈希值梅克爾樹。

每個區塊的梅克爾樹上都有一個有意思的交易,叫作幣基交易(見圖3.8)。這就類似於財奴幣裡的造幣交易。這個交易創造新的比特幣,它看上去像是一個普通的交易,但有幾點不同:

圖3.8 幣基交易

註:幣基交易創造新的比特幣,這個交易並不消費之前交易輸出的比特幣,因此,沒有指針指向「上一交易」。幣基交易的參數可以是任意數據。幣基交易的價值等於區塊獎勵加上區塊中包含的所有交易費。

1.它永遠只有一個單一的輸入與單一的輸出。

2.這個交易並不消費之前交易輸出的比特幣,因此,沒有指針指向「上一交易」。

3.這個輸出值目前大約是25個幣多一點點。這個輸出值就是礦工的挖礦收入。它由兩部分組成:一部分是獎勵的25個比特幣(獎勵在每生產210 000個區塊——大概4年——後減半),另一部分是所有交易的交易手續費。

4.還有一個特別的地方就是「幣基」參數,礦工可以放任何值進去。

這裡值得一提的是,當比特幣的第一個區塊被鑄造出來的時候,該區塊的幣基參數提及了倫敦《泰晤士時報》的一則報道:2009年1月3日,財政大臣拯救銀行。這被看成比特幣發明的政治動機,同時也很好地證明了第一個區塊的打包時間是在2009年1月3日,上述報道出來之後。這也是礦工使用「幣基」參數來支持很多比特幣的不同特性。

想更好瞭解比特幣的區塊和交易結構,最好的辦法是自己瀏覽區塊鏈的數據,有很多網站提供數據,比如blockchain.info,在該網站上可以看到所有交易,以及每筆交易所引用的上一筆交易。由於比特幣的數據都是公開的,一些程序員已經開發出了全圖形化的展現方式。

[1] 也就是競爭記賬權利問題。——譯者注

《區塊鏈:技術驅動金融》