BTC 位元幣的共識協議(區塊鏈技術與應用)

2022-09-10 12:48:17 字數 3062 閱讀 1933

怎麼驗證交易的合法性,防止雙花攻擊:由所有使用者來共同維護,這個資料結構是區塊鏈

位元幣系統中每個交易都分為輸入部分和輸出部分輸入部分要給出這筆交易的位元幣的**以及付款方的公鑰,輸出部分要給出收款人的公鑰的雜湊值。位元幣系統中的收款位址就是收款人的公鑰取雜湊再經過一些轉換得到的。

位元幣中的全結點要維護乙個叫utxo的資料結構,即還沒有被花出去的交易的輸出。乙個交易可能有多個輸出,被花掉的就不在utxo裡了。

這裡「說明幣的**」也就防止了雙花攻擊,如在下圖中,b已經將自己的5個位元幣花掉了,假設b嘗試再花一次,將5個位元幣轉給f。這時順著區塊鏈去檢查這個區塊到**交易之間的區塊,發現b已經花了**區塊的位元幣,說明這新個交易是不合法的,也就不會接受這個區塊進入區塊鏈。

a向b轉賬,除了a需要知道b的位址b也需要知道a的公鑰。因為一方面a的公鑰代表a的身份,b要知道轉賬的是誰,另一方面是為了驗證位元幣交易中a的簽名(私鑰簽名公鑰驗證),也就是說所有結點都需要知道a的公鑰才行。

交易的輸入部分和輸出部分實際上都是指令碼,a的公鑰是寫在這筆交易的輸入指令碼裡面。對公鑰的驗證過程,實際上就是把這筆交易的輸入指令碼,和幣的**的交易的輸出指令碼拼在一起,看看能不能順利執行。

在前面的幾張圖里,每個區塊裡只花了乙個交易,實際系統中每個區塊中可以有很多交易,這些交易就組成了上節課學習的merkle tree。

圖中連起來的是塊頭,塊身掛在區塊上,雜湊指標和塊身沒有直接聯絡,間接聯絡就是通過merkle tree的根雜湊建立的

塊頭(block header)

塊頭裡儲存的是區塊的巨集觀的資訊

塊身(block body)

交易列表

全結點(fully validation node)是有塊身的,需要驗證所有交易的合法性

輕結點(light node)是沒有塊身的,沒有辦法獨立驗證交易的合法性。輕結點沒有參與區塊鏈的構造和維護,只是利用了區塊鏈中的部分資訊。

系統中大部分結點是輕結點,全結點不是很多。

分布式系統的一些不可能結論

flp impossibility result:在乙個非同步的系統(asynchronous system)中,網路傳輸的時延沒有上限,即使只有乙個成員是有問題(faulty)的,也不可能取得共識

cap theorem:cap是分布式系統想要的三個性質,consistency(一致性)、**ailability(可用性)、partition tolerance(分割槽容錯性)。而cap theorem是說任何乙個分布式系統中,cap三個性質最多只能滿足其中兩個,不可能三個全滿足。

位元幣中的共識協議

一種思路是用投票的方式,將所有交易寫入乙個候選區塊,然後發給所有結點,大家驗證這個區塊中的交易是不是都是合法的,然後投贊成和反對票,按一定票比通過後將候選區塊寫入區塊鏈中。這種思路的問題是乙個membership的問題,任何基於投票的系統都要考慮誰有投票權,例如hyperledger fabric就是乙個聯盟鏈的協議,規定了誰可以參加。

因為位元幣系統中要產生賬戶只要在本地生成公私鑰對就可以了,所以如果用這種方式,那麼有惡意的人就可以進行女巫攻擊(sybil attack),只要不斷產生賬戶,然後獲取大量的投票權就能控制整個區塊鏈了。

位元幣系統中不是用賬戶來投票,而是用計算力來投票

如果某個結點找到了符合要求的nonce,也就獲得了記賬權——往位元幣去中心化的賬本(區塊鏈)裡寫入下乙個區塊的權力,其它結點收到這個區塊之後,要驗證這個區塊的合法性(如檢查target的編碼nbits域設定的是不是符合位元幣協議規定的難度要求、檢查帶nonce的塊頭雜湊值是不是小於target、檢查塊身中的每個交易是否都有合法的簽名、檢查每個交易都沒有雙花等)

分叉攻擊(forking attack):通過往區塊鏈中間位置插入區塊,來回滾某個已經發生了的交易。這樣乙個候選區塊檢測其內容是合法的,但不應當被接受。

如下圖,c轉賬給a,a將這些位元幣轉給b,然後a又發起了一次交易把位元幣轉給自己,這個交易的候選區塊在下面,它希望掛在如圖的(分支上)。這裡其實a所做的相當於將a轉給b這個交易回滾了,僅僅做雙花的檢查會發現這兩個分支都是沒問題的,但如果接收了,那麼在這個分支上a又獲得了轉給b的那些位元幣。

如何知道某個區塊是插入在哪的?塊頭有指向前乙個區塊塊頭的雜湊指標,通過這個雜湊指標就能判斷了。

接受的區塊應當是在擴充套件最長合法鏈(longest valid chain):區塊鏈在正常執行下也會出現分叉。如兩個人在差不多相同的時間都發布了合法區塊,就可能出現分叉。這種等長的,多條最長合法鏈(分支)的情況會維持一段時間,直到某個分支勝出,另乙個分支就成為了orphan block被丟棄掉

這裡,部分結點接受上面那個區塊,部分結點接受下面那個區塊(如果乙個結點收到乙個區塊後,沿著這個區塊繼續往下擴充套件,那麼就算該結點接受了這個區塊),然後他們競爭,誰先找到下乙個結點,最終形成乙個共識的最長合法鏈。

激勵機制:出塊獎勵(block reward)

共識協議取得的共識:位元幣系統中,共識協議取得的共識是去中心化的賬本裡的交易**。

位元幣 位元幣中的共識協議

在位元幣系統中,hash指標有兩個用途 指向前乙個區塊和指向某筆交易。位元幣支付過程中,每筆交易都必須包含輸入和輸出。在交易時,首先會從區塊中驗證交易輸入,驗證通過後才會執行交易輸出。這一步可以防止 雙花 攻擊。區塊鏈是乙個去中心化的分布式賬本,既然是分布式,那就需要網路中的各個節點對賬本資訊達成共...

位元幣 區塊鏈

區塊鏈 一種實時記錄全部交易的去中心化公開資料 庫,在區塊鏈上進行支付時全網計算機共同查詢區塊鏈資料,共同驗證這筆支付交易是否有效。確認支付後將寫入區塊鏈並產生一條不可篡改記錄。區塊 區塊大小是1m,包含父雜湊 merkle根 時間戳 難度目標 隨機數。程式上近似每10分鐘增加乙個block,blo...

區塊鏈系列教程之 位元幣中的共識

目錄總結 在位元幣的p2p網路中是怎麼達成共識的呢?達成共識需要做哪些交易的校驗呢?交易和區塊是怎麼傳播到整個區塊鏈網路的呢?看完這篇文章你就明白了。之前我在講分布式系統的時候有講過分布式系統的幾個共識演算法,包括raft,paxos和拜占庭容錯演算法。位元幣的共識和之前講的都不同,它使用的是工作量...