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