導(dǎo)言:
過去一兩年有許多號(hào)稱區(qū)塊鏈 3.0 的公鏈項(xiàng)目都宣稱克服了所謂不可能三角,但大體而言,至今尚未出現(xiàn)一個(gè)具信服力、并廣為接受的解方。不過,由分布式系統(tǒng)專家王嘉平等人提出的 Monoxide 擴(kuò)容方案,近日獲計(jì)算機(jī)頂級(jí)學(xué)術(shù)會(huì)議 NSDI 2019 收錄。這是繼 2017 年著名的 AlgoRand 項(xiàng)目登上 SOSP 大會(huì)后,睽違近兩年再有區(qū)塊鏈公鏈論文投中計(jì)算機(jī)頂會(huì)。
王嘉平為微軟總部研究院前主管研究員,專注于分布式系統(tǒng)等領(lǐng)域研究。2016 年起他在創(chuàng)新工場擔(dān)任執(zhí)行董事,負(fù)責(zé)區(qū)塊鏈和人工智能等投資方向,曾主導(dǎo)了對(duì)比特大陸的首輪機(jī)構(gòu)投資,成為三大主要投資方之一。去年他曾發(fā)表“區(qū)塊鏈到底有什么了不起”等系列文章,梳理出為什么他相信區(qū)塊鏈?zhǔn)且豁?xiàng)了不起的技術(shù),在行業(yè)內(nèi)引發(fā)廣大回響。
DeepTech 很高興邀請(qǐng)到王嘉平博士成為 DeepHash 專欄作者,這是他除了個(gè)人公眾號(hào)外首度在媒體上開設(shè)專欄。他將在以下的首篇專欄文章中,獨(dú)家披露 Monoxide 具體是如何突破區(qū)塊鏈不可能三角的,包含其研究中提出的“連弩挖礦”與“最終原子性”兩個(gè)重要?jiǎng)?chuàng)新。
Monoxide:突破區(qū)塊鏈不可能三角的極簡架構(gòu)
圖| Monoxide :以異步共識(shí)組來拓展區(qū)塊鏈(來源:王嘉平)
上圖是我們的論文,在 NSDI 會(huì)場的海報(bào)展示環(huán)節(jié)將使用的海報(bào)。本文將順著海報(bào)的邏輯介紹 Monoxide 的設(shè)計(jì)架構(gòu)和實(shí)現(xiàn)原理。雖然 Monoxide 架構(gòu)可以采用不同的共識(shí)算法作為其共識(shí)組內(nèi)的共識(shí)機(jī)制,本文將基于最簡單最干凈的Nakamoto(中本聰)共識(shí)算法(Proof-of-Work)展開討論。
而Monoxide 將同時(shí)滿足區(qū)塊鏈的安全,性能和去中心化這三項(xiàng)需求。這里需要強(qiáng)調(diào)的是,Monoxide 是 Layer 1 的區(qū)塊鏈技術(shù),不假設(shè)交易結(jié)構(gòu)的任何局部特性,也不假設(shè)跨共識(shí)組的交易會(huì)比較少。
什么是區(qū)塊鏈不可能三角?
第一角:怎么樣算安全
區(qū)塊鏈系統(tǒng)必須是安全的,這一點(diǎn)是不容妥協(xié)的,否則所有其它特性將毫無意義。具體落實(shí)到技術(shù)指標(biāo),就是在系統(tǒng)中構(gòu)造一系列非法區(qū)塊并得到全網(wǎng)認(rèn)可所需付出的代價(jià)。這個(gè)代價(jià)就 PoW (工作證明)共識(shí)機(jī)制而言,就是實(shí)施攻擊的最小挖礦算力。Nakamoto 共識(shí)算法保證惡意算力在50% 以下的時(shí)候,系統(tǒng)是安全的。我們保證的是采用 Monoxide 架構(gòu)之后,這個(gè) 50% 算力的安全邊界不會(huì)顯著變低。同時(shí),我們繼承了 Nakamoto 算法的其它安全特性,例如不要求出塊節(jié)點(diǎn)始終在線,全節(jié)點(diǎn)物理 IP 地址僅在一個(gè)很小的范圍內(nèi)暴露等。
第二角:怎么樣算高性能
Monoxide 架構(gòu)將完全隔離每個(gè)共識(shí)組的四大工作負(fù)荷,即:帶寬(廣播區(qū)塊數(shù)據(jù)和未確認(rèn)交易)、計(jì)算(驗(yàn)證交易和更新賬簿狀態(tài))、內(nèi)存(存儲(chǔ)賬簿的最新狀態(tài))、磁盤讀寫(記錄歷史區(qū)塊)。我們強(qiáng)調(diào)這四個(gè)方面的負(fù)荷必須全部被切分隔離,才能真正獲得高伸縮性的區(qū)塊鏈系統(tǒng),而不是僅完成部分工作符合的隔離,即所謂的網(wǎng)絡(luò)分片,交易分片和狀態(tài)分片。
具體落實(shí)到技術(shù)指標(biāo),性能包含兩個(gè)方面。一個(gè)是眾所周知的吞吐量,即最高每秒處理多少筆交易 (TPS),而另一個(gè)是全網(wǎng)表達(dá)賬簿狀態(tài)的總有效內(nèi)存總量。前者是速度,后者是容量。
我們實(shí)現(xiàn)了吞吐量大致 n/2 倍的線性提升以及狀態(tài)容量的 n 倍的線性提升 (以支付交易計(jì)算為例)。這里的 n 是共識(shí)組的個(gè)數(shù),提升是相對(duì)于共識(shí)組內(nèi)部采用的單鏈共識(shí)系統(tǒng)的性能。現(xiàn)在一個(gè)單鏈共識(shí)系統(tǒng),比較輕松能達(dá)到的是幾百 TPS 的吞吐量和數(shù)十 GB 的狀態(tài)空間。注意,這里并不是說 Monoxide 可以無限提升性能,在現(xiàn)有的互聯(lián)網(wǎng)平均帶寬的約束下(15Mbps),共識(shí)組的個(gè)數(shù) n 最高只能到數(shù)萬這個(gè)量級(jí)。
第三角:怎么樣算去中心化
首先,公鏈必須是 permissionless 系統(tǒng),并且系統(tǒng)中不存在不可替代的角色或者節(jié)點(diǎn),這是一個(gè)定性的要求。在滿足這個(gè)要求之后,去中心化可以落實(shí)到具體的技術(shù)指標(biāo),即需要多少IT 資源才能順利地參與全網(wǎng)的監(jiān)管(部分或者全部),也就是全節(jié)點(diǎn)的參與門檻。
而這個(gè)門檻最關(guān)鍵的因素是帶寬,高帶寬只有部署在數(shù)據(jù)中心才能獲得,其鏈路的地理位置也容易被追蹤;而其它資源諸如 CPU、內(nèi)存、磁盤等,都可以不受特定地理位置的約束,也無法追蹤,花點(diǎn)錢就有。
Monoxide 架構(gòu)在獲得幾個(gè)數(shù)量級(jí)的性能提升的同時(shí),始終將全節(jié)點(diǎn)帶寬消耗控制在普通家用互聯(lián)網(wǎng)接入可以承受的范圍(15Mbps),從而使得 Monoxide 的全節(jié)點(diǎn)可以像現(xiàn)在的以太坊全節(jié)點(diǎn)一樣,隨便在家里找個(gè)普通電腦就開起來。同時(shí) Monoxide 的共識(shí)組劃分了歷史交易歸檔的工作量,使得完整同步一個(gè)全節(jié)點(diǎn)的時(shí)間會(huì)比現(xiàn)在的以太坊少幾百倍。強(qiáng)調(diào)全節(jié)點(diǎn)進(jìn)入門檻的原因是,只有全節(jié)點(diǎn)才能夠在不信任其它節(jié)點(diǎn)的情況下,獨(dú)立驗(yàn)證交易,重建賬簿狀態(tài),而不是像云計(jì)算那樣,需要依賴于信任特定的節(jié)點(diǎn)(或服務(wù)器),這是區(qū)塊鏈和云計(jì)算的本質(zhì)區(qū)隔之一。
Monoxide 的總體設(shè)計(jì)
圖| Monoxide 總體設(shè)計(jì)(來源:王嘉平)
總體來說,Monoxide 的設(shè)計(jì)哲學(xué)是盡量簡單,在能滿足上述三角特性的前提下,盡量不引入額外的實(shí)體,不引入額外的機(jī)制,并盡量避免修改現(xiàn)有的機(jī)制。Monoxide 網(wǎng)絡(luò)是一個(gè)并發(fā)的多鏈系統(tǒng),每一個(gè)鏈我們稱之為"共識(shí)組"。
每個(gè)"共識(shí)組"其組成部分和現(xiàn)在單鏈系統(tǒng)完全一致,有自己的賬簿狀態(tài),區(qū)塊的鏈條,未確認(rèn)交易的集合,同步區(qū)塊數(shù)據(jù)和交易數(shù)據(jù)的廣播網(wǎng)絡(luò)以及一堆全節(jié)點(diǎn)(包括礦工)。各個(gè)共識(shí)組之間完全對(duì)等,無主次之分,除此之外這個(gè)網(wǎng)絡(luò)就沒有任何其它的角色了,沒有之前那些方案提出的母鏈,根鏈之類的,也沒有任何掌控全局的調(diào)度節(jié)點(diǎn)或驗(yàn)證節(jié)點(diǎn)。引入這些實(shí)體會(huì)使得一些功能更容易實(shí)現(xiàn)(例如動(dòng)態(tài)負(fù)載平衡),但是他們會(huì)犧牲去中心化特性,甚至還可能導(dǎo)致嚴(yán)重的性能瓶頸。
全網(wǎng)所有共識(shí)組用一個(gè)整數(shù)編號(hào)(0到n-1),我們限定共識(shí)組的總個(gè)數(shù)為 2 的 k 次冪,即n=2^k。任何一個(gè)賬簿地址,根據(jù)其地址二進(jìn)制數(shù)據(jù)的前 k 個(gè)比特,永久地被分配在一個(gè)共識(shí)組中。每個(gè)交易則根據(jù)交易的驗(yàn)證方的地址(例如轉(zhuǎn)賬交易的支付方),被分配在驗(yàn)證方所屬的共識(shí)組。所以 Monoxide 網(wǎng)絡(luò)的劃分不需要任何中心化的機(jī)制來分配地址和交易。
Monoxide 全網(wǎng)由各個(gè)共識(shí)組的出塊過程和未確認(rèn)交易集合完全獨(dú)立,共識(shí)組之間完全并行、異步且無需鎖定和同步,即使某一個(gè)共識(shí)組發(fā)生擁塞也不會(huì)干擾其它共識(shí)組的吞吐和出塊。
Monoxide 全網(wǎng)由各個(gè)共識(shí)組的獨(dú)立廣播子網(wǎng)所構(gòu)成,但這些廣播子網(wǎng)互相不重疊、互相不打攪。在我們的設(shè)計(jì)中,這些廣播子網(wǎng)由 DHT 的 Swarm 實(shí)現(xiàn),每一個(gè)廣播子網(wǎng)對(duì)應(yīng)一個(gè) Swarm。新啟動(dòng)的全節(jié)點(diǎn)根據(jù)其想要加入的共識(shí)組編號(hào)直接計(jì)算Swarm地址,然后利用 DHT的路由機(jī)制找到同一共識(shí)組里面的其它全節(jié)點(diǎn),并嘗試連接、入網(wǎng)。
全節(jié)點(diǎn)可以隨機(jī)選擇加入任意一個(gè)或多個(gè)共識(shí)組,或由上層應(yīng)用來決定。例如,錢包節(jié)點(diǎn)通常會(huì)加入登錄用戶的錢包地址所在的共識(shí)組,以便實(shí)時(shí)獲取其賬戶余額等狀態(tài)。Monoxide全節(jié)點(diǎn)不記錄任何用戶登錄狀態(tài)或用戶私鑰,以避免以太網(wǎng)全節(jié)點(diǎn)之前出現(xiàn)的 RPC 接口安全隱患。除非其上層應(yīng)用請(qǐng)求,通常一個(gè)共識(shí)組的全節(jié)點(diǎn)不會(huì)主動(dòng)連接另一個(gè)共識(shí)組的節(jié)點(diǎn)。
同樣礦工可以自由選擇參與一個(gè)或多個(gè)共識(shí)組,進(jìn)行挖礦,以期獲得每一個(gè)共識(shí)組中的出塊獎(jiǎng)勵(lì)。正常情況下,礦工會(huì)優(yōu)先選擇參與當(dāng)前算力較低的共識(shí)組,以獲得更高的利潤,從而導(dǎo)致各個(gè)共識(shí)組會(huì)收斂到一致的挖礦算力和出塊難度。
Monoxide 如何突破區(qū)塊鏈不可能三角?
從這個(gè)設(shè)計(jì),我們可以看到 Monoxide 架構(gòu)滿足區(qū)塊鏈三角的情況。
1.安全:只要各個(gè)共識(shí)組本身是安全的,Monoxide 就會(huì)是安全的。交易的安全和正確(例如避免雙花)依賴于每個(gè)共識(shí)組內(nèi)部的共識(shí)算法。Monoxide全網(wǎng)應(yīng)對(duì)女巫攻擊(Sybil Attack)也依賴于共識(shí)組內(nèi)部的共識(shí)算法本身的抵御能力。就 PoW 而言,每個(gè)共識(shí)組的安全,依賴于其內(nèi)部挖礦算力。所以 Monoxide 架構(gòu)的安全保障,核心是要能夠抵御算力分散的問題,即全網(wǎng)算力分散到每個(gè)共識(shí)組之后,每個(gè)共識(shí)組的算力將是全網(wǎng)的 1/n,這時(shí)單個(gè)共識(shí)組的防御壁壘將下降到 51/n %,(即所謂的1%攻擊)。這是一個(gè)完全無法接受的值。為了解決這個(gè)算力分散的問題,Monoxide引入了”連弩挖礦”(Chu-ko-nu Mining),使得單個(gè)共識(shí)組的防御壁壘回升到 51%。
2.性能:由于各共識(shí)組的區(qū)塊驗(yàn)證、存儲(chǔ)和賬簿狀態(tài)更新完全獨(dú)立,所以這三個(gè)方面將獲得無代價(jià)的無限線性提升。共識(shí)組之間唯一需要打交道的地方,就是為了正確處理跨共識(shí)組的交易。這使得在數(shù)據(jù)傳輸方面,性能提升是有代價(jià)的,并且不是無限的。為了高效完成跨共識(shí)組交易,Monoxide 引入了最終原子性(Eventual Atomicity),使得即使跨共識(shí)組交易的比例就算是接近 100%,全網(wǎng)仍舊可以輕松地完成交易吞吐,其性能代價(jià)為一個(gè)和共識(shí)組個(gè)數(shù)無關(guān)的常數(shù)。
3.去中心化:根據(jù)上面的描述,Monoxide 依舊是一個(gè)徹底的 permessionless 的系統(tǒng),并且每個(gè)共識(shí)組內(nèi)部的全節(jié)點(diǎn)的負(fù)擔(dān)始終保持在同維護(hù)一個(gè)單鏈系統(tǒng)相當(dāng)?shù)乃剑梢员惠p松部署到大部分有互聯(lián)網(wǎng)接入的角落。
所以論文最重要的兩大技術(shù)貢獻(xiàn)就是”連弩挖礦”(Chu-ko-nu Mining)和”最終原子性”(Eventual Atomicity)。后面我們將就這兩個(gè)方面,詳細(xì)展開,并以 Bitcoin (比特幣)數(shù)據(jù)結(jié)構(gòu)為藍(lán)本,給出這兩個(gè)機(jī)制對(duì) PoW 共識(shí)協(xié)議的改進(jìn)。
”連弩挖礦”(Chu-ko-nu Mining),放大有效算力
在 PoW 共識(shí)機(jī)制中,礦工需要不斷隨機(jī)刺探塊頭中的 Nonce (隨機(jī)數(shù)值)并重算哈希函數(shù),以使得這個(gè)塊頭的哈希值滿足當(dāng)前算力難度的要求,可以最終出塊。這個(gè)過程的瓶頸在于計(jì)算哈希函數(shù)的速度,所以挖礦算力被定義為哈希速率(Hashrate)。這里,我們將實(shí)際計(jì)算哈希的速度,定義為物理算力(PhysicalMining Power),提高物理算力的唯一方法就是部署更多的礦機(jī),消耗更多的能源。
然而,在 PoW 共識(shí)機(jī)制中,每個(gè)礦工的物理算力是無法直接知道的,這個(gè)物理算力最終體現(xiàn)為特定挖礦難度下的出塊速度。全網(wǎng)算力統(tǒng)計(jì)也是基于這個(gè)出塊速度而反算哈希速率而估計(jì)到的。
在發(fā)生算力攻擊的時(shí)候,無論是最長鏈,還是最難子樹(Ghost協(xié)議),都是依據(jù)各個(gè)分叉上出塊的數(shù)量和難度而定,而非各個(gè)礦工的實(shí)際哈希速率。我們將這個(gè)依據(jù)挖礦難度和出塊速度反算出來的哈希速率,定義有效算力(Effective Mining Power)。當(dāng)然在單鏈系統(tǒng)中,有效算力和物理算力,在統(tǒng)計(jì)意義上來說是完全相等的。
前面提到的算力分散問題是這樣的一個(gè)攻擊模型:在有 n 個(gè)共識(shí)組的 Monoxide 系統(tǒng)中,全網(wǎng)有效算力為 H,每個(gè)共識(shí)組的有效算力為 H/n。攻擊者在實(shí)施攻擊的時(shí)候,將其所有物理算力 T 分配到一個(gè)特定共識(shí)組,在這個(gè)共識(shí)組中獲得有效算力T。那邊當(dāng)其物理算力超過 T > H/n × 51% 的時(shí)候,攻擊將可以成功,并構(gòu)造不一致交易(例如雙花交易)。
為了抵御這個(gè)算力聚焦的攻擊模型,我們的思路是強(qiáng)制礦工將算力分散到各個(gè)共識(shí)組,使其無法集中算力到特定共識(shí)組。但在一個(gè)去中心化的permissionless 系統(tǒng)中,我們無法控制礦工如何分配其物理算力。
因此,Monoxide 引入了連弩挖礦,其效果是將使得全網(wǎng)的有效算力放大為物理算力的 n 倍,并且在協(xié)議的數(shù)據(jù)結(jié)構(gòu)層面再約束了這種放大后的有效算力必須平均分配到各個(gè)共識(shí)組,從而規(guī)避了這種算力聚焦的攻擊模型。
連弩挖礦允許礦工同時(shí)參與多個(gè)編號(hào)連續(xù)的共識(shí)組(例如從編號(hào)b到b+m-1),每次出塊的時(shí)候哈希函數(shù)將覆蓋多個(gè)將要出塊的塊頭進(jìn)行計(jì)算,同時(shí)這些塊頭將共用一個(gè) Nonce。具體做法是將這個(gè) m 個(gè)塊頭按序排列,構(gòu)造 Merkle 樹。然后算力哈希計(jì)算將覆蓋下列數(shù)據(jù)結(jié)構(gòu):
出塊時(shí),下列數(shù)據(jù)結(jié)構(gòu)會(huì)被廣播到特定的共識(shí)組 i (b≤i
其 MerkleTreePath_i是 Block_i在 Merkle 樹路徑上的左右兄弟節(jié)點(diǎn)的哈希值,需要 32 × log_2 m個(gè)字節(jié)。注意這里沒有顯式給 Block_i 在 Merkle樹中的位置,而是需要 Block_i中的共識(shí)組編號(hào)減去 b 推算出來,這樣做是為了約束連弩挖礦出塊的時(shí)候,每個(gè)共識(shí)組只能出一個(gè)塊。
從這個(gè)結(jié)構(gòu)中可以看到,即使在連弩挖礦的情況下,各個(gè)共識(shí)組也不會(huì)受到其它共識(shí)組出塊情況的影響。連弩挖礦并不要求各個(gè)共識(shí)組同步接受這些塊,甚至有些塊最終被認(rèn)為是無效分叉,也不會(huì)影響其它塊在其它共識(shí)組中被接受。同時(shí),這個(gè)結(jié)構(gòu)允許連弩挖礦包含算力難度不同的共識(shí)組,一旦部分共識(shí)組的挖礦難度被滿足,這些的塊就可以先發(fā)出去。
連弩挖礦將礦工有效算力放大,同時(shí)也放大了單位物理算力可以獲得的出塊獎(jiǎng)勵(lì),同樣的物理算力,同樣的能源消耗,參與到越多的共識(shí)組挖礦,所獲得的出塊獎(jiǎng)勵(lì)也會(huì)越多。所以,全網(wǎng)會(huì)收斂到主流的礦工都會(huì)采用連弩挖礦,并且參與到所有的共識(shí)組中。從而,使得全網(wǎng)的有效算力達(dá)到 H × n,單個(gè)共識(shí)組的有效算力達(dá)到H 。這樣使得攻擊單個(gè)共識(shí)組的物理算力要求和攻擊全網(wǎng)的物理算力相當(dāng),有效抵御算力聚焦的攻擊。
同時(shí)參與到多個(gè)共識(shí)組挖礦,需要更多的 IT 資源用來同步和驗(yàn)證每個(gè)共識(shí)組的交易和區(qū)塊(不僅僅是塊頭),也需要更多的磁盤存儲(chǔ)和內(nèi)存。基于去中心化的考慮,參與連弩挖礦與否,以及參與的共識(shí)組個(gè)數(shù)是一個(gè)礦工可以自行配置的選項(xiàng),Monoxide 并不要求所有礦工都參與所有共識(shí)組的挖礦。
同時(shí),得益于共識(shí)組獨(dú)立性,一個(gè)參與所有共識(shí)組挖礦的礦場,很容易在其公司內(nèi)部實(shí)現(xiàn)一個(gè)分布式的挖礦數(shù)據(jù)中心,用不同的主機(jī)監(jiān)控各個(gè)共識(shí)組,用不同主機(jī)確認(rèn)交易構(gòu)造新區(qū)塊,然后在內(nèi)部的高速網(wǎng)絡(luò)中匯總這些塊頭的哈希(Merkle的葉節(jié)點(diǎn)),并送給礦機(jī)集群。參與更多的共識(shí)組會(huì)線性增加IT資源的開銷,但是這些和大型礦場的礦機(jī)開銷來說,可以忽略不計(jì)了。
最后,順便提一下聯(lián)合挖礦(Merge Mining),在允許礦工同時(shí)參與多條鏈的挖礦這一點(diǎn)上,是很類似的。但是連弩挖礦設(shè)計(jì)初衷和工作場景和聯(lián)合挖礦完全不同,前者是為了放大有效算力,并強(qiáng)制放大后的算力均分在各個(gè)共識(shí)組,以防止算力集中攻擊特定共識(shí)組。而后者是為了借用大算力的鏈,來保證小算力鏈的安全。
''最終原子性''(Eventual Atomicity)
在 Monoxide 中,我們采用非常簡單的和去中心化的方式,將用戶和交易分配到共識(shí)組,并不企圖減少跨共識(shí)組交易發(fā)生概率,我們認(rèn)為利用交易結(jié)構(gòu)的局域性是Layer 2 技術(shù)的事情。全網(wǎng)性能越高,共識(shí)組數(shù)量越多,跨共識(shí)組交易發(fā)生概率一定會(huì)越高,這不是一個(gè)可以回避的問題。
在我們的實(shí)驗(yàn)中,當(dāng)共識(shí)組數(shù)量達(dá)到 64 的時(shí)候,跨共識(shí)組交易的比例已經(jīng)超過了 95% (實(shí)驗(yàn)的測(cè)試數(shù)據(jù)為以太坊 ERC20 的完整歷史交易記錄)。Monoxide 引入了最終原子性來實(shí)現(xiàn)高效的跨共識(shí)組交易處理,使得每個(gè)跨共識(shí)組交易帶來的額外開銷是一個(gè)很小的常數(shù),并且和共識(shí)組數(shù)量 n 無關(guān)。
區(qū)塊鏈系統(tǒng),每一個(gè)交易都是一個(gè)原子操作。在單鏈系統(tǒng)中,就好比單線程,這個(gè)原子操作并沒有被強(qiáng)調(diào),因?yàn)榻灰妆緛砭褪潜灰粋€(gè)一個(gè)地確認(rèn)和處理,系統(tǒng)無需做任何額外的事情,原子性就自然有保障。而在 Monoxide 中,不同地址的狀態(tài)在不同共識(shí)組中維護(hù),互相不可見,其狀態(tài)的更新也被兩個(gè)不同的鏈驅(qū)動(dòng),就好比多線程。
一個(gè)原子操作要在這樣的架構(gòu)下正確安全地完成,就不是一個(gè)簡單的事情了。通常為了協(xié)同多線程,我們有兩種辦法,一個(gè)是互相對(duì)所涉及的資源加鎖,另一個(gè)則是借由消息傳遞。我們選擇了后者,一方面是因?yàn)榧渔i會(huì)阻塞對(duì)應(yīng)的共識(shí)組的吞吐,嚴(yán)重影響性能,另一方面是因?yàn)樗械膯捂渽^(qū)塊鏈天生就有一個(gè)消息傳遞機(jī)制(未確認(rèn)交易集合),從而避免引入新的實(shí)體。
我們先以最簡單的支付交易為例,介紹我們的設(shè)計(jì)。一個(gè)數(shù)量為 x 的從地址 A 到地址 B 的支付交易,并且 A 和 B 處于不同的共識(shí)組。這是一個(gè)原子操作,其中包含一個(gè)扣款操作,這個(gè)操作有條件,并且不同的執(zhí)行順序會(huì)導(dǎo)致不同的狀態(tài)。另一個(gè)是存款操作,這個(gè)操作無條件,并且不同的執(zhí)行順序不會(huì)導(dǎo)致不一致的最終狀態(tài)。
對(duì)于這樣的交易邏輯,Monoxide 將先在共識(shí)組 A 中,嘗試完成扣款操作。如果成功,則將向共識(shí)組 B 轉(zhuǎn)發(fā)一個(gè)接力交易,一種特殊的未確認(rèn)交易。接力交易和普通未確認(rèn)交易一樣,描述了用什么參數(shù),調(diào)用哪個(gè)智能合約里面的函數(shù)。和普通未確認(rèn)交易不同的是權(quán)限校驗(yàn)方式。普通未確認(rèn)交易,通常由錢包簽發(fā),通過其攜帶數(shù)字簽名來校驗(yàn)權(quán)限。而接力交易攜帶的是來自另一個(gè)共識(shí)組的出塊證明:
為了校驗(yàn)這個(gè)接力交易,共識(shí)組的塊頭將包含兩個(gè) MerkleRoot,一個(gè)是之前就有的覆蓋所有被本塊確認(rèn)的交易的 Merkle 樹,另一個(gè)是新增的覆蓋由本塊中的交易發(fā)出去的所有接力交易。后者將被其它共識(shí)組接收,并用于校驗(yàn)由其發(fā)出去的接力交易。
默認(rèn)情況下,構(gòu)造和轉(zhuǎn)發(fā)接力交易由確認(rèn)初始交易的那個(gè)礦工(在共識(shí)組 A)完成。萬一這個(gè)轉(zhuǎn)發(fā)失效,共識(shí)組 A 中任何一個(gè)全節(jié)點(diǎn),都有能力從交易歷史中根據(jù)那個(gè)初始交易重新構(gòu)造并轉(zhuǎn)發(fā)丟失的接力交易,無需額外的共識(shí)或證明。
無論是接力交易,還是普通的未確認(rèn)交易,都將以類似的方式在目標(biāo)共識(shí)組的廣播子網(wǎng)中傳播,并被暫存在未確認(rèn)交易的集合中。礦工在出塊的時(shí)候,將同等對(duì)待接力交易和未確認(rèn)交易,通常根據(jù)其手續(xù)費(fèi)多少來排優(yōu)先級(jí)。任何產(chǎn)生一個(gè)或多個(gè)接力交易的初始交易,其手續(xù)費(fèi)會(huì)以一定比例分配給初始交易和多個(gè)接力交易,給到最終在其它共識(shí)組確認(rèn)這些交易的礦工。在 Monoxide 中,這個(gè)分配比例可以由智能合約代碼控制。
從上述流程中,我們可以看到在 Monoxide 系統(tǒng)中交易原子性并沒有得到立即滿足,而是要等到所有接力交易被確認(rèn)和執(zhí)行之后,才最終得以完成。我們將此稱為最終原子性,而不是要求即時(shí)的原子性。
最終原子性使得跨共識(shí)組的交易可以被無阻塞地在多個(gè)共識(shí)組間接力執(zhí)行,使得多個(gè)交易可以完全并行地重疊交錯(cuò)執(zhí)行,這樣 Monoxide 系統(tǒng)的全網(wǎng)吞吐能力就得以完全釋放,即使再多的跨共識(shí)組的交易也不會(huì)顯著影響性能。
我們即使假設(shè) 100% 的交易都是跨共識(shí)組的交易,一個(gè)支付交易將會(huì)變成兩個(gè)交易,粗略地說,會(huì)使吞吐量減半。但是這個(gè)開銷,和共識(shí)組的總數(shù)無關(guān)。當(dāng)全網(wǎng)性能獲得幾個(gè)數(shù)量級(jí)的提升時(shí),這個(gè)開銷始終是吞吐量減半。
故而,在我們的實(shí)驗(yàn)中,2048 個(gè)共識(shí)組能夠獲得近 1000 倍的吞吐量提升。基于最終原子性的執(zhí)行邏輯,需要初始操作和接力操作滿足前述的正確性約束,否則可能導(dǎo)致不一致的最終狀態(tài)。誠然,這會(huì)對(duì) Monoxide 平臺(tái)上的智能合約開發(fā)帶來一些難度。不過我們認(rèn)為這是一個(gè)不可避免的代價(jià),就好像給 GPU 寫代碼,給 OpenMP 寫代碼或者是給Hadoop 寫代碼,就是會(huì)比單機(jī)單線程的 CPU 的代碼要困難一些,思路上要繞一些。當(dāng)然,結(jié)合恰當(dāng)?shù)暮霞s語言模型、形式化驗(yàn)證工具,以及開發(fā)和調(diào)試工具的支持,開發(fā)的難度也會(huì)大大減少。
Oxidation 語言是 Monoxide 平臺(tái)的智能合約語言,一種基于函數(shù)編程(Functional programming)的語言。這個(gè)語言模型的設(shè)計(jì)并不是論文的一部分,這部分工作也尚未全部完成。這里給出一個(gè)類似 ERC20 代幣的合約示例代碼。這里比較特殊的是系統(tǒng)調(diào)用 yield 。這個(gè)調(diào)用將在合約執(zhí)行的過程中生成接力交易,如果 b 為一個(gè)跨共識(shí)組的地址的話。代碼中可以出現(xiàn)多個(gè) yield 調(diào)用,也可以有條件地調(diào)用 yield,但是 yield 調(diào)用不允許重入。
伸縮性的上限——為什么說區(qū)塊鏈不可能三角被突破了?
為了正確完成跨共識(shí)組交易,接力交易的權(quán)限校驗(yàn)需要接收到發(fā)起方所在的共識(shí)組的對(duì)應(yīng)的塊頭。這件事情成為了 Monoxide 全網(wǎng)伸縮性的最主要瓶頸。這意味著,每個(gè)全節(jié)點(diǎn)都需要同步并跟蹤所有共識(shí)組中的塊頭,同時(shí)加上連弩挖礦機(jī)制,這個(gè)同步消耗的帶寬為:
( BlockHeadSize + 32 ×log2 n ) × n / BlockInterval
BlockHeadSize 為塊頭的元數(shù)據(jù),大致 120 字節(jié)。這個(gè)部分為不定長,是因?yàn)镸onoxide 采用可變長度的 Nonce,以適配不同的挖礦難度。32 × log2 n 部分為連弩挖礦機(jī)制引入的算力證明,即前文的 MerkleTreePath_i。BlockInterval為出塊間隔。基本上,這是一個(gè) O(nlog2 n)的開銷,只要 n 大到一定程度,性能的提升會(huì)低于這個(gè)開銷的增加,從而確定了伸縮性的天花板。
既然,每個(gè)全節(jié)點(diǎn)都需要同步并跟蹤所有共識(shí)組中的塊頭,我們將給出另一種連弩挖礦的出塊數(shù)據(jù)結(jié)構(gòu),改為一次出所有的塊頭,而不是按逐個(gè)共識(shí)組出塊頭,不可用的塊頭(哈希難度未達(dá)到挖礦難度的)用其哈希值代替。當(dāng)然區(qū)塊本身仍舊是逐個(gè)共識(shí)組分開廣播的。同時(shí)為了實(shí)現(xiàn)這個(gè)優(yōu)化,我們將引入一個(gè)全局的特殊廣播子網(wǎng),僅用來傳播塊頭或者成批的塊頭,并要求所有全節(jié)點(diǎn)和挖礦節(jié)點(diǎn)加入這個(gè)特殊的廣播子網(wǎng)。這樣就可以省去原先每個(gè)塊頭的算力證明部分,將帶寬消耗將降到 O(n):
BlockHeadSize × n / BlockInterval
即使優(yōu)化之后,對(duì)于每個(gè)全節(jié)點(diǎn)來說,這仍舊是一個(gè)不容忽視的開銷。n總能大到一定程度,使得本地帶寬被耗盡。那么我們來推演一下這個(gè)天花板到底是多少。假設(shè)約束全節(jié)點(diǎn)帶寬為 15Mbps,即上限為 1.88MB/s。以 Nakamoto 共識(shí)為基礎(chǔ),我們?cè)O(shè)定其出塊間隔為 1 分鐘,出塊大小為 8MB。
這樣單個(gè)共識(shí)組單鏈吞吐量將約為 560 TPS,區(qū)塊傳輸開銷為 0.13MB/s。當(dāng)共識(shí)組數(shù)量為 65536 個(gè)的時(shí)候,全網(wǎng)塊頭傳輸開銷也為 0.13MB/s。加起來也遠(yuǎn)小于帶寬上限,有足夠的剩余帶寬用于下行廣播。然后,這個(gè)時(shí)候全網(wǎng)吞吐量約為 15M TPS 左右,狀態(tài)容量在幾百 TB 的數(shù)量級(jí)。無論是再多的共識(shí)組總量,還是再高的共識(shí)組單鏈吞吐量,都會(huì)逐漸使得全節(jié)點(diǎn)本地帶寬顯得局促。
所以,我們認(rèn)為 Monoxide 的伸縮性天花板大致在這個(gè)水平,千萬 TPS 的吞吐量和幾百 TB 的狀態(tài)容量。千萬 TPS 這個(gè)數(shù)量級(jí),已經(jīng)可以應(yīng)付大部分互聯(lián)網(wǎng)級(jí)別應(yīng)用的峰值流量,同時(shí)仍舊滿足區(qū)塊鏈對(duì)安全和去中心化的要求。這就是為什么我們說,區(qū)塊鏈不可能三角被突破了。當(dāng)然,要伸縮到這個(gè)程度,也需要整個(gè)社區(qū)的總參與節(jié)點(diǎn)數(shù)到達(dá)百萬數(shù)量級(jí)。
-
cpu
+關(guān)注
關(guān)注
68文章
10873瀏覽量
212038 -
人工智能
+關(guān)注
關(guān)注
1791文章
47352瀏覽量
238791 -
區(qū)塊鏈
+關(guān)注
關(guān)注
111文章
15562瀏覽量
106187
原文標(biāo)題:DeepHash專欄|Monoxide:突破區(qū)塊鏈不可能三角的極簡架構(gòu)
文章出處:【微信號(hào):deeptechchina,微信公眾號(hào):deeptechchina】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論