-
央行發行數字貨幣(私鑰簽名后發行貨幣,公鑰驗證確實是央行發行的貨幣后完成交易)的挑戰:
??1. 貨幣是一種檔案,檔案內容不能偽造,但可以復制——花兩次攻擊 double spending attack
??2. 中心化方案:央行給每一個數字貨幣編號,則需要維護一個數字貨幣歸屬的資料庫,每一次交易都需要央行的確認, -
去中心化貨幣要解決兩個問題:
??1. 數字貨幣的發行 —— 位元幣的發行是由挖礦決定的
??2. 怎么驗證交易的有效性,防止double spending attack —— 由用戶共同維護區塊鏈的資料結構 -
區塊鏈:
??位元幣的發行者A擁有鑄幣權(Create coin),假如A發行10個位元幣, A(10)分別給B和C各五個,即B(5)C(5), 該交易需要有A的簽名,證明經A同意(Signed by A),同時,還要說明花掉的10個位元幣的來源,有的交易部分比較復雜,如C的貨幣來源是第二第三個方框,要標識清楚,
?? 位元幣系統中每個交易都包含輸入和輸出兩部分, 輸入部分要說明幣的來源,輸出部分要給出收款人公鑰的哈希,相當于地址,
??上圖就構成了一個小型的區塊鏈,有兩種哈希指標:
??1. 第一種哈希指標是連接在各個區塊之間的,把它們串起來構成一個鏈表,
??2. 第二種哈希指標,是指向前面某個交易的指標,用來指明賬戶幣的來源,證明幣不是憑空捏造的是有記錄的,防范double spending,
-
交易合法性驗證:
問題:第二個方框的交易,所有節點都要知道A的公鑰,區塊鏈上每個節點都要獨立驗證該交易中A的簽名,
解決:輸入幣的來源和A的公鑰,且幣來源的交易輸出的A的公鑰哈希值,要與交易時A提供的公鑰哈希相等, -
位元幣腳本(BitCoin Script):
??在位元幣系統當中,前面這些驗證程序,是通過執行腳本來實作的,每個交易的輸入是一段腳本,包括給出公鑰的程序,公鑰也是在輸入的腳本里指定的,每個交易的輸出也是一段腳本,驗證其的合法性,就需要把當前交易的輸入腳本跟前面交易(提供幣來源的交易)的輸出腳本拼在一起,然后看看能不能順利執行,如果能執行說明是合法的, -
區塊:
??實際上每個區塊(對應圖中的每個方框)可以有很多交易,這些交易就組成Merkle Tree,每個區塊分為塊頭和塊身,
Block header包含:
??區塊的宏觀資訊,如:位元幣的版本(version)的協議;
??區塊鏈當中指向前一個區塊的哈希指標(hash of previous block header);
??整顆Merkle tree 的根哈希值(Merkle root hash); —— 保證body中的交易資訊未被篡改
??是挖礦的難度目標預值(target); —— H(Block header)≤target
??亂數nonce,
注意:前一個區塊的哈希值只算前一個區塊的塊頭,
Block body包含: 交易串列(transaction list),
??系統中的節點分全節點(full node)和輕節點(light node),全節點是保存區塊鏈所有的資訊的,驗證每一個交易,所以全節點又叫fully validating node,輕節點只保存lock header的資訊,一般來說輕節點沒法獨立驗證交易的合法性,系統中大多數節點是輕節點,但其沒有參與區塊鏈的構造和維護,
-
交易如何寫到區塊鏈里面?—— 賬本的內容是要取得分布式的共識(distributed consensus),
-
分布式共識:
??分布式的哈希表(distributed hash table);
??分布式系統的不可能結論(impossibility result),如FLP、CAP Theorem;
??分布式共識一個著名協議Paxos,該協議能夠保證一致性; -
位元幣中的共識協議(Consensus in BitCoin):投票方案 —— 投票確定哪個區塊寫入主鏈
??- 問題:應該確定哪些區塊擁有投票權membership,
?? 某些系統的membership有嚴格的要求,例如聯盟鏈Hyper Ledger Fabric,這種情況下基于投票的方案是可行的,但是,位元幣系統創建賬戶是容易的,一個人產生的公私鑰對只有在轉賬時,其他賬戶才能知道,所以攻擊者可以不停的創建賬戶(不斷生成公私鑰對),當攻擊者創建超過賬戶總數一半的賬戶數目時,攻擊者就擁有了對賬本的控制權,這種稱為女巫攻擊(sybil attack),因此這種投票方法不可取,因此,對于位元幣來說,簡單的直接投票不可行,
?? - 解決:不是按照賬戶數目投票,按照計算力來投票,
??每個節點都可以在本地組裝出一個候選區塊,把它認為合法的交易放在候選區塊里,然后該節點開始嘗試各種nonce隨機值(占4 byte),使其能滿足不等式 H(block header)≤target 的要求,如果某個節點找到了符合要求的nonce,它就獲得了記賬權, 由于hash函式具有puzzle friendly的性質,因此,計算力代表了投票的權重, -
記賬權
??所謂的記賬權,就是往位元幣賬本里寫入下一個區塊的權利,只有找到這個nonce,獲得記賬權的節點才有權利發布下一個區塊,其他節點在收到這個區塊之后,要驗證該區塊的合法性, -
驗證區塊合法性
??block header 的內容檢查:檢查block header中nBits的域設定是否符合位元幣協議中規定的難度要求,不等式是否成立等,
??block body 的交易串列檢查,驗證每個交易是否都合法:1、要有合法的簽名; 2、位元幣之前沒有被花
??如果有一項不符合要求,這個區塊就不能被接受,如果所有條件都符合,也不一定接受,見下圖,
??雖然紅色區塊是合法的,但是它不在最長合法鏈(longest valid chain)上,故不接受該區塊,這種稱為分叉攻擊(forking attack),所有接收的區塊應該是擴展最長合法鏈,
??區塊鏈在正常情況下也可能出現分岔 —— 兩個節點同時獲得記賬權:
??每個節點在本地自己組裝一個它認為合適的區塊,然后去嘗試各種nonce,如果兩個節點在差不多同一時間找到了符合要求的nonce,就都可以把區塊發布,這時會出現兩個等長的分岔,這兩條都是最長合法鏈,
??位元幣協議中用到了implicit consign,即如果沿著某個區塊繼續往后擴展,該區塊認為是合法的,等長的臨時性的分岔會維持一段時間,直到一個分岔勝出成為最長合法鏈, 也就是哪一個鏈搶先一步生成了新的區塊,哪一條就是最長合法鏈,orphan block中的交易會回滾,其得到的位元幣是沒有作用的,
-
獲得記賬權的好處(獎勵機制)
1. 區塊獎勵(block reward):位元幣協議中規定獲得記賬權的節點在發布的區塊里可以有一個特殊的交易——鑄幣交易,在這個交易里可以發布一定數量的位元幣,Coinbase transaction是位元幣系統中發行新幣的唯一方法,此后的交易都是位元幣的轉移,而這個交易不用指出幣的來源,出塊獎勵:位元幣剛上線,每個發布的區塊可以產生50BTC,21萬個區塊以后,出塊獎勵減半成25BTC,再過21萬個區塊,減半為12.5BTC,
2. transaction fee 交易費:所有交易輸入金額之和要等于輸出金額之和,即total inputs=total outputs,某些交易的total inputs略微大于total outputs,例如,輸入1位元幣,輸出0.99位元幣,另外0.01位元幣作為交易費給獲得記賬權發布區塊的節點, -
總結:
去中心化的賬本需要取得所有節點的共識,只有獲得記賬權的節點才能寫賬本,記賬權通過pow(挖礦)獲得,位元幣爭奪記賬權的程序叫作挖礦(mining),位元幣被稱為數字黃金(digital gold),爭奪記賬權的節點被稱為礦工(miner),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/299016.html
標籤:區塊鏈
