摘要
本文描述一種在中本聰共識機制網絡下的節(jié)點之間的傳播協(xié)議,在該協(xié)議中節(jié)點之間積極地協(xié)調各自的本地狀態(tài)。它使得節(jié)點能夠對彼此進行采樣,以確定一個相沖突的集中哪個選項是在當前大多數(shù)節(jié)點的選擇,并且將相同的選擇推向大多數(shù)節(jié)點。本協(xié)議是基于雪崩共識算法改進而來,提供了協(xié)議的異步性、亞穩(wěn)定性和靜態(tài)終結性。
本文檔不會深入討論在雪崩算法白皮書中描述的細節(jié)和知識點,這些是需要讀者自己去閱讀原白皮書。同時,本文還要求讀者已經理解了中本聰共識機制。
動機
降低比特幣在多網絡節(jié)點之間的熵的好處被廣泛討論,其中包括將執(zhí)行成本高的工作移出關鍵路徑來提高可擴展性、更快的交易確認/雙花保護,和更強的拜占庭對抗中短期期鏈重組攻擊。
中本聰共識是希望任何節(jié)點可以無須信任地參與達成共識,它通過使用工作量證明賦于每個狀態(tài)一個真實世界權重。不幸的是,這對系統(tǒng)提出了一些不理想的要求,如同步性,刻意的人為延遲,和永久性地需要維護共識。比如,一個狀態(tài)無法100%地確定。
我們意識到,由挖礦節(jié)點構成的大型節(jié)點,和大量的支付基礎設施始終在線但不參與達成共識,我們可以設計一個協(xié)議,允許他們快速達成共享的網絡狀態(tài),盡管這是主觀的。礦工可以繼續(xù)完成他們的工作,并最終將他們的本地狀態(tài)固化為全局狀態(tài),從而使新加入的節(jié)點可以無須信任地加入共識。該協(xié)議試圖使用預共識技術,以達成更快、更具擴展性和更安全的比特幣現(xiàn)金。
目標
我們希望在協(xié)議上達成如下目標:
· 證明預共識系統(tǒng)在比特幣現(xiàn)金上是可行的。
· 挖掘更多需要研究的,或潛在的問題。
· 提供一個可以工作的預共識系統(tǒng),以允許任何節(jié)點都可以加入參與其中,用于實驗和收集信息。
此外,協(xié)議必須具有以下屬性:
· 無須許可:任何人都可以提供或索要采樣
· 低延遲:實現(xiàn)秒級達成決策
· 元穩(wěn)定性:參與者主動參與工作,并將系統(tǒng)狀態(tài)朝著單一方向坍縮,并且能抵抗狀態(tài)回撤。
· 平靜:一旦做出決定,就不可逆,而且最終狀態(tài)將不再需要額外的工作。
· 可擴展的成員體系:我們希望任何有興趣的人都能加入
· 可擴展的資源:我們需要將系統(tǒng)擴展到全球現(xiàn)金系統(tǒng)水平。
· 拜占庭式容錯:我們不假設所有參與者都是誠實的,系統(tǒng)能抗惡意行為。
協(xié)議概述
基于互斥點(based on points of mutual exclusion)我們認為每個區(qū)塊和交易都是1個或多個沖突集的成員,比如花費相同的UTXO。我們使用雪崩算法,將每一個沖突集精確地分解為單個項目,并且參與者使用其本地狀態(tài)參與解決網絡沖突集,從而為所有參與節(jié)點提供共享的本地狀態(tài)。
每個客戶端在看到的一個未完成的項目時,都會維護一個基于雪球(Snowball-based)投票累加器。一旦看到一個項目,就會創(chuàng)建一個累加器,并開始投票確定最終狀態(tài)的過程。只要有未解決的沖突集,客戶端就會隨機選擇一個對等節(jié)點,詢問它對這個項目的投票,并將這些投票輸入投票累加器。一旦項目的接受信任度達到閾值,則沖突解決;這個項目被全網接受,并且拒絕所有沖突項目。這個過程會持續(xù)工作,直到所有沖突集都被解決為止。
通過將內存池里所有被拒絕的項,替換為被接受的項,網絡中的參與者就可以擁有幾乎相同的本地狀態(tài)。結合再有的規(guī)范排序規(guī)則,這些客戶端就可以看到幾乎一致的區(qū)塊。
詳細規(guī)則
安全參數(shù)
我們的算法也采用雪崩算法白皮書描述的安全參數(shù),如下:
發(fā)信號支持
客戶端應使用以下服務位來表示他們理解協(xié)議:
NODE_SNOWGLOBE= (1 《《 26)
握手
當節(jié)點希望提供其采樣狀態(tài)時,它們應該使用適當?shù)姆瘴唤o其他節(jié)點發(fā)送一個連接消息。接收到該消息的客戶端應該驗證該消息,并且:
1.如果消息是非法的,則禁止其節(jié)點
2.如果消息是合法的,則將其節(jié)點加入到合作內存參與者之列。
使用幣齡抗女巫攻擊
使用一組使用幣金額乘于區(qū)塊年齡的UTXO信息,我們稱之為“幣塊”,才能向其他節(jié)點發(fā)起查詢服務,通過該機制可實現(xiàn)抗女巫攻擊。如果索要查詢服務的節(jié)點發(fā)出的消息不包含足夠的幣塊閾值,該消息為非法的,并且該節(jié)點會被禁止,不能加入Snowglobe內存池中。
初始的幣塊值設為1440,但需要進一步研究,是否有更合適的值。
使用身份和下注(stake)發(fā)信號及驗證
創(chuàng)建信號
提供查詢服務的節(jié)點,都必須維護一個secp256k1密鑰對,該密鑰用于授權
和驗證下注消息的身份信息。下注動作是通過下注者使用公鑰簽署一個包含身份的信息加入連接消息。消息是通過ECDSA簽署,使用組成幣塊的UTXO的公鑰和私鑰簽署。(這一段看不懂,原文如下:Queryable nodes must all maintain an secp256k1 key pair whichis used by queriers to authenticate messages against a stake. Staking is doneby crafting and signing a Joinmessage containingthe Identity public key a list of outpoints controlled by the staker. Thismessage is signed using ECDSA by the Identity private key and by the public keythat controls each UTXO represented by the committed outpoint.)
現(xiàn)在只支持如下UTXO:
· P2PK(Pay-to-Pubkey)
· P2PKH
將來可能支持以下類型:
· 多重簽名
· 精心定義的P2SH腳本。
驗證
要驗證一個連接消息的真?zhèn)危捌鋵伦⒌目蛻舳说纳矸荩仨毻ㄟ^將消息的簽名移除,并生成規(guī)范的序列化。然后驗證程序要檢查身份簽名的正確性。接下來,要在提取公鑰的同時,對照匹配輸出點。最后,加載每個提交的UTXO,檢查它們的類型,檢查匹配的公鑰是否正確,并確保幣塊足夠大。(這段太復雜了,看不懂,原文是:To validate a Join message and its stake a client must firstgenerate the canonical serialized message by removing the signatures. Then itshould check that the Identity signature correctly signs the canonical message.Next it needs to verify each outpoint signature against its matching committedoutpoint, while simultaneously extracting the public key. Finally it load eachof the committed UTXOs, check their type, check that the matching public key iscorrect, and ensure that Coin Blocks is sufficient.)
DAG格式
雪崩算法有效性的核心是DAG(有向無環(huán)圖),它允許我們通過單個Snowball實例,來接受或拒絕整個鏈的狀態(tài)。DAG圖的連接性越強,完成所有狀態(tài)最終確定所需要的Snowball實例就越少,不過,如果DAG圖過于復雜,會導致體統(tǒng)效率都會浪費在構造圖的邊上。
解決方案是使用鏈中已經存在的所有自然形成的對象邊,而不是人為再生成新的。我們通過定義給定頂點,來形成新的邊,具體類型取決于如下:
一筆交易會從每一個父交易那里都形成一條邊。
一個塊,會從它的父塊里形成一條邊,以及從每一筆被該區(qū)塊承諾的交易那里形成一條邊。
沖突集
區(qū)塊中每一筆存在于沖突集的交易,都要基于互斥排除點。這些要點如下:
· 一個交易的沖突集是所有使用相同UTXO花費的交易
· 一個區(qū)塊的沖突集是所有相同高度的區(qū)塊,包含了相同交易,或者包含了相沖突的交易
解決沖突集的過程是最終接受一個項的過程,同時意味著拒絕了所有其他項
循環(huán)采樣
每一個客戶端都應該持續(xù)為未完成的項進行循環(huán)采樣,每次循環(huán)最多可以達到4096個請求。每次重復采樣,客戶端們應該隨機選擇要查詢的節(jié)點,發(fā)送一個項目請求,并且通過投票累加器來返回投票結果。通過偽代碼來描述如下:
while items= getItemsToSample():
peer = getRandomPeer()
votes = query(peer, items)
accumulateVotes(votes)
投票累加器
投票有三個選項值:no(0),yes(1),或者棄權(2)。通過將它們放入Snowball投票累加器來處理,該累加器保持最后K張選票,接受狀態(tài),以及雪崩白皮書里描述的對該狀態(tài)的可信度。
責任編輯:ct
評論
查看更多