如何理解區(qū)塊鏈技術(shù)?中心化賬本到去中心化賬本之間有什么技術(shù)演進(jìn)關(guān)系?本文是基于我在 360 區(qū)塊鏈開放日上的分享整理完善而成,演講時(shí)有些邏輯沒有講明白,感覺用文字表述可能更好一些。作為自己區(qū)塊鏈系列的開篇第一篇,談?wù)勗趺磸募夹g(shù)的角度理解區(qū)塊鏈。
說到區(qū)塊鏈技術(shù)分享,區(qū)塊鏈相關(guān)的各種技術(shù)詞匯就紛至杳來。區(qū)塊鏈領(lǐng)域是一個(gè)喜歡造新詞的領(lǐng)域,這也給想了解這個(gè)領(lǐng)域技術(shù)的人造成了門檻。我一直想梳理下區(qū)塊鏈的技術(shù)演進(jìn)邏輯,試圖從互聯(lián)網(wǎng)技術(shù)的發(fā)展角度來解釋區(qū)塊鏈技術(shù),這樣可以讓互聯(lián)網(wǎng)領(lǐng)域的技術(shù)人更容易理解區(qū)塊鏈。
技術(shù)有沒有世界觀?
技術(shù)本身的目標(biāo)是對(duì)現(xiàn)實(shí)抽象和建模,所以技術(shù)實(shí)際上有自己對(duì)世界的理解和假設(shè)。比如編程范式里的面對(duì)對(duì)象和函數(shù)式編程,有完全不同的世界觀理解。而區(qū)塊鏈對(duì)世界是一種怎么樣的抽象呢?
我們還是從蕭伯納那句名言開始。
"你和我各有一個(gè)蘋果,如果我們交換蘋果的話,我們還是只有一個(gè)蘋果。但當(dāng)你和我各有一個(gè)想法,我們交換想法的話,我們就都有兩個(gè)想法了"。— 蕭伯納
這句話也被很多人用來解釋區(qū)塊鏈以及互聯(lián)網(wǎng)的區(qū)別。交換蘋果代表價(jià)值交換,交換想法代表信息交換。信息交換可以保留多個(gè)副本,但價(jià)值交換就不行。所以流行的一個(gè)說法是:"互聯(lián)網(wǎng)-信息交換 ,區(qū)塊鏈-價(jià)值交換"。
但是交換信息就不需要考慮價(jià)值了么?其實(shí)也不是,畢竟貢獻(xiàn)想法也是需要激勵(lì)機(jī)制的?,F(xiàn)在的互聯(lián)網(wǎng)就沒有價(jià)值交換了嗎?區(qū)塊鏈不也是在信息世界的嗎?本質(zhì)的問題實(shí)際是:"如何在信息世界進(jìn)行價(jià)值交換?或者說如何通過交換信息的方式進(jìn)行價(jià)值交換?"
這個(gè)問題其實(shí)也不是一個(gè)新問題。在沒有互聯(lián)網(wǎng)的時(shí)代,人類就在嘗試。比如各國(guó)都普遍實(shí)行的不動(dòng)產(chǎn)登記制度。你買房買的是房子的控制權(quán)嗎?或者說買房的時(shí)候你住進(jìn)去就算買到了嗎?實(shí)際上不是,要不動(dòng)產(chǎn)登記賬本變更后才算,這個(gè)登記變更實(shí)際上就是信息交換。無論這個(gè)賬本是原來的紙質(zhì)賬本,還是變成計(jì)算機(jī)的數(shù)據(jù)庫,甚至再到未來的區(qū)塊鏈,載體變了本質(zhì)上是沒變的。再比如銀行的財(cái)產(chǎn)登記,股票交易所的股票登記,都是一個(gè)道理,如果說貨幣還有紙幣這種物理實(shí)體代表,股票則是純信息化的,沒人見過股票長(zhǎng)什么樣子吧。
所以總結(jié)一下,信息世界進(jìn)行價(jià)值交換的唯一方式是統(tǒng)一的賬本,并且對(duì)這個(gè)賬本的要求是它必須是一個(gè)公共知識(shí)(common knowledge),可以簡(jiǎn)單理解成大家常說的共識(shí)。唯有這樣,信息的副本才不會(huì)生效,比如黑客即便是黑了交易所復(fù)制了數(shù)據(jù),也不可能重新搭建出一個(gè)交易所來讓大家交易。至于如何達(dá)成這樣的共識(shí),是通過市場(chǎng)競(jìng)爭(zhēng),還是依賴權(quán)威機(jī)構(gòu),這里暫不討論。
現(xiàn)在區(qū)塊鏈來了,要搞去中心化賬本。去中心化這個(gè)詞是個(gè)熱詞,網(wǎng)上一直爭(zhēng)論不休。由于時(shí)間關(guān)系這里不進(jìn)行詳細(xì)闡述,等有機(jī)會(huì)單獨(dú)寫文章闡述。這里只簡(jiǎn)單說明下我個(gè)人思考的去中心化的兩個(gè)方面:
賬本用戶側(cè)去中心化 這個(gè)是從用戶側(cè)的準(zhǔn)入機(jī)制上考量,比如傳統(tǒng)媒體只有專業(yè)媒體人可以發(fā)布內(nèi)容,到互聯(lián)網(wǎng)門戶,再到微博微信公眾號(hào)等自媒體,本質(zhì)上也是一種去中心化的過程。
賬本供給側(cè)去中心化 這個(gè)是從賬本的供給角度考量。比如還是前面的例子,傳統(tǒng)媒體有很多,各種報(bào)紙雜志,掛一個(gè)媒體影響不大,到門戶時(shí)代就少了,再到現(xiàn)在基本就剩下幾個(gè)平臺(tái)了,掛一個(gè)平臺(tái)影響就大了。那現(xiàn)在能不能再反過來,同一個(gè)賬本由多個(gè)供給方一起提供?這樣就兼具二者優(yōu)勢(shì)了。區(qū)塊鏈主要關(guān)注的是這個(gè)方向。
至于為什么賬本會(huì)向去中心化賬本演進(jìn),動(dòng)力在哪里,這里就不展開了。先從技術(shù)演進(jìn)角度來理解一下,從中心化的賬本到去中心化賬本之間的技術(shù)演進(jìn)過程。
賬本架構(gòu)演進(jìn)之路
我總結(jié)了這樣一個(gè)演進(jìn)過程:
單數(shù)據(jù)庫賬本
這個(gè)架構(gòu)圖做互聯(lián)網(wǎng)應(yīng)用的朋友應(yīng)該看起來很親切。早期的企業(yè)以及互聯(lián)網(wǎng)應(yīng)用都是這個(gè)樣子的,應(yīng)用界面面向最終用戶,應(yīng)用本身的程序封裝了業(yè)務(wù)邏輯,應(yīng)用狀態(tài)直接存儲(chǔ)到數(shù)據(jù)庫中。這時(shí)候關(guān)注的賬本相關(guān)技術(shù)主要是『事務(wù)』。通過數(shù)據(jù)庫提供的事務(wù)機(jī)制,保證了賬本的原子性操作。
分布式數(shù)據(jù)庫賬本
當(dāng)單機(jī)數(shù)據(jù)庫無法承載讀寫或者數(shù)據(jù)的時(shí)候,就有了分布式數(shù)據(jù)庫。分布式數(shù)據(jù)庫的數(shù)據(jù)分散到了不同的節(jié)點(diǎn),通過分片以及多副本來解決上述問題。但同時(shí)帶來的問題是如何保證同一個(gè)分片在不同節(jié)點(diǎn)的數(shù)據(jù)的一致性以及跨節(jié)點(diǎn)的分布式事務(wù)。這時(shí)候賬本相關(guān)技術(shù)主要是『分布式共識(shí)算法(paxos,raft ),分布式事務(wù)』。分布式事務(wù)由于其復(fù)雜性,分布式數(shù)據(jù)庫不一定能夠提供,很多情況需要在業(yè)務(wù)邏輯里處理。
多機(jī)房賬本
隨著賬本越來越重要,異地副本都不能滿足需求,需要異地多活了,于是有了多機(jī)房方案。多機(jī)房方案里,不同的機(jī)房之間需要同步數(shù)據(jù),并且保證一致性。這時(shí)候賬本技術(shù)的挑戰(zhàn)主要是『跨機(jī)房分布式共識(shí)算法,應(yīng)用狀態(tài)的復(fù)雜性』。前者是說分布式共識(shí)算法需要考慮更復(fù)雜的網(wǎng)絡(luò)場(chǎng)景,后者是說大部分應(yīng)用的狀態(tài)維護(hù)比較復(fù)雜,不僅僅在數(shù)據(jù)庫中,只是通過一個(gè)跨機(jī)房復(fù)制工具把數(shù)據(jù)庫狀態(tài)復(fù)制過去,是很難應(yīng)對(duì)多機(jī)房應(yīng)用場(chǎng)景,實(shí)際上需要應(yīng)用架構(gòu)的改變。
多運(yùn)營(yíng)方賬本
上面的賬本都只考慮同一個(gè)主體運(yùn)營(yíng)維護(hù)的場(chǎng)景,內(nèi)部的信任較高。但如果是多方共同維護(hù)一個(gè)賬本的場(chǎng)景,也就是上一個(gè)方案的不同機(jī)房其實(shí)屬于不同的主體。這樣的場(chǎng)景下,另外一方無法直接信任應(yīng)用的最終狀態(tài),所以在不同機(jī)房同步的不能是應(yīng)用的狀態(tài),而是應(yīng)用的 Event(事件)。無論是本機(jī)房用戶寫操作的 Event 還是從其他機(jī)房同步過來的,都需要經(jīng)過業(yè)務(wù)邏輯校驗(yàn)處理后再變更應(yīng)用狀態(tài)。這實(shí)際就是 EventSource/CQRS 的架構(gòu),也是很多聯(lián)盟鏈的架構(gòu)。多機(jī)房場(chǎng)景下其實(shí)也會(huì)用這種架構(gòu),主要區(qū)別是在對(duì)從其他機(jī)房同步過來的 Event 的信任度。這時(shí)候,賬本技術(shù)的挑戰(zhàn)除了跨機(jī)房分布式共識(shí)算法,還有共識(shí)算法和業(yè)務(wù)邏輯融合。在前面場(chǎng)景里的共識(shí)算法,基本只關(guān)心數(shù)據(jù),不關(guān)心業(yè)務(wù),共識(shí)算法只保證數(shù)據(jù)的一致性,并不保證數(shù)據(jù)在業(yè)務(wù)場(chǎng)景下的合法性。但在這個(gè)場(chǎng)景下,共識(shí)算法要保證只對(duì)合法的數(shù)據(jù)達(dá)成一致,二者融合了。無法直接沿用上面幾種分布式共識(shí)算法,需要考慮作弊情況的共識(shí)算法,比如 BFT 這樣的。
有人會(huì)問,有什么動(dòng)力要將同一個(gè)賬本交給多個(gè)運(yùn)營(yíng)方呢?那我們拿互聯(lián)網(wǎng)電商來說明這個(gè)場(chǎng)景。當(dāng)前的電商,一方面對(duì)接商家和商家的庫存管理系統(tǒng),另外一方面對(duì)接銀行和快遞系統(tǒng),以及最終用戶。一個(gè)商品,從庫存管理系統(tǒng),到電商平臺(tái),用戶購(gòu)買后,從銀行扣錢,發(fā)送快遞,實(shí)際上是同一個(gè)賬本上的信息在不同的運(yùn)營(yíng)方系統(tǒng)之間的同步。當(dāng)前的實(shí)現(xiàn)方式是通過遠(yuǎn)程調(diào)用或者商家和用戶介入手工操作。那不同的賬本之間如何保證一致性呢?只能定時(shí)對(duì)賬清算,因?yàn)檫h(yuǎn)程調(diào)用本質(zhì)上只是信息傳遞,無法保證一致性。如果這時(shí)候有個(gè)多方共享的賬本,架構(gòu)就會(huì)像上面那樣,不僅架構(gòu)更優(yōu)雅,同時(shí)結(jié)算效率會(huì)更高。
關(guān)于聯(lián)盟鏈的技術(shù)架構(gòu)以及模式的更詳細(xì)分析,我會(huì)在下一篇文章中細(xì)說。
去中心化賬本
去中心化賬本這個(gè)概念沒有非常準(zhǔn)確的定義,但我們這里可以簡(jiǎn)單的理解成 Peer to Peer 網(wǎng)絡(luò) + 賬本。Peer to Peer 網(wǎng)絡(luò)的特征是無準(zhǔn)入機(jī)制,給人的印象也是不可靠,更不追求一致性,而賬本是要追求一致性的。比特幣創(chuàng)造性的把二者結(jié)合起來。所以一般所說的去中心化賬本,或者公鏈,關(guān)鍵一個(gè)特性就是無準(zhǔn)入機(jī)制。
之前的賬本都是有準(zhǔn)入機(jī)制的,并且賬本本身的運(yùn)營(yíng)成本以及收益通過系統(tǒng)外的機(jī)制來解決,那如果去掉準(zhǔn)入限制,同時(shí)賬本的運(yùn)營(yíng)成本以及收益也通過賬本系統(tǒng)內(nèi)置的機(jī)制來調(diào)節(jié),會(huì)有哪些新的挑戰(zhàn)?
如何激勵(lì)生產(chǎn)者?生產(chǎn)者為什么提供服務(wù)器資源?如何度量生產(chǎn)者的工作?
如何實(shí)現(xiàn)一致性?無準(zhǔn)入機(jī)制的情況下,節(jié)點(diǎn)數(shù)不確定,隨時(shí)加入退出,無法用 BFT 這樣的投票共識(shí)算法。
如何防攻擊?比如生產(chǎn)大量數(shù)據(jù)(DoS攻擊),偽造大量節(jié)點(diǎn)(女巫攻擊)。有了激勵(lì)就有了攻擊和作弊的利益動(dòng)機(jī),傳統(tǒng)的 Peer to Peer 網(wǎng)絡(luò)沒有激勵(lì),一般人也不會(huì)做損人不利己的事情。
下面我們通過幾個(gè)公鏈?zhǔn)莵矸治錾厦娴膯栴}。
Bitcoin
比特幣首先帶給我們的是一套內(nèi)生的激勵(lì)機(jī)制。雖然比特幣到底應(yīng)該理解成貨幣,還是數(shù)字黃金,還是股票,大家爭(zhēng)論不休。這里我們把比特幣設(shè)想成一個(gè)創(chuàng)業(yè)公司,這個(gè)創(chuàng)業(yè)公司要做一個(gè)記賬交易系統(tǒng)。于是它發(fā)行了2100萬股,發(fā)行規(guī)則直接寫到了這個(gè)記賬系統(tǒng)的代碼中,分期釋放,獎(jiǎng)勵(lì)給給這個(gè)系統(tǒng)提供運(yùn)行資源的人。而用戶拿什么來交易呢?也用它的股票來做交易媒介。這樣它就實(shí)現(xiàn)了軟件系統(tǒng)在經(jīng)濟(jì)上的自舉,也帶給軟件系統(tǒng)一種能力:在程序算法中引入經(jīng)濟(jì)博弈機(jī)制。
Proof of Work
PoW 到底應(yīng)該算是激勵(lì)的評(píng)估機(jī)制,還是共識(shí)算法,還是反 DoS 策略?實(shí)際上它兼具多種功能。所以這也是公鏈的共識(shí)算法和傳統(tǒng)分布式共識(shí)算法的差異之處,容易讓人迷惑。
最早應(yīng)用 PoW 的是 hashcash,它的主要目的就是通過 PoW 來實(shí)現(xiàn)郵件的反垃圾,關(guān)鍵點(diǎn)是通過 PoW 制造額外成本,這樣發(fā)郵件少的用戶可以接受成本,但發(fā)垃圾郵件的用戶就很難承擔(dān)這樣的成本。
同時(shí),有了成本也就可以作為貢獻(xiàn)的評(píng)估標(biāo)準(zhǔn),Proof of Work 這個(gè)詞,顧名思義,就像是一個(gè)工作的評(píng)估機(jī)制。運(yùn)行比特幣系統(tǒng),需要機(jī)房,機(jī)器,帶寬等,如何通過程序來評(píng)估資源提供者的工作呢?比特幣的做法就是算哈希函數(shù),要求算出來的哈希值小于一個(gè)難度。雖然簡(jiǎn)單粗暴,但它難計(jì)算,易驗(yàn)證,是一種可行的辦法。
中本聰共識(shí)(Nakamoto Consensus)
只有 PoW 是無法實(shí)現(xiàn)一致性的,需要再加上其他的一些策略,統(tǒng)稱為中本聰共識(shí)。
內(nèi)置的校驗(yàn)機(jī)制(包括 hash 難度校驗(yàn),merkle 校驗(yàn),鏈?zhǔn)疥P(guān)系校驗(yàn),UTXO 校驗(yàn)等),每個(gè)區(qū)塊只認(rèn)可通過校驗(yàn)的合法區(qū)塊,拒絕非法區(qū)塊。
最長(zhǎng)鏈選擇 如果由于網(wǎng)絡(luò)延遲造成軟分叉,每個(gè)節(jié)點(diǎn)應(yīng)該在最長(zhǎng)的一條鏈上繼續(xù)工作。
如果有節(jié)點(diǎn)試圖違反以上規(guī)則,則會(huì)帶來經(jīng)濟(jì)成本(自己挖出的塊不合法被拒絕,在短鏈上的工作不被認(rèn)可等),通過經(jīng)濟(jì)上的博弈實(shí)現(xiàn)防作弊。
中本聰共識(shí)的特點(diǎn)是無交互,純異步,每個(gè)節(jié)點(diǎn)只需要按照內(nèi)置的規(guī)則處理即可,無需和其他節(jié)點(diǎn)交互協(xié)調(diào)。
區(qū)塊與鏈?zhǔn)浇Y(jié)構(gòu)
比特幣帶來的區(qū)塊與鏈?zhǔn)浇Y(jié)構(gòu),也是區(qū)塊鏈這個(gè)名字的由來。但區(qū)塊和鏈?zhǔn)浇Y(jié)構(gòu)是必須的嗎?真的存在一條這樣的全局鏈?zhǔn)浇Y(jié)構(gòu)嗎?實(shí)際上區(qū)塊只是一種為了降低網(wǎng)絡(luò)開銷的批量操作,鏈?zhǔn)浇Y(jié)構(gòu)的主要目的是建立一種時(shí)間上的依賴關(guān)系,即便兩個(gè)交易本身不相關(guān),但由于鏈?zhǔn)浇Y(jié)構(gòu)的存在,后面的交易實(shí)際上給前面的交易做了背書,增加了篡改和回滾的成本,因?yàn)橐坏┫胍坊厍懊娴慕灰?,必然也?huì)影響后來的交易。這種結(jié)構(gòu)和關(guān)系只是共識(shí)協(xié)議的一部分,并不存在這樣一個(gè)全局的結(jié)構(gòu),具體每個(gè)節(jié)點(diǎn)如何保存數(shù)據(jù),是節(jié)點(diǎn)自己決定的。鏈?zhǔn)浇Y(jié)構(gòu)雖然存在分叉,但只要配合共識(shí)機(jī)制,最終可以選擇出一條唯一的鏈,達(dá)到最終一致性。也就是說,只要能達(dá)到這個(gè)目標(biāo),區(qū)塊和鏈?zhǔn)浇Y(jié)構(gòu)并不是必須的,也沒必要因?yàn)檫@個(gè)名字糾結(jié)什么是真正的區(qū)塊鏈。
UTXO 與 MerkleTree
UTXO 本身是一種復(fù)式記賬法。比特幣的定位是數(shù)字貨幣,UTXO 屬于它的賬本業(yè)務(wù)邏輯。這種記賬法的好處是任何一筆交易都可以回溯到創(chuàng)幣交易,保證貨幣只能由創(chuàng)幣交易產(chǎn)生,無法憑空產(chǎn)生。如果只是貨幣場(chǎng)景,UTXO 確實(shí)比 Account 模型要安全,但如果考慮到其他應(yīng)用場(chǎng)景,應(yīng)用的狀態(tài)就很難設(shè)計(jì)出一種 UTXO 模型來追蹤變更,這也是為什么后來的面向應(yīng)用的鏈放棄 UTXO 的原因。
比特幣通過 MerkleTree 提供交易證明,方便沒有全量賬本的輕客戶端校驗(yàn)交易。但比特幣的 MerkleTree 是每個(gè)賬本一個(gè),沒有全局 MerkleTree,也就是說沒辦法提供全局證明,輕客戶端的實(shí)現(xiàn)就會(huì)比較復(fù)雜。這方面比特幣社區(qū)也討論很久,詳情可以參看我以前的一篇文章:《談?wù)剠^(qū)塊鏈的 UTXO 證明》。后面會(huì)談到 Ethereum 的改進(jìn)。
Bitcoin Script
比特幣的 Script 可以理解成一種支付校驗(yàn)邏輯的擴(kuò)展能力。前面說了,去中心化賬本的業(yè)務(wù)邏輯和共識(shí)機(jī)制融合在一起了,支付校驗(yàn)本身也屬于業(yè)務(wù)邏輯。這種邏輯的變更會(huì)影響共識(shí),進(jìn)而可能導(dǎo)致硬分叉,而提供一種可自定義邏輯的腳本,則是一種兼顧的策略。
同時(shí),比特幣的這種能力也給后來的染色幣(Colored Coin)提供了機(jī)會(huì)。本來比特幣的賬本只能記錄比特幣的交易,但有了 Script 后,可以在 Script 嵌入自定義數(shù)據(jù)結(jié)構(gòu),可以理解成對(duì)比特幣賬本的數(shù)據(jù)擴(kuò)展。染色幣就利用這種機(jī)制來制造新的加密幣。
這種機(jī)制的好處是染色幣不需要重新構(gòu)建一個(gè)去中心化的賬本網(wǎng)絡(luò),降低了時(shí)間以及經(jīng)濟(jì)成本。但缺點(diǎn)也很明顯,一方面,這種目的畢竟不屬于比特幣的初始設(shè)想,得不到更多支持,另外一方面,比特幣 Script 只能嵌入數(shù)據(jù),無法嵌入對(duì)這種數(shù)據(jù)的校驗(yàn)邏輯,校驗(yàn)邏輯還需要通過部署獨(dú)立的節(jié)點(diǎn)程序來實(shí)現(xiàn)。
于是這種需求背景下,以太坊產(chǎn)生了。
Ethereum
以太坊的設(shè)想是既然運(yùn)行一個(gè)去中心化賬本成本這么高,那能不能先運(yùn)行一個(gè)通用的賬本,然后提供機(jī)制允許用戶在上面自定義業(yè)務(wù)邏輯?所以它的目的不是數(shù)字貨幣,而是運(yùn)行『智能合約』的平臺(tái)。如果說以太坊當(dāng)前的 PoW 共識(shí)機(jī)制等只是在比特幣 PoW 基礎(chǔ)上的優(yōu)化改良,它的最關(guān)鍵的創(chuàng)新就是智能合約和 Global State Trie。
智能合約
這里順便扯一下對(duì)『智能合約』的看法。很多批評(píng)『智能合約』的人說這只是一種腳本程序,并不智能。那這樣說智能手機(jī)(Smart Phone)哪里智能了?智能家居,智能手表,智能xx不都一樣?中文領(lǐng)域里把 Smart 和 Intelligence(Artificial Intelligence,AI 人工智能) 都翻譯成智能,確實(shí)造成混淆。但這是歷史遺留問題了,糾結(jié)這個(gè)名字沒有意義。
于是以太坊提供了一種圖靈完備的腳本語言來定義業(yè)務(wù)邏輯,交易數(shù)據(jù)中明確允許嵌入自定義數(shù)據(jù)結(jié)構(gòu)(以太坊 transaction 的 data 字段),鏈不關(guān)心合約本身的邏輯,只是通過在不同的節(jié)點(diǎn)重復(fù)運(yùn)行合約,來保證合約的輸出是確定的。它和比特幣的 Script 的差異不僅在是否圖靈完備,更大的差異在于自定義數(shù)據(jù)和自定義邏輯的結(jié)合。染色幣這樣的場(chǎng)景,它同時(shí)托管了染色幣的賬本數(shù)據(jù)和交易邏輯,于是引來了一場(chǎng)發(fā)幣的熱潮。它這種機(jī)制帶來的挑戰(zhàn)是不同的場(chǎng)景的業(yè)務(wù)邏輯的輸入輸出不一樣,如何存儲(chǔ)和維護(hù)?如何提供證明?
于是它創(chuàng)造性的引入了 Global State Trie。
Global State Trie
以太坊的黃皮書中通過一個(gè)公式來定義以太坊。
這個(gè)公式中的 sigma 表以太坊的狀態(tài),Upsilon 代表處理函數(shù)(包括合約以及內(nèi)置的 Ether 交易邏輯),T 代表交易(包含調(diào)用合約的交易), t+1 的狀態(tài)等于處理函數(shù)在 t 狀態(tài)基礎(chǔ)上處理 T 的執(zhí)行結(jié)果。
而這里的狀態(tài)的程序表達(dá)形式就是一個(gè) Merkle Patrica Trie。
這是一個(gè)兩層的 Trie,第一層的葉節(jié)點(diǎn)上保存的是每個(gè) Account 的余額(Balance),以及針對(duì)合約 Account 的 CodeHash 和 Storage root。Storage root 是另外一個(gè) Trie 結(jié)構(gòu),葉節(jié)點(diǎn)是合約內(nèi)部的狀態(tài)。任何一個(gè) Account 的余額或者合約狀態(tài)變更,都會(huì)導(dǎo)致 Global State Root 變更,而每個(gè)區(qū)塊都會(huì)在區(qū)塊頭上帶上當(dāng)前區(qū)塊中的 Transaction 執(zhí)行完后的 State Root 。
這樣,一方面提供一種全局校驗(yàn)機(jī)制,只要比較 State Root 就可以快速知道不同節(jié)點(diǎn)的狀態(tài)是否一致,這個(gè)和 Git 中引入 Merkle hash 證明機(jī)制的原理是一樣的。Linus 一次分享 Git 的時(shí)候也說了,Git 的這種機(jī)制可以讓他方便的信任來自第三方保存的代碼。有了這套機(jī)制后,新節(jié)點(diǎn)同步的時(shí)候可以信任一定區(qū)塊以前的全局狀態(tài),而不是完全通過區(qū)塊回放來重新構(gòu)建。這也回答了我們前面提出的那個(gè)問題,如何快速校驗(yàn)不同機(jī)房的數(shù)據(jù)狀態(tài)一致性。
另外一方面,它也提供了一種單個(gè)賬號(hào)狀態(tài)和全局狀態(tài)關(guān)系的證明能力,可以通過 Merkle Path 證明一個(gè)賬號(hào)的當(dāng)前狀態(tài)和全局狀態(tài)之間的關(guān)系,輕錢包實(shí)現(xiàn)就會(huì)更容易。
如果純粹從模型看,以太坊已經(jīng)是一個(gè)非常理想的模型了。大家常說程序就是數(shù)據(jù)結(jié)構(gòu)加算法,它既提供了數(shù)據(jù)結(jié)構(gòu)的自定義以及存儲(chǔ)能力,也提供了算法的計(jì)算環(huán)境,理論上任何程序都可以放上去運(yùn)行了。但套用一句俗話,理想是豐滿的,現(xiàn)實(shí)是骨感的,這樣的全球分布式賬本的存儲(chǔ)和計(jì)算成本太高了,稍微復(fù)雜的應(yīng)用都很難運(yùn)行起來。
EOS
EOS 自項(xiàng)目啟動(dòng)開始,主打的旗幟就是吞吐和性能。如果說比特幣和以太坊兩個(gè)項(xiàng)目帶有一種理想主義特質(zhì),EOS 則帶有非常明顯的實(shí)用主義特質(zhì)。
前面說到,Peer to Peer 網(wǎng)絡(luò)的問題是無準(zhǔn)入,節(jié)點(diǎn)數(shù)不固定,匿名情況下防作弊成本高。EOS 的 DPoS 思路就是通過投票選舉,讓參與共識(shí)的節(jié)點(diǎn)在一定時(shí)間內(nèi)保持穩(wěn)定,同時(shí)通過競(jìng)選機(jī)制,讓競(jìng)選節(jié)點(diǎn)不再匿名,降低防作弊的成本,然后把注意力集中到吞吐以及應(yīng)用模型的改進(jìn)上。
互聯(lián)網(wǎng)應(yīng)用開發(fā)者看了 EOS 的應(yīng)用模型后,會(huì)感覺更容易理解。看它的 ABI 描述文件,第一眼的感覺就像是在定義應(yīng)用表結(jié)構(gòu)。它交易結(jié)構(gòu)中直接嵌入的是 Message,相當(dāng)于 EventSource 架構(gòu)中的 Event。以太坊的鏈上還保留了 Ether 本身的交易邏輯,而 EOS 上 EOS Token 本身也是通過合約實(shí)現(xiàn)的,只是合約分為系統(tǒng)合約和用戶應(yīng)用合約,整個(gè)鏈成為了一個(gè)更純粹的合約執(zhí)行平臺(tái)。
EOS 中沒有 Global State Trie,這個(gè)問題 Vitalik 和 BM 爭(zhēng)論過很多次,這代表了兩種不同的思維方式,感興趣的人可以找來看看,我個(gè)人是同意 Vitalik 的看法的。
EOS 另外兩個(gè)值得關(guān)注的點(diǎn)是它的經(jīng)濟(jì)模型以及鏈上治理模型。它試圖提供免費(fèi)的交易,但畢竟資源有限,所以通過其他限制來替代交易費(fèi)模式。鏈上治理帶來的啟示是,大家常說的共識(shí)到底包含哪些方面?代碼中的共識(shí)邏輯?最終的一致性賬本?社區(qū)的用戶選擇是否也可以沉淀到鏈上,以解決分歧以及約束區(qū)塊生產(chǎn)者(礦工)?
到底需要多少去中心化賬本?
前面我們分析了賬本的架構(gòu)演進(jìn)以及幾條典型的公鏈。如果說比特幣是一個(gè)區(qū)塊鏈應(yīng)用的演示,以太坊和 EOS 則可以看成應(yīng)用實(shí)驗(yàn)平臺(tái)。那到底世界需要多少去中心化賬本?多少條公鏈?通用公鏈的擴(kuò)展性困境不僅僅來自技術(shù)層面的容量和吞吐,同時(shí)也來自應(yīng)用方向。做一個(gè)有無限可能的鏈,還是一個(gè)和具體業(yè)務(wù)邏輯綁定的鏈?是新鏈開發(fā)者必須要面臨的選擇。
當(dāng)前的情況下,通過分片來解決擴(kuò)展性(容量和吞吐)問題的復(fù)雜度過高,短期很難落地,于是社區(qū)提出了分層的概念。
Layer2 的道理很簡(jiǎn)單,也符合大家的認(rèn)知常識(shí)。不同的賬本需要的安全級(jí)別以及共識(shí)范圍是不一樣的,沒必要每個(gè)交易都需要全球共識(shí)。但關(guān)鍵是怎么做到呢?
它的核心思路是通過 Layer1(鏈層)提供的機(jī)制來約束 Layer2,具體方案可分為兩種:
狀態(tài)通道(比如閃電網(wǎng)絡(luò))顧名思義,它主要是兩個(gè)人之間的一個(gè)通道,相當(dāng)于兩個(gè)人之間的一個(gè)賬本。因?yàn)槊總€(gè)賬本只有兩個(gè)人,所以賬本上只需記錄每個(gè)人的最終狀態(tài),無需記錄每次交易,最后按最終狀態(tài)分賬就行,沒有直接通道的用戶之間可以通過路由中轉(zhuǎn)的方式來進(jìn)行交易。鏈提供機(jī)制,避免作弊以及不合作風(fēng)險(xiǎn),具體安全策略這里不詳述,有興趣的朋友看我的視頻10分鐘理解閃電網(wǎng)絡(luò)以及區(qū)塊鏈二層解決方案的原理。
多方鏈下賬本 如果是多個(gè)人之間可以直接互相交易,又不希望建立過多通道(成本原因),就只能通過維護(hù)一個(gè)多人的共同賬本來實(shí)現(xiàn)了。這個(gè)賬本也必須找到托管方,但關(guān)鍵是如何保證安全。我們傳統(tǒng)的賬本安全其實(shí)是靠審計(jì),用戶以及第三方監(jiān)督等機(jī)制實(shí)現(xiàn),那能不能把這套機(jī)制也在鏈上實(shí)現(xiàn)?鏈用來公示以及爭(zhēng)議裁判(雙方需要提供證明,程序自動(dòng)判決),用戶和賬本托管方互相監(jiān)督,再或者引入其他托管方把賬本變成一個(gè)聯(lián)盟鏈。
關(guān)于 Layer2 的各種方案的探索,至少給我們展示了一個(gè)可能,就是各種賬本之前并沒有涇渭分明的界線,會(huì)有機(jī)制將它們混合在一起,共同形成價(jià)值網(wǎng)絡(luò),后面會(huì)寫再文章單獨(dú)分析。
總結(jié)
本文整體從賬本的作用以及架構(gòu)演進(jìn)來闡釋區(qū)塊鏈。闡釋區(qū)塊鏈的方式有很多種,我這里主要以技術(shù)演進(jìn)的角度進(jìn)行。
早就想寫一個(gè)系列,談?wù)剠^(qū)塊鏈,但年初的時(shí)候區(qū)塊鏈鼓吹者甚多,作為一個(gè)技術(shù)人,完全插不上嘴。最近熊市,冷清了許多,連區(qū)塊鏈?zhǔn)且环N落后技術(shù)的言論都出來了,于是決定寫一寫。
區(qū)塊鏈絕對(duì)不是一種落后的技術(shù),而是一種更優(yōu)秀的分布式系統(tǒng)。同時(shí)它帶來的技術(shù)挑戰(zhàn)和契機(jī)也非常大,以前我們主要關(guān)心數(shù)據(jù)如何計(jì)算以及存儲(chǔ),區(qū)塊鏈時(shí)代我們更要關(guān)心如何證明,從存儲(chǔ)到計(jì)算整個(gè)體系都會(huì)有變革的契機(jī)。
同時(shí),它引入了經(jīng)體系,以及鏈上治理機(jī)制,有超越技術(shù)的深遠(yuǎn)的影響,不過這個(gè)話就更大了,我會(huì)在另外的文章中探討。