本篇想要拆解的一個(gè)區(qū)塊鏈項(xiàng)目是RadixDLT,項(xiàng)目官網(wǎng)是:https://www.radixdlt.com/。
閱讀的白皮書版本是:

此白皮書只涉及公鏈的共識(shí)算法以及系統(tǒng)架構(gòu),只在Layer1層,具體到上層的智能合約部分,雖然也是圖靈完備,且基于Java來(lái)進(jìn)行開發(fā),但不是這份白皮書的重點(diǎn)。
從局外人的角度來(lái)看,現(xiàn)在的公鏈設(shè)計(jì),是為上層應(yīng)用生態(tài)提供基石,基礎(chǔ)設(shè)施好不好,才是項(xiàng)目的關(guān)鍵,上層應(yīng)用開發(fā),筑巢引鳳,只有工具箱完備,也只有巢筑得好,才會(huì)有繁榮生態(tài)的可能。
Radix后面跟著的這個(gè)Tempo,是它的共識(shí)機(jī)制的名稱,也表示時(shí)序的含義,后面會(huì)做展開。
提起公鏈的設(shè)計(jì),將經(jīng)典的比特幣系統(tǒng)架構(gòu)作為起點(diǎn),是一個(gè)很好的選擇。
比如說(shuō),到底比特幣系統(tǒng)有哪些問(wèn)題,使其滿足不了現(xiàn)在對(duì)區(qū)塊鏈的需求了呢?先提出想知道的問(wèn)題,其次我們將帶著問(wèn)題來(lái)看待一個(gè)新項(xiàng)目到底有沒(méi)有核心競(jìng)爭(zhēng)力,至少,可以看到它們的差異性,以及創(chuàng)新的點(diǎn)。
本篇行文組織結(jié)構(gòu)如下:
- 基于區(qū)塊的區(qū)塊鏈的可擴(kuò)展性問(wèn)題
- DAG的基本概念以及擴(kuò)展性問(wèn)題
- DAG分片解決方案與雙花問(wèn)題
- Radix Tempo組成成分
- 事件定序之Tempo共識(shí)基礎(chǔ)--邏輯鐘
具體標(biāo)題略有差異,但是核心點(diǎn)與組織結(jié)構(gòu)相匹配。
1.區(qū)塊鏈為什么擴(kuò)展性差?
談起可擴(kuò)展性,這個(gè)概念或許會(huì)有不同的感性解讀,更加精確的描述是:系統(tǒng)計(jì)算處理能力的一種衡量指標(biāo)。通俗一點(diǎn)說(shuō),就是夠不夠快。我們?yōu)槭裁催@么在意系統(tǒng)快不快呢?這個(gè)看似廢話的問(wèn)題,想引申的思考是:能不能大規(guī)模商用。
區(qū)塊鏈發(fā)展的方向一定是要深入到我們的生活,而不是局限在信仰。
看下圖的左半部分,是經(jīng)典的區(qū)塊鏈的圖像化描述。從下往上延伸,每一個(gè)區(qū)塊包含上一個(gè)區(qū)塊之后到當(dāng)前打包時(shí)的未處理交易,每一個(gè)區(qū)塊的容量有限,所以當(dāng)網(wǎng)絡(luò)有大量未處理交易時(shí),打包一個(gè)區(qū)塊只能處理一部分。這里多說(shuō)一句的原因是很多文字描述里會(huì)說(shuō)打包上一個(gè)區(qū)塊之后的所有交易,這是不精確的。
以PoW算法為例,我們已經(jīng)知道了礦工用大量算力計(jì)算一個(gè)哈希值,具體來(lái)說(shuō)就是,對(duì)區(qū)塊本身計(jì)算出來(lái)一個(gè)哈希值,記為H(Block),這個(gè)確定,尋找一個(gè)隨機(jī)數(shù)Nonce,使得:
- H(Block) + Nonce < target目標(biāo)值
比如我們常說(shuō)找到比特幣哈希值前導(dǎo)0的個(gè)數(shù),前導(dǎo)0越多,值越小,那么小于定的目標(biāo)值的可能性就越大。所以正確答案并不是唯一的,也意味著答案還有好與更好的比較。
我們舉一個(gè)例子,來(lái)說(shuō)明區(qū)塊鏈存在的性能差的問(wèn)題。

