2. 為什么要共識
理解了notary的交易確認(rèn)機(jī)制绰咽,會不會產(chǎn)生一個感覺:挺完美的嘛——半信任中介方式菇肃,加上各種規(guī)則的嚴(yán)防死守,感覺把雙花攻擊都杜絕了啊取募,還需要共識機(jī)制嗎琐谤?在給出這個問題的答案之前,我們先兜個圈子玩敏,介紹一些更基本的概念斗忌,不僅對后續(xù)討論Corda的共識機(jī)制有幫助,也有利于更深入地理解去中心化數(shù)據(jù)庫的一些關(guān)鍵概念旺聚。
只許州官放火织阳,不許百姓點燈
首先我們探討notary模式下節(jié)點間的信任關(guān)系:notary是兩個交易者之間的第三方,這是與交易者不同的一種角色砰粹,因此Corda系統(tǒng)節(jié)點間的信任關(guān)系相對于比特幣的節(jié)點間關(guān)系要復(fù)雜得多唧躲,無法做到全都是相互不信任的對等節(jié)點那么簡單的模型。(當(dāng)然碱璃,比特幣其實也會有全功能節(jié)點和SPV的關(guān)系弄痹,但性質(zhì)上跟notary和交易節(jié)點的關(guān)系還是有本質(zhì)差別的)。我們可以用一張圖來表示Corda系統(tǒng)中節(jié)點間信任關(guān)系的模型(暫時排除了Oracle等其他角色的節(jié)點嵌器,因為對共識這個主題不產(chǎn)生實質(zhì)性影響):
我們逐個看一下不同角色之間的幾種信任關(guān)系:
- 黑色連線的“互不信任”肛真,是所有交易系統(tǒng)的固有特征,也是區(qū)塊鏈/類區(qū)塊鏈系統(tǒng)要解決的問題爽航,這方面Corda與其他類型的系統(tǒng)沒有區(qū)別
- 紅色連線的“信任”蚓让,是基于notary的機(jī)制“強(qiáng)加”給我們的,是Corda區(qū)別于普通區(qū)塊鏈的根本特點讥珍。當(dāng)然历极, 這種信任也不是無條件的,各種密碼學(xué)手段串述、聯(lián)盟機(jī)制也會有所控制执解。不過,畢竟這成為了Corda模式的前提之一,因此對這種信任關(guān)系的討論超出了本文的范圍衰腌,只能作為討論的前提
- 藍(lán)色連線的“不信任”新蟆,則是本文第一部分所討論并解決的問題,也就是通過notary機(jī)制來防止雙花右蕊,從而使得“互不信任”的交易雙方通過notary可以進(jìn)行交易
- 最后剩下的就是notary之間的黃色連線:這種“互不信任”的關(guān)系琼稻,也就是R3一直強(qiáng)調(diào)的,notary可以是一些mutually distrusting的節(jié)點饶囚,這應(yīng)該也是現(xiàn)實世界的特點帕翻。如果系統(tǒng)無法處理這個互不信任的關(guān)系,則會導(dǎo)致文章第一部分所說的情況:整個網(wǎng)絡(luò)被notary劃分成若干相互隔絕的子網(wǎng)萝风,Corda這套體系恐怕也就沒什么意義了嘀掸。因此,系統(tǒng)必須有機(jī)制能夠讓這些notary在一起“合作”规惰,相信讀者已經(jīng)能夠猜出來:解決這個問題的睬塌,就是本文的主題——共識機(jī)制。
簡單地總結(jié)一下:Corda系統(tǒng)中歇万,強(qiáng)制引入了交易者對notary的信任關(guān)系揩晴,除此之外都是與其他區(qū)塊鏈系統(tǒng)類似的,只是因為多了一種角色而更加復(fù)雜贪磺。聽起來有點“只許州官放火硫兰,不許百姓點燈”的意味——你必須信任notary,而notary不信任你寒锚,并且它們之間也不互相信任劫映。沒辦法,這種模式的根本特點就是這樣刹前,不得不說是所有討論的一個略顯遺憾的前提苏研。不過,從后面共識機(jī)制的討論可以看到腮郊,對于一個體系而言,這個模式還是有一定價值的筹燕,至少可以防止風(fēng)險的擴(kuò)散轧飞。
UTXO vs. STXO
本文一開頭說到:“聽到R3的企業(yè)產(chǎn)品部門負(fù)責(zé)人Mike Ward簡介Corda的時候,受到相關(guān)概念的啟發(fā)”撒踪,這個相關(guān)概念过咬,就是指STXO(Spent Transaction Object)。STXO這個概念并不新鮮制妄,但是Mike Ward說:“Notary就是STXO的database”掸绞,這就有些與眾不同了。我想大部分人都能感受到,采用交易對象(“TXO”)模型的系統(tǒng)衔掸,如比特幣烫幕、Corda,一般人都只針對UTXO這個概念進(jìn)行討論敞映,STXO則基本上是個附屬品——經(jīng)常和UTXO成對出現(xiàn)较曼,但默認(rèn)不需要解釋。STXO DB這個提法振愿,更是鮮見——不僅在其他UTXO模型的區(qū)塊鏈系統(tǒng)中沒有看到過捷犹,在R3 Corda其他相關(guān)文檔中也從未出現(xiàn)。
很明顯冕末,對于“TXO”模型的系統(tǒng)萍歉,下面這個等式成立:TXO = STXO + UTXO,也就是說档桃,TXO是一個全集枪孩,STXO和UTXO則互為“補(bǔ)集”。針對這種關(guān)系胳蛮,有一個很容易推導(dǎo)出的結(jié)論:當(dāng)你能訪問整個TXO集合的時候销凑,用UTXO還是用STXO來判斷一個交易對象的狀態(tài)是等價的——你想知道一個交易對象是否UTXO,可以在UTXO的集合中進(jìn)行搜索仅炊,能搜到則是UTXO斗幼,搜不到就不是;反過來也可以在STXO集合中搜索抚垄,搜到了就不是UTXO蜕窿,搜不到就是。
理論上聽起來沒毛病呆馁,實踐中我們先看一下比特幣是怎么做的:比特幣(0.8版以上)的數(shù)據(jù)中桐经,有一個chainstate目錄,其下放的就是UTXO數(shù)據(jù)庫浙滤。這是個levelDB數(shù)據(jù)庫阴挣,比特幣的全功能節(jié)點需要對它進(jìn)行維護(hù):在確認(rèn)一個區(qū)塊時,首先要檢索所有交易的輸入項纺腊,如果發(fā)現(xiàn)沒有對應(yīng)的UTXO畔咧,應(yīng)該要拒絕。確認(rèn)區(qū)塊的時候揖膜,要把所有交易的輸入項在這個數(shù)據(jù)庫中刪除誓沸,并且把輸出項插入。由此可見壹粟,這是比特幣交易確認(rèn)的過程中非常重要的一步拜隧,融合在比特幣交易確認(rèn)的復(fù)雜流程中,這個處理的正確性決定了確保數(shù)據(jù)準(zhǔn)確以實現(xiàn)防止雙花的能力,是比特幣節(jié)點的重要功能之一洪添。
比特幣的這個實現(xiàn)模式有很合理的原因:隨著交易的不斷進(jìn)行垦页,越來越多的對象被“花掉”,因此STXO是一個有歷史積累的集合薇组,數(shù)量只增不減外臂,越積越多。UTXO則有增有減——雖然比特幣可以分解律胀,但除非所有交易都是一進(jìn)多出宋光,否則增減總量相對還是有匹配的,這樣可以保證UTXO的增長速度沒有那么快炭菌。既然如此罪佳,作為交易驗證過程中必須查詢的數(shù)據(jù),顯然選擇數(shù)據(jù)量小的那部分是合理的黑低,雖然需要不斷增刪赘艳,付出一定維護(hù)一致性的代價,總還是好過每一次查詢時間越來越長的問題克握±俟埽總之,這是個系統(tǒng)設(shè)計的取舍問題菩暗,而非原理上的區(qū)別掰曾。
全局 vs. 局部
那么,對于notary模式的系統(tǒng)而言停团,是不是應(yīng)該采用與比特幣相同的模式呢旷坦,即:隨時記錄/更新UTXO的信息,驗證交易的時候查詢一個對象是否UTXO佑稠?我們先給出答案秒梅,也就是上面提到的:notary是STXO數(shù)據(jù)庫——它是通過保存/查詢STXO來實現(xiàn)相關(guān)功能的。
在論證這個方案的合理性之前舌胶,又要談?wù)劯拍盍耍簄otary的數(shù)據(jù)是“局部”的捆蜀,每個notary只掌握經(jīng)過自己公證的交易,這也是Corda“信息部分可見”特性的根本保障幔嫂。所以漱办,嚴(yán)格來說UTXO和STXO這兩個概念對于notary而言,存在局部性和全局性雙重含義:從局部看婉烟,UTXO表示“沒有在我這里花過”,而STXO則表示“在我這里花過”暇屋;從全局看似袁,UTXO表示“在整個Corda網(wǎng)絡(luò)中沒有花過”,而STXO則表示“在整個Corda網(wǎng)絡(luò)中花過”。這樣一對比就很明顯了:在我這里花過昙衅,則在整個Corda網(wǎng)絡(luò)中花過扬霜;沒在我這里花過,不代表沒在別處花過而涉。反過來著瓶,要在整個網(wǎng)絡(luò)中沒花過,必須在所有notary那里都沒花過啼县;而在整個網(wǎng)絡(luò)中花過材原,只需要在任何一個notary那里花過就可以了。因此:某種意義上說季眷,STXO的概念是絕對的余蟹,無范圍限制的,而UTXO的概念是相對的子刮,局部的威酒。
從實踐的角度,我們首先看單一notary的情況:對于單個notary而言挺峡,他可以保存所有“經(jīng)過”他公證的交易記錄葵孤,從而擁有一切他處理過的交易的TXO記錄,因此對于一個notary而言橱赠,UTXO和STXO仍然是補(bǔ)集關(guān)系尤仍,采用保存哪一部分的方式來實現(xiàn)雙花檢測,從實現(xiàn)的角度看都是沒問題的病线。也就是說吓著,雖然概念上STXO比UTXO更具有絕對性,但實踐上卻因為兩者都被限定在一個局部送挑,因而用哪一類對象做判定依據(jù)仍然是等價的绑莺。
再看多個notary,并且出現(xiàn)對象notary變更的情況(如果沒有notary變更惕耕,任何交易對象的狀態(tài)變化仍然被永久限定在某個notary局部纺裁,等同于單notary)。根據(jù)前面的介紹司澎,notary變更是交易者將一個對象通過當(dāng)前notary跟自己做一個交易欺缘,形成一個新的UTXO,其notary是新notary挤安;原對象則變成了STXO谚殊。此時,新的UTXO是針對新notary的蛤铜,對于系統(tǒng)中其他notary而言嫩絮,沒有什么意義——由于UTXO概念的局部性丛肢,這個新的UTXO對象在他們那里“既非UTXO,也非STXO”剿干。原對象的STXO是針對原notary的蜂怎,但是由于STXO的全局性,其實對于整個Corda網(wǎng)絡(luò)的所有notary而言置尔,這應(yīng)該都是一個STXO杠步。
討論到這里,我們可以給出本文最重要的結(jié)論:對于一個基于notary機(jī)制的系統(tǒng)而言榜轿,當(dāng)有多個notary可能會關(guān)心一個TXO的狀態(tài)時幽歼,STXO是對所有notary都有意義的,UTXO則只對未來會處理到他的notary才有意義差导。
共識
說完了所有這些概念试躏,終于可以講講共識了。為了簡化討論设褐,我們只設(shè)想一個場景:不管出于什么原因颠蕴,比如程序bug、網(wǎng)絡(luò)通訊故障助析、甚至notary蓄意欺騙等等犀被,一個對象的當(dāng)前notary對它執(zhí)行了兩次notary變更,分別將其notary屬性變更為notary A外冀、notary B寡键,如果系統(tǒng)可以允許這種情況的發(fā)生,不就出現(xiàn)了雙花嗎雪隧?這也印證了上面討論過的前提——notary之間相互應(yīng)該是不信任的西轩,對變更notary這件事,由于涉及一個對象可以在其他notary那里進(jìn)行交易的問題脑沿,因此必須有機(jī)制保證一個對象變更兩次notary的行為受到阻止藕畔。唯一的辦法顯然就是notary變更必須要所有notary節(jié)點都達(dá)成共識——這也就是Corda系統(tǒng)中需要共識機(jī)制的根本原因,相信讀者非常容易理解和證明庄拇。
那么注服,從實踐角度而言,系統(tǒng)的“notary們”需要針對什么達(dá)成共識措近,又如何達(dá)成共識呢溶弟?相信真正理解了前面幾個概念的讀者,已經(jīng)有個大概的思路了:由于對象狀態(tài)的判斷要作為全系統(tǒng)notary達(dá)成一致的結(jié)論瞭郑,就應(yīng)該使用全系統(tǒng)一致的概念來進(jìn)行處理辜御,而根據(jù)前面的結(jié)論,STXO自然是應(yīng)該使用的概念屈张。因此擒权,notary作為STXO DB的模式苇本,就自然而然地成為共識機(jī)制的解決方案了。具體設(shè)計和實現(xiàn)方面的建議菜拓,我們就放到下一節(jié)再講。
小結(jié)
本節(jié)主要是一些概念的深入討論笛厦,首先是信任關(guān)系問題:基于notary的系統(tǒng)纳鼎,信任關(guān)系要復(fù)雜一些,notary之間互不信任裳凸,應(yīng)該是共識機(jī)制存在的大前提贱鄙。其次,UTXO和STXO在信息全局可見的系統(tǒng)中互為補(bǔ)集姨谷,因此實踐中使用哪個作為防止雙花的依據(jù)都是可以的逗宁,只需要根據(jù)系統(tǒng)設(shè)計的優(yōu)化方案來考慮。然而梦湘,對于notary模式的系統(tǒng)而言瞎颗,UTXO和STXO在局部和全局的意義是不同的,這將導(dǎo)致無論從概念上還是實踐上捌议,使用STXO作為交易確認(rèn)的依據(jù)更具有一致性哼拔,不過這一特點只在發(fā)生notary變更的情況下才會體現(xiàn)出來。綜合上述三點可以得出結(jié)論:Corda確實是需要共識機(jī)制的瓣颅,共識應(yīng)該針對狀態(tài)的notary變更倦逐,并且可以基于notary作為STXO DB的模式來實現(xiàn)。
此外宫补,作為本節(jié)的結(jié)束檬姥,我順便提一個有意思的問題供讀者思考:基于TXO模式的系統(tǒng),共識是針對TXO的狀態(tài)的(不管是UTXO還是STXO)粉怕,那基于賬戶模型的系統(tǒng)健民,共識機(jī)制是針對什么的呢,或者說應(yīng)該是怎樣一個模式呢斋荞?