BTC-04比特幣的共識協議

內容整理自 北京大學肖臻老師《區塊鏈技術與應用》公開課 04-BTC-協議

數字貨幣容易產生雙花攻擊 double spending attack

中心化解決double spending:給貨幣制定編號,維護一個大數據庫,用來記錄某編號的貨幣在誰手裏。

去中心化要解決的兩個問題:

1.誰發行?在比特幣中是由挖礦來解決。  

2.驗證交易的有效性,防止double spending attack。那麼如何驗證交易有效性?

與中心化類似,需要維護一個數據結構,記錄某幣是否被消費,被誰消費過。只是這個數據結構由所有用戶共同維護,而不是中心化機構維護,這個數據結構就是區塊鏈

比特幣系統中每個交易都包含輸入和輸出兩部分,輸入部分要說明幣的來源以及付款人的公鑰,輸出部分要給出收款人的公鑰的哈希。

轉賬交易要說明幣的來源,即花掉的幣從哪來的:1.防止幣是憑空捏造的 2.防止double spending.

轉賬交易(A-->B)需要的信息:A的簽名,B的地址。

A需要知道B的地址,比特幣中收款地址是通過公鑰推算出來的,地址相當於銀行賬號,而公鑰是可以公開的,不需要保密。

B需要知道A的公鑰,大家都需要知道,代表A的身份,用來驗籤。

A--->B交易中A的公鑰要與幣的來源中A的公鑰的哈希對得上。如果此時有B’僞造一對公私鑰,冒充A給B轉賬,雖然B'的公鑰能夠驗籤成功,但是該公鑰與幣的來源中公鑰的哈希值對不上,所以無法僞造交易。

圖中一個簡化假設是每一個區塊只有一個交易,實際系統中每個區塊可以包含很多筆交易,這些交易組織成merkle tree。每個區塊分成塊頭 Block header塊身 Block body兩部分。

Block header保存區塊的宏觀信息 Block body保存交易列表
--version比特幣哪個版本的協議 --transaction list
--hash of previous block header指向前一區塊的指針  
--Merkle root hash整個merkle tree的根哈希值  
--target挖礦的難度目標閾值的編碼nBits  
--nonce隨機數  
--timestamp時間戳  

注意:前一個區塊的哈希,算的只是區塊的block header,不包含block body。header中的root hash就已經能保證了body中所包含的交易列表是沒有辦法被篡改的。類似下圖: 

 

另一個簡化假設是每一個節點都會驗證所有交易的合法性。但是實際中,系統中的節點分爲全節點 full node和輕節點 light node。其中,全節點保存所有信息,驗證每一個交易,所以全節點也叫作fully validating node。但是輕節點只保存header,沒法獨立驗證交易合法性以及某交易是否double spending。系統中大部分是light node,full node不是很多。

分佈式共識

上面說的是區塊鏈中所包含的內容,那麼這些內容如何被寫到區塊鏈中?每個節點都可以發佈交易,交易廣播給所有節點,有些交易合法而有些交易非法。那麼誰來決定哪些交易應該被寫到下一個區塊中?按照什麼樣的順序寫?

賬本的內容,要取得分佈式的共識 distributed consensus。分佈式共識一個簡單例子就是分佈式哈希表 distributed hash table。其中要取得共識的內容是key-value pair.

分佈式理論:

1.不可能結論 FLP impossibility result

在一個異步系統 asynchronous中(網絡傳輸延遲無上限),即使只有一個成員有問題 faulty,也不可能取得共識。

2.CAP  Theorem. 

Consisence 一致性/ Avalilability 可用性/ Partition tolerance 分區容錯性。最多滿足兩個,不可能都滿足。

分佈式共識中的一個協議:Paxos協議,保證了一致性

Consensus in BitCoin 比特幣中的共識協議:

該協議要解決的是,有些節點是惡意的,假設系統中大多數節點是好的,有惡意的是少數。

---投票

問題:

1.節點本身有惡意的,不斷地提出非法候選區塊,大家不停地進行投票,造成時間浪費在投票上

2.各別節點不投票,行政不作爲

3.效率問題。網絡延遲,投票等待時間