現(xiàn)在假定挖到了第100號(hào)區(qū)塊,圓圈表示節(jié)點(diǎn),A、z節(jié)點(diǎn)都收到了100號(hào)區(qū)塊的信息,但不是同一塊,這是數(shù)字可以認(rèn)為是本輪搶記賬權(quán)游戲的編號(hào)。
A和z都會(huì)廣播給自己的鄰居節(jié)點(diǎn),我們故意放大一點(diǎn):在A這里網(wǎng)絡(luò)延遲很大,傳播到鄰居得1個(gè)小時(shí),z這里比較快,5分鐘就廣播給了自己的鄰居節(jié)點(diǎn)。但是廣播不會(huì)停留在鄰居節(jié)點(diǎn),而是接著傳播。我們假設(shè)網(wǎng)絡(luò)復(fù)雜,1小時(shí)后z節(jié)點(diǎn)的100'區(qū)塊信息傳遞到了ABCD這里,此時(shí)ABCD都已經(jīng)收到了標(biāo)號(hào)為100的區(qū)塊信息,那么此時(shí)會(huì)比較哈希值,誰(shuí)的更優(yōu),一看ABCD持有的更有,于是拋棄從z這里傳過(guò)來(lái)的信息,并將100號(hào)區(qū)塊的信息向z那里廣播。
這個(gè)場(chǎng)景下,我們可以看出帶寬浪費(fèi),網(wǎng)絡(luò)擁堵,節(jié)點(diǎn)瞎忙問(wèn)題。對(duì)于區(qū)塊鏈網(wǎng)絡(luò)而言,P2P網(wǎng)絡(luò)是核心,不管共識(shí)多么先進(jìn),網(wǎng)絡(luò)的延遲性也是非常關(guān)鍵的瓶頸。
2.DAG解決方案沒(méi)有擴(kuò)展性問(wèn)題嗎?

DAG的全稱是有向無(wú)環(huán)圖,在區(qū)塊鏈里,以區(qū)塊為單位,每個(gè)區(qū)塊里包含很多個(gè)交易,共識(shí)是針對(duì)區(qū)塊的共識(shí),是最長(zhǎng)鏈共識(shí),因此上面這個(gè)圖里左邊的形狀,紫色的區(qū)塊是不作數(shù)的,需要重新打包,不過(guò)在以太坊里,經(jīng)常出現(xiàn)叔塊,礦工也能得到部分獎(jiǎng)勵(lì)。
DAG沒(méi)有區(qū)塊的概念,每一筆交易需要與之前的至少一個(gè)已經(jīng)驗(yàn)證的事務(wù)相連,即后面的交易至少驗(yàn)證前面的一筆交易,一般是2筆,以此構(gòu)成一個(gè)圖結(jié)構(gòu),如右半部分所示。

