摘要
本文描述一種在中本聰共識機制網絡下的節點之間的傳播協議,在該協議中節點之間積極地協調各自的本地狀態。它使得節點能夠對彼此進行采樣,以確定一個相沖突的集中哪個選項是在當前大多數節點的選擇,并且將相同的選擇推向大多數節點。本協議是基于雪崩共識算法改進而來,提供了協議的異步性、亞穩定性和靜態終結性。
本文檔不會深入討論在雪崩算法白皮書中描述的細節和知識點,這些是需要讀者自己去閱讀原白皮書。同時,本文還要求讀者已經理解了中本聰共識機制。
動機
降低比特幣在多網絡節點之間的熵的好處被廣泛討論,其中包括將執行成本高的工作移出關鍵路徑來提高可擴展性、更快的交易確認/雙花保護,和更強的拜占庭對抗中短期期鏈重組攻擊。
中本聰共識是希望任何節點可以無須信任地參與達成共識,它通過使用工作量證明賦于每個狀態一個真實世界權重。不幸的是,這對系統提出了一些不理想的要求,如同步性,刻意的人為延遲,和永久性地需要維護共識。比如,一個狀態無法100%地確定。
我們意識到,由挖礦節點構成的大型節點,和大量的支付基礎設施始終在線但不參與達成共識,我們可以設計一個協議,允許他們快速達成共享的網絡狀態,盡管這是主觀的。礦工可以繼續完成他們的工作,并最終將他們的本地狀態固化為全局狀態,從而使新加入的節點可以無須信任地加入共識。該協議試圖使用預共識技術,以達成更快、更具擴展性和更安全的比特幣現金。
目標
我們希望在協議上達成如下目標:
· 證明預共識系統在比特幣現金上是可行的。
· 挖掘更多需要研究的,或潛在的問題。
· 提供一個可以工作的預共識系統,以允許任何節點都可以加入參與其中,用于實驗和收集信息。
此外,協議必須具有以下屬性:
· 無須許可:任何人都可以提供或索要采樣
· 低延遲:實現秒級達成決策
· 元穩定性:參與者主動參與工作,并將系統狀態朝著單一方向坍縮,并且能抵抗狀態回撤。
· 平靜:一旦做出決定,就不可逆,而且最終狀態將不再需要額外的工作。
· 可擴展的成員體系:我們希望任何有興趣的人都能加入
· 可擴展的資源:我們需要將系統擴展到全球現金系統水平。
· 拜占庭式容錯:我們不假設所有參與者都是誠實的,系統能抗惡意行為。
協議概述
基于互斥點(based on points of mutual exclusion)我們認為每個區塊和交易都是1個或多個沖突集的成員,比如花費相同的UTXO。我們使用雪崩算法,將每一個沖突集精確地分解為單個項目,并且參與者使用其本地狀態參與解決網絡沖突集,從而為所有參與節點提供共享的本地狀態。
每個客戶端在看到的一個未完成的項目時,都會維護一個基于雪球(Snowball-based)投票累加器。一旦看到一個項目,就會創建一個累加器,并開始投票確定最終狀態的過程。只要有未解決的沖突集,客戶端就會隨機選擇一個對等節點,詢問它對這個項目的投票,并將這些投票輸入投票累加器。一旦項目的接受信任度達到閾值,則沖突解決;這個項目被全網接受,并且拒絕所有沖突項目。這個過程會持續工作,直到所有沖突集都被解決為止。
通過將內存池里所有被拒絕的項,替換為被接受的項,網絡中的參與者就可以擁有幾乎相同的本地狀態。結合再有的規范排序規則,這些客戶端就可以看到幾乎一致的區塊。
詳細規則
安全參數
我們的算法也采用雪崩算法白皮書描述的安全參數,如下:
發信號支持
客戶端應使用以下服務位來表示他們理解協議:
NODE_SNOWGLOBE= (1 《《 26)
握手
當節點希望提供其采樣狀態時,它們應該使用適當的服務位給其他節點發送一個連接消息。接收到該消息的客戶端應該驗證該消息,并且:
1.如果消息是非法的,則禁止其節點
2.如果消息是合法的,則將其節點加入到合作內存參與者之列。
使用幣齡抗女巫攻擊
使用一組使用幣金額乘于區塊年齡的UTXO信息,我們稱之為“幣塊”,才能向其他節點發起查詢服務,通過該機制可實現抗女巫攻擊。如果索要查詢服務的節點發出的消息不包含足夠的幣塊閾值,該消息為非法的,并且該節點會被禁止,不能加入Snowglobe內存池中。
初始的幣塊值設為1440,但需要進一步研究,是否有更合適的值。
使用身份和下注(stake)發信號及驗證
創建信號
提供查詢服務的節點,都必須維護一個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.)
現在只支持如下UTXO:
· P2PK(Pay-to-Pubkey)
· P2PKH
將來可能支持以下類型:
· 多重簽名
· 精心定義的P2SH腳本。
驗證
要驗證一個連接消息的真偽,及其對應下注的客戶端的身份,必須通過將消息的簽名移除,并生成規范的序列化。然后驗證程序要檢查身份簽名的正確性。接下來,要在提取公鑰的同時,對照匹配輸出點。最后,加載每個提交的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(有向無環圖),它允許我們通過單個Snowball實例,來接受或拒絕整個鏈的狀態。DAG圖的連接性越強,完成所有狀態最終確定所需要的Snowball實例就越少,不過,如果DAG圖過于復雜,會導致體統效率都會浪費在構造圖的邊上。
解決方案是使用鏈中已經存在的所有自然形成的對象邊,而不是人為再生成新的。我們通過定義給定頂點,來形成新的邊,具體類型取決于如下:
一筆交易會從每一個父交易那里都形成一條邊。
一個塊,會從它的父塊里形成一條邊,以及從每一筆被該區塊承諾的交易那里形成一條邊。
沖突集
區塊中每一筆存在于沖突集的交易,都要基于互斥排除點。這些要點如下:
· 一個交易的沖突集是所有使用相同UTXO花費的交易
· 一個區塊的沖突集是所有相同高度的區塊,包含了相同交易,或者包含了相沖突的交易
解決沖突集的過程是最終接受一個項的過程,同時意味著拒絕了所有其他項
循環采樣
每一個客戶端都應該持續為未完成的項進行循環采樣,每次循環最多可以達到4096個請求。每次重復采樣,客戶端們應該隨機選擇要查詢的節點,發送一個項目請求,并且通過投票累加器來返回投票結果。通過偽代碼來描述如下:
while items= getItemsToSample():
peer = getRandomPeer()
votes = query(peer, items)
accumulateVotes(votes)
投票累加器
投票有三個選項值:no(0),yes(1),或者棄權(2)。通過將它們放入Snowball投票累加器來處理,該累加器保持最后K張選票,接受狀態,以及雪崩白皮書里描述的對該狀態的可信度。
責任編輯:ct
評論
查看更多