2、 BTC-數據結構
普通指針:
- 存地址、存儲的是某個結構體在內存中的地址(假如P是指向一結構體的指針,那麼P裏面存放的就是該結構體在內存中的起始位置)
哈希指針:
- 存地址
- 從哈希值H()這個哈希指針,能夠找到該結構體的位置
- 同時還可以檢測出該結構體的內容有沒有被篡改,由於咱們保存了它的哈希值
區塊鏈和普通的鏈表相比有什麼區別:
-
Block chain is a linked list using hash pointers(用哈希指針代替了普通指針)node
- 比特幣中最基本的結構就是區塊鏈,區塊鏈就是一個一個區塊組成的鏈表
- 區塊鏈第一個區塊叫做genesis block (創世紀塊)最後一個區塊是most recent block(最近產生的區塊) 每個區塊都包含指向前一個區塊的哈希指針
- 一個區塊的哈希指針怎麼算:是把前面整個區塊的內容,包括裏面的hash pointer ,合在一塊兒取哈希值。經過這種結構,能夠實現tamper-evident log。若是有人改變了一個區塊的內容,後面一個區塊的哈希指針就對不上,由於後一個區塊哈希指針是根據前一個區塊的內容算出來的,因此後一個哈希指針也得改,以此類推,咱們保留的是最後一個哈希值也會變化
-
普通鏈表能夠任意修改,區塊鏈不行數據結構
- 比特幣沒有要保存全部區塊的內容,只保留最近的幾千個區塊。若是要用到之前的區塊,能夠向系統中其餘節點要這個區塊。
- 判斷惡意節點,這裏要用到哈希值一個性質:
其餘節點給你一個區塊,算出它的哈希值,與保留的區塊的哈希值對比,便可
Tamper-evident log(防篡改 log/區塊鏈)圖例ide

Merkle tree
(上面三層內部節點都是哈希指針(hash pointers),第一層是根節點,根節點的區塊也能夠取個哈希,叫根哈希(root hash))。比特幣當中各區塊之間用哈希指針鏈接在一塊兒,每一個區塊所包含的交易組織成一個merkle tree的形式,最下面一行data blocks每一個區塊其實是一個交易,每一個區塊分爲兩部分,分別是塊頭和塊身(block header ,block body)。塊頭裏面有根哈希值,每一個區塊所包含的全部交易組成的merkle tree的根哈希值存在於區塊的塊頭裏面,可是,塊頭裏沒有交易的具體內容,只有一個根哈希值,塊身裏面是有交易的列表的。
Merkle tree和binary tree 區別 用哈希指針代替了普通指針區塊鏈
優勢
-
知道根哈希值,就能檢測出數中任何位置的修改指針
-
每一個數據塊是一個交易blog
做用(提供merkle proof )
比特幣中的節點分爲兩類:ip
-
fully validating node(全節點,保存整個區塊的內容,即塊頭塊身都有,有交易的具體信息)內存
-
light node(輕節點,例如手機上的比特幣錢包)(只有塊頭)hash
- 用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。問題在於,它的複雜度是線性的θ(n),是比較笨的方法。io
Merkle tree圖例