4.membership問題。確定誰有投票權,不是誰都可以加入,比如聯盟鏈協議 hyperledger facric,只有大公司可以加入,這種情況下基於投票是可行的。但是比特幣系統中創建賬戶很容易,不需要外部批准。惡意節點可以不停地產生賬號,佔據控制權,操縱投票結果,這就是女巫攻擊 sybil attack。所以簡單,直接的投票在比特幣中不可行。

比特幣中投票不是按照賬戶數目,而是按照算力投票。每個節點都可以在本地組裝一個候選區塊,把認爲合法交易放在區塊中,然後開始嘗試各種nonce值,即H(block header) <= target, header中有一個隨機數nonce,組裝好區塊後就開始試隨機數nonce(4 bytes).如果某個節點找到符合要求的nonce,就會獲得記賬權,即往比特幣去中心化的賬本里寫入下一個區塊的權利。只有找到nonce,獲得記賬權,纔有權發佈下一區塊,其他節點收到區塊,驗證合法性,比如驗證header中的內容是否正確,驗證body中每個交易是否都是合法,有合法的簽名,以前也沒有被消費過。

但是,也不是說一個區塊只要經過檢查,header和body中的交易列表都符合要求,就一定會被接受。如圖:

出現分叉的情況: 

如圖,A-->A'的區塊中包含的交易都是合法的,但是插在了區塊鏈中間(根據hash of previous block header判斷區塊位置),比如A先把錢轉給了B,又把錢轉給了自己A',這個交易是合法的,不屬於double spending(驗證double spending是從當前區塊到幣的來源之間,中間的區塊是否有花過這些幣)。A-->A'是想把A-->B的交易回滾掉,把錢再轉給自己,雖然交易合法,但是不在最長合法鏈 longest valid chain中,上面的鏈纔是最長合法鏈。所以在比特幣中,接收的區塊應該是在最長合法鏈中。A-->A'例子其實是分叉攻擊 forking attack,通過往區塊鏈中間位置插入區塊,來回滾某個已經發生過的交易。

正常情況下也會出現分叉,比如兩個節點同時獲得記賬權,這時候會出現兩個等長的分叉,如圖後半部分的分叉,此時這兩個都屬於最長合法鏈。如果出現系統中兩個節點同時發佈區塊,這種等長的,臨時性的區塊會維持一段時間,直到某一個分叉最後勝出(被擴展),另一個被丟棄,叫做orphan block。

通過競爭,爭奪記賬權的好處:

1.獲得記賬權的節點本身有一定的權利,可以決定哪些交易被寫進下一個區塊,但不是主要動力,凡是合法交易都應可以被寫入區塊中。

2.出塊獎勵 block reward。獲得記賬權的節點,在發佈的區塊裏,可以有一個特殊交易,即鑄幣交易 coinbase transaction。在這個交易中可以發佈一定數量的比特幣,這就是開始提到的去中心化要解決的第一個問題:誰來發行比特幣。coinbase transaction是比特幣系統中產生新的比特幣的唯一方法,造幣數量50BTC-->25BTC-->12.5BTC,每21萬個區塊(4年)出塊獎勵都要減半。orphan block中的出塊獎勵無效。

比特幣系統中要取得的分佈式共識是去中心化賬本中的內容,只有獲得記賬權的節點才能往裏寫東西,想要獲得記賬權,就要解puzzle,就是H(block header) <= target。puzzle friendly的性質保證求解puzzle的過程沒有捷徑,只能一個個nonce去試。算力大的節點,獲得記賬權的概率也大,這就是比特幣中投票的特殊性,看每秒鐘能試的nonce的數目,也就是hash rate,它決定投票權重,hash rate越高,獲得記賬權,得到出塊獎勵的概率也就越大。

可以防範sybil attack,因爲投票靠算力,與多少賬戶無關,創建的賬戶多,不會使hash rate增加,投票權重沒變。

比特幣中爭奪記賬權的過程也叫挖礦 mining。把比特幣比作數字黃金 digital gold,礦工 miner就是爭奪記賬權的節點,而區塊就是通過挖礦挖出來的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章