一般提起DAG的弱點(diǎn),可擴(kuò)展性都不在其中。但是Radix的CTO有提到,隨著交易事務(wù)越來(lái)越多,可以看到當(dāng)前的圓圈所占據(jù)的空間越來(lái)越大。那么每個(gè)節(jié)點(diǎn)需要的存儲(chǔ)空間也越來(lái)越大。到最后,能夠存儲(chǔ)全賬本數(shù)據(jù)的節(jié)點(diǎn)就會(huì)減少,如果網(wǎng)絡(luò)能不要求每個(gè)節(jié)點(diǎn)都存儲(chǔ)所有數(shù)據(jù),將提高網(wǎng)絡(luò)的可擴(kuò)展性,比如一般的物聯(lián)網(wǎng)設(shè)備也能加入到這個(gè)網(wǎng)絡(luò)。
DAG最為人詬病的是異步操作導(dǎo)致的數(shù)據(jù)的不一致性,這也是Radix要解決的重點(diǎn)之一。
針對(duì)這種數(shù)據(jù)膨脹問(wèn)題,有一個(gè)解決方案是:對(duì)賬本數(shù)據(jù)進(jìn)行分片,一些節(jié)點(diǎn)保存全部賬本,其他節(jié)點(diǎn)只保存部分?jǐn)?shù)據(jù)。
但是,這帶來(lái)一個(gè)新的問(wèn)題:雙花問(wèn)題。
3.DAG分片方案與雙花問(wèn)題
講一講在DAG之下的雙花問(wèn)題是如何產(chǎn)生的。下面這圖是Radix項(xiàng)目CTO的手稿:

中間藍(lán)色的橫線是將賬本數(shù)據(jù)進(jìn)行了分片劃分,左邊的x是很早之前的某個(gè)人的交易,假定這筆交易之后,賬戶還有余額,現(xiàn)在此人要花費(fèi)這筆余額了,于是他在上面的分片選擇簽署一筆交易,這筆交易就近選擇過(guò)去的兩筆交易進(jìn)行驗(yàn)證,于是這個(gè)事件y合法;與此同時(shí),他又跑到下面的分片簽署同樣的事件,也找兩個(gè)過(guò)去的交易進(jìn)行驗(yàn)證,我們把這個(gè)事件標(biāo)記為y'。現(xiàn)在兩個(gè)交易都能追溯到x,看起來(lái)都是合法的,但是一筆錢被花了兩次,這就是雙花問(wèn)題。
為什么會(huì)出現(xiàn)這種情況呢?原因在于兩個(gè)分片之間不能感知,不能通信,不知道一個(gè)相同的事件發(fā)生了兩次。
針對(duì)這個(gè)問(wèn)題提出下面三個(gè)解決方案:
1.不用分片
2.跨片通信
3.中心化機(jī)構(gòu)來(lái)監(jiān)視所有分片
其中第一種方法是開倒車,等同于退回到前一步了,不可行,第三種方法是尋找一個(gè)中心化的機(jī)構(gòu)來(lái)監(jiān)視分片上的事件,這顯然與區(qū)塊鏈精神相悖。
第二種是可行的方向,Radix也是在這個(gè)方向上的嘗試。
4.Radix的解決方案
總體來(lái)說(shuō),Radix Tempo有三個(gè)組成部分:
- 節(jié)點(diǎn)P2P網(wǎng)絡(luò)
- 全球化分布式賬本數(shù)據(jù)庫(kù),以DAG的形式
- 生成有序事件的算法:DAG分片,為了解決雙花問(wèn)題,引入邏輯鐘算法
Universe && Shards
Universe
P2P網(wǎng)絡(luò)節(jié)點(diǎn)總稱為Universe。

上圖是節(jié)點(diǎn)關(guān)系圖,前面的幾張圖都是賬本圖。Universe被分成多個(gè)分片,節(jié)點(diǎn),節(jié)點(diǎn)上存儲(chǔ)賬本,可以只存儲(chǔ)部分賬本。每個(gè)節(jié)點(diǎn)上可以存儲(chǔ)多個(gè)分片,或者全部分片。仔細(xì)看藍(lán)色圓圈,第二行標(biāo)記了該節(jié)點(diǎn)存儲(chǔ)了哪些分片。
節(jié)點(diǎn)ID
在Universe中每個(gè)節(jié)點(diǎn)都有自己的ID,設(shè)定ID有兩個(gè)目的:
1.標(biāo)記誰(shuí)是鄰居
2.路由
具體的ID設(shè)定方法這里不做展開。
Shard: 部分賬本
在Radix的節(jié)點(diǎn)網(wǎng)絡(luò)里,全球賬本的子集稱作分片。相當(dāng)于一本書分成多分,每份叫作分片。分片是Radix的基礎(chǔ)特征。
P2P網(wǎng)絡(luò)和全球分布式賬本均已提及,現(xiàn)在重點(diǎn)在第三個(gè):生成有序事件的算法。再拆解來(lái)說(shuō),首先看事件的分類。
兩種事件:Protocol Event && Ledger Event
Protocol Event: 協(xié)議事件,用于節(jié)點(diǎn)之間進(jìn)行交流。
Ledger Event: 賬本事件,用于更新賬本
[圖片上傳失敗...(image-3e856f-1538659219200)]
節(jié)點(diǎn)之間主要通過(guò)Gossip協(xié)議進(jìn)行通信,完成必要信息的同步。
Gossip協(xié)議
下面是一種場(chǎng)景化描述:
A: 對(duì)x事件的哈希值H(x)進(jìn)行廣播: 有人想了解事件x嗎?
B: 給我把事件x的詳情發(fā)過(guò)來(lái)吧!
A: 好的,馬上發(fā)送事件x的信息給你~
B: 驗(yàn)貨完畢。開始廣播給H(x)自己的鄰居:有人想了解事件x嗎?
所以Gossip這個(gè)詞的含義本身就是指代八卦,八卦的傳播通常是指數(shù)級(jí)擴(kuò)散速率。
Atom是事件的實(shí)例
在Radix里,對(duì)應(yīng)到Universe宇宙這個(gè)名詞,他們用Atom原子來(lái)表示事件的名稱。前面說(shuō)事件分為兩類,相應(yīng)的原子也有兩類:
- Payload Atom: 對(duì)應(yīng)的是協(xié)議事件,用于節(jié)點(diǎn)之間互通有無(wú)
- Transfer Atom: 對(duì)應(yīng)的是賬本事件,是對(duì)分布式賬本進(jìn)行更新

其中Transfer Atom要比Payload Atom復(fù)雜得多,感性的認(rèn)識(shí)是,節(jié)點(diǎn)之間互通八卦是簡(jiǎn)單的,而牽涉到更新賬本數(shù)據(jù),事件的處理要復(fù)雜得多。比如雙花問(wèn)題。
結(jié)合前面提及的雙花問(wèn)題情景展示和更新賬本的事件,我們能想到,雙花問(wèn)題源頭在于事件,而處理這個(gè)問(wèn)題的方法也最好從源頭入手。
邏輯鐘就是這樣一種解決方案。
4.邏輯鐘的魔力是什么
通過(guò)邏輯鐘來(lái)解決雙花問(wèn)題的核心思想是:先對(duì)進(jìn)入網(wǎng)絡(luò)的事件進(jìn)行預(yù)處理。

