BTC-資料結構

鮑憲立發表於2023-08-03

BTC中的資料結構

普通指標

普通指標儲存的是某個結構體在記憶體中的地址(假如P是指向一結構體的指標,那麼P裡面存放的就是該結構體在記憶體中的起始位置)

image-20230802164519058

Hash pointer(雜湊指標)

對於如下的節點,有兩個指標指向這個節點(實際上是一個),其中P為該節點的地址,H()為該節點的雜湊值,該值與節點中的內容有關。當節點中的內容發生改變,該雜湊值也會發生變化,從而保證了區塊內容不會被篡改。

image-20230802164727482

主要作用

  1. 存地址
  2. 從雜湊值H()這個雜湊指標,可以找到該結構體的位置
  3. 同時還能夠檢測出該結構體的內容有沒有被篡改,因為我們儲存了它的雜湊值

區塊鏈和普通的連結串列相比有什麼區別:

  1. Block chain is a linked list using hash pointers(用雜湊指標代替了普通指標)
  • 比特幣中最基本的結構就是區塊鏈,區塊鏈就是一個一個區塊組成的連結串列
  • 區塊鏈第一個區塊叫作genesis block (創世紀塊)最後一個區塊是most recent block(最近產生的區塊) 每一個區塊都包含指向前一個區塊的雜湊指標,也就是儲存有前一個區塊的雜湊值
  • 雜湊指標的結果是透過對前一個區塊的所有資料進行雜湊運算而得到的。區塊鏈中的每個區塊都包含前一個區塊的雜湊值,以確保區塊鏈的連續性和安全性。如果修改了前一個區塊的資料,其雜湊值也會發生變化,從而影響到之後的所有區塊,這保證了區塊鏈資料的不可篡改性。
  1. 普通連結串列可以任意修改,區塊鏈不行
  • 比特幣沒有要儲存所有區塊的內容,只保留最近的幾千個區塊。如果要用到以前的區塊,可以向系統中其他節點要這個區塊。
  • 判斷惡意節點,這裡要用到雜湊值一個性質:
    其他節點給你一個區塊,算出它的雜湊值,與保留的區塊的雜湊值對比,即可

Tamper-evident log(防篡改 log/區塊鏈)圖示分析

image-20230802172642742

Merkle Tree(默克爾樹)

1、Merkle Tree用雜湊指標代替了普通指標

image-20230802183624230

(上面兩層內部節點都是雜湊指標(Hash Pointers),第一層是根節點,根節點的區塊也可以取雜湊(root hash))。比特幣當中各區塊之間用雜湊指標連線在一起,每個區塊所包含的交易組織成一個Merkle Tree的形式,最下層的資料塊(data blocks)每個區塊是一個交易transaction,每個區塊分為兩個部分,分別是塊頭和塊身(block header,block body)。塊頭裡面有根雜湊值,每個區塊所包含的所有交易組成的Merkle Tree的根雜湊值存在於區塊的塊頭裡面,但是,塊頭裡面沒有交易的具體內容,只有一個根雜湊值,塊身裡面是有交易的列表的。

Merkle Tree的優點

  • 知道根雜湊值,就能檢測出數中任何位置的修改

  • 每個資料塊是一個交易

作用(提供merkle proof )

比特幣中的節點分為兩類

  • fully validating node(全節點,儲存整個區塊的內容,即塊頭塊身都有,有交易的具體資訊)
  • light node(輕節點,例如手機上的比特幣錢包)(只有儲存塊頭,只有根雜湊值)
    • 用merkle proof向一個輕節點證明某個交易是寫入區塊鏈的:找到交易所在的位置(最底行的其中一個區塊),這時該區塊一直往上到根節點的路徑就叫merkle proof。
    • merkle proof可以證明merkle tree裡面包含了某個交易,這種證明又叫proof of membership或 proof of inclusion。
    • 對於一個輕節點來說,驗證一個merkle proof 複雜度是多少?假設最底層有n個交易,則merkle proof 複雜程度是θ(log(n))

證明merkle tree裡面沒有包含某個交易?

即proof of non-membership。可以把整棵樹傳給輕節點,輕節點收到後驗證樹的構造都是對的,每一層用到的雜湊值都是正確的,說明樹裡只有這些輕節點,要找的交易不在裡面,就證明了proof of non-membership,只能一個個節點的驗證,所以時間複雜度是線性O(n)。如果將資料節點的雜湊值排好序之後,時間複雜度是O(logn)。

一般來說,一般的連結串列我們都可以改造為使用雜湊指標的連結串列,但當連結串列中存在環時,雜湊指標便不能再使用,會出現迴圈。

相關文章