這里簡(jiǎn)單講一講處理流程。我們先假定對(duì)于分布式的節(jié)點(diǎn)上的事件有了排序方式。比如上圖里,x,y,A,B,C,D,E等等都是事件,這些事件下方的數(shù)字表示按照邏輯時(shí)間進(jìn)行的排序。每?jī)蓚€(gè)事件形成一個(gè)向上的哈希值比如,H0,最上方H0和H1形成根哈希,根哈希值與整棵樹的節(jié)點(diǎn)息息相關(guān)。
給定一個(gè)事件y,現(xiàn)在我們驗(yàn)證它是否合法,根據(jù)時(shí)間順序,找到它的相鄰事件x,計(jì)算得出哈希值:H0;然后再根據(jù)H1計(jì)算出根哈希,比對(duì)已經(jīng)保存的根哈希C1,如果相同,則事件x合法。
形成的默克爾樹之間也會(huì)相連,比如第一棵樹的根哈希作為第二棵樹的一個(gè)葉子節(jié)點(diǎn)。
具體的驗(yàn)證機(jī)制牽涉到的數(shù)學(xué)公式比我這里提到的要更加復(fù)雜,而這樣的機(jī)制,非常依賴于事件的定序。下面講一講邏輯鐘的概念。
邏輯鐘
每個(gè)節(jié)點(diǎn)都有一個(gè)本地邏輯鐘,是一個(gè)只增長(zhǎng)的整數(shù)生產(chǎn)器,用于標(biāo)記節(jié)點(diǎn)上看到的新事件。見到一個(gè)新事件,數(shù)字加1。
區(qū)塊鏈的P2P網(wǎng)絡(luò)是一種分布式系統(tǒng),分布式系統(tǒng)中事件的順序非常重要。一般來(lái)說(shuō),在單機(jī)上可以按照物理時(shí)間定先后順序,但是在分布式系統(tǒng)中,這個(gè)方法就不可行,因?yàn)?strong>兩個(gè)節(jié)點(diǎn)上的時(shí)間做不到完全同步。事件的先后順序可能在毫厘之差?,F(xiàn)在的科技進(jìn)步,可能已經(jīng)足夠滿足絕大部分的事件定序,但是邏輯鐘,是另外一種分布式系統(tǒng)的奠基思想。
全序與偏序
全序關(guān)系:可以比較大小關(guān)系,比如1,2,3,4,5這種數(shù)字就可以比較大小,屬于全序關(guān)系
偏序關(guān)系:部分可以比較。
定義事件的全序關(guān)系的算法可以用來(lái)實(shí)現(xiàn)任意的分布式系統(tǒng)。其中,分布式系統(tǒng)可以認(rèn)為是多個(gè)網(wǎng)絡(luò)互聯(lián)的處理機(jī)組成的串行狀態(tài)機(jī),如果可以對(duì)輸入請(qǐng)求(事件)進(jìn)行排序,那么就可以實(shí)現(xiàn)任意的互聯(lián)的分布式系統(tǒng)。
分布式系統(tǒng)是物理上分離的多個(gè)進(jìn)程,進(jìn)程之間通過(guò)交換消息進(jìn)行通信。
不用鐘表來(lái)定義哪些事件發(fā)生在前。
分布式系統(tǒng)里包含多個(gè)進(jìn)程,每個(gè)進(jìn)程要處理一系列事件,進(jìn)程內(nèi)的事件按照先來(lái)后到定序沒(méi)有問(wèn)題,而進(jìn)程之間的時(shí)間定序,在不用時(shí)間戳的情況下,怎么辦呢?
總體而言,兩種情況是可以定序的:
- 發(fā)生在一個(gè)進(jìn)程內(nèi)的事件a,b,先后是定的
- 兩個(gè)進(jìn)程之間的事件a,b,如果b是由a觸發(fā)的,那么根據(jù)因果關(guān)系可知a前b后
在這兩種情況之外的定序,就需要人為設(shè)定一種規(guī)則。
當(dāng)前節(jié)點(diǎn)有自己的邏輯時(shí)鐘,不同節(jié)點(diǎn)之間的邏輯鐘標(biāo)記不同,每個(gè)節(jié)點(diǎn)可以記錄其他節(jié)點(diǎn)的時(shí)鐘數(shù)據(jù),這個(gè)稱之為向量時(shí)鐘。
當(dāng)兩個(gè)節(jié)點(diǎn)的邏輯時(shí)鐘順序出現(xiàn)沖突時(shí),我們可以聯(lián)想到印象筆記的數(shù)據(jù)更新,當(dāng)事件有先后時(shí),后者可以更新前者,但是有時(shí)沖突發(fā)生,系統(tǒng)無(wú)法判別如何更新數(shù)據(jù),就會(huì)交給人來(lái)進(jìn)行選擇。
關(guān)于邏輯時(shí)鐘的細(xì)節(jié),可以參考文獻(xiàn):
Leslie Lamport, Time, Clocks, and the Ordering of Events in a Distributed System, 1978.
END.
贊賞:
ERC20錢包地址:0x9a91F261dDA8619fC8E022886D293e0f64FA9e8c
EOS錢包賬戶:binaryworld1