和數傳媒:區塊鏈的技術世界觀

買賣虛擬貨幣

如何理解區塊鏈技術?中心化賬本到去中心化賬本之間有什麼技術演進關係?

說到區塊鏈技術分享,區塊鏈相關的各種技術詞彙就紛至杳來。區塊鏈領域是一個喜歡造新詞的領域,這也給想了解這個領域技術的人造成了門檻。我一直想梳理下區塊鏈的技術演進邏輯,試圖從網際網路技術的發展角度來解釋區塊鏈技術,這樣可以讓網際網路領域的技術人更容易理解區塊鏈。

技術有沒有世界觀?

技術本身的目標是對現實抽象和建模,所以技術實際上有自己對世界的理解和假設。比如程式設計正規化裡的面對物件和函數語言程式設計,有完全不同的世界觀理解。而區塊鏈對世界是一種怎麼樣的抽象呢?

我們還是從蕭伯納那句名言開始。

"你和我各有一個蘋果,如果我們交換蘋果的話,我們還是隻有一個蘋果。但當你和我各有一個想法,我們交換想法的話,我們就都有兩個想法了"。— 蕭伯納

這句話也被很多人用來解釋區塊鏈以及網際網路的區別。交換蘋果代表價值交換,交換想法代表資訊交換。資訊交換可以保留多個副本,但價值交換就不行。所以流行的一個說法是:

"網際網路-資訊交換、區塊鏈-價值交換"

但是交換資訊就不需要考慮價值了麼?其實也不是,畢竟貢獻想法也是需要激勵機制的。現在的網際網路就沒有價值交換了嗎?區塊鏈不也是在資訊世界的嗎?本質的問題實際是:

"如何在資訊世界進行價值交換?或者說如何透過交換資訊的方式進行價值交換?"

這個問題其實也不是一個新問題。在沒有網際網路的時代,人類就在嘗試。比如各國都普遍實行的不動產登記制度。你買房買的是房子的控制權嗎?或者說買房的時候你住進去就算買到了嗎?實際上不是,要不動產登記賬本變更後才算,這個登記變更實際上就是資訊交換。無論這個賬本是原來的紙質賬本,還是變成計算機的資料庫,甚至再到未來的區塊鏈,載體變了本質上是沒變的。再比如銀行的財產登記,股票交易所的股票登記,都是一個道理,如果說貨幣還有紙幣這種物理實體代表,股票則是純資訊化的,沒人見過股票長什麼樣子吧。

所以總結一下,資訊世界進行價值交換的唯一方式是統一的賬本,並且對這個賬本的要求是它必須是一個公共知識(common knowledge),可以簡單理解成大家常說的共識。唯有這樣,資訊的副本才不會生效,比如駭客即便是黑了交易所複製了資料,也不可能重新搭建出一個交易所來讓大家交易。至於如何達成這樣的共識,是透過市場競爭,還是依賴權威機構,這裡暫不討論。

現在區塊鏈來了,要搞去中心化賬本。去中心化這個詞是個熱詞,網上一直爭論不休。由於時間關係這裡不進行詳細闡述,等有機會單獨寫文章闡述。這裡只簡單說明下我個人思考的去中心化的兩個方面:

賬本使用者側去中心化 這個是從使用者側的准入機制上考量,比如傳統媒體只有專業媒體人可以釋出內容,到網際網路門戶,再到微博微信公眾號等自媒體,本質上也是一種去中心化的過程。

賬本供給側去中心化 這個是從賬本的供給角度考量。比如還是前面的例子,傳統媒體有很多,各種報紙雜誌,掛一個媒體影響不大,到門戶時代就少了,再到現在基本就剩下幾個平臺了,掛一個平臺影響就大了。那現在能不能再反過來,同一個賬本由多個供給方一起提供?這樣就兼具二者優勢了。區塊鏈主要關注的是這個方向。

至於為什麼賬本會向去中心化賬本演進,動力在哪裡,這裡就不展開了。先從技術演進角度來理解一下,從中心化的賬本到去中心化賬本之間的技術演進過程。

賬本架構演進之路

我總結了這樣一個演進過程:

單資料庫賬本

這個架構圖做網際網路應用的朋友應該看起來很親切。早期的企業以及網際網路應用都是這個樣子的,應用介面面向終端使用者,應用本身的程式封裝了業務邏輯,應用狀態直接儲存到資料庫中。這時候關注的賬本相關技術主要是『事務』。透過資料庫提供的事務機制,保證了賬本的原子性操作。

分散式資料庫賬本

當單機資料庫無法承載讀寫或者資料的時候,就有了分散式資料庫。分散式資料庫的資料分散到了不同的節點,透過分片以及多副本來解決上述問題。但同時帶來的問題是如何保證同一個分片在不同節點的資料的一致性以及跨節點的分散式事務。這時候賬本相關技術主要是『分散式共識演算法(paxos,raft ),分散式事務』。分散式事務由於其複雜性,分散式資料庫不一定能夠提供,很多情況需要在業務邏輯裡處理。

多機房賬本

隨著賬本越來越重要,異地副本都不能滿足需求,需要異地多活了,於是有了多機房方案。多機房方案裡,不同的機房之間需要同步資料,並且保證一致性。這時候賬本技術的挑戰主要是『跨機房分散式共識演算法,應用狀態的複雜性』。前者是說分散式共識演算法需要考慮更復雜的網路場景,後者是說大部分應用的狀態維護比較複雜,不僅僅在資料庫中,只是透過一個跨機房複製工具把資料庫狀態複製過去,是很難應對多機房應用場景,實際上需要應用架構的改變。

多運營方賬本

上面的賬本都只考慮同一個主體運營維護的場景,內部的信任較高。但如果是多方共同維護一個賬本的場景,也就是上一個方案的不同機房其實屬於不同的主體。這樣的場景下,另外一方無法直接信任應用的最終狀態,所以在不同機房同步的不能是應用的狀態,而是應用的 Event(事件)。無論是本機房使用者寫操作的 Event 還是從其他機房同步過來的,都需要經過業務邏輯校驗處理後再變更應用狀態。這實際就是 EventSource/CQRS 的架構,也是很多聯盟鏈的架構。多機房場景下其實也會用這種架構,主要區別是在對從其他機房同步過來的 Event 的信任度。這時候,賬本技術的挑戰除了跨機房分散式共識演算法,還有共識演算法和業務邏輯融合。在前面場景裡的共識演算法,基本只關心資料,不關心業務,共識演算法只保證資料的一致性,並不保證資料在業務場景下的合法性。但在這個場景下,共識演算法要保證只對合法的資料達成一致,二者融合了。無法直接沿用上面幾種分散式共識演算法,需要考慮作弊情況的共識演算法,比如 BFT 這樣的。

有人會問,有什麼動力要將同一個賬本交給多個運營方呢?那我們拿網際網路電商來說明這個場景。當前的電商,一方面對接商家和商家的庫存管理系統,另外一方面對接銀行和快遞系統,以及終端使用者。一個商品,從庫存管理系統,到電商平臺,使用者購買後,從銀行扣錢,傳送快遞,實際上是同一個賬本上的資訊在不同的運營方系統之間的同步。當前的實現方式是透過遠端呼叫或者商家和使用者介入手工操作。那不同的賬本之間如何保證一致性呢?只能定時對賬清算,因為遠端呼叫本質上只是資訊傳遞,無法保證一致性。如果這時候有個多方共享的賬本,架構就會像上面那樣,不僅架構更優雅,同時結算效率會更高。

關於聯盟鏈的技術架構以及模式的更詳細分析,我會在下一篇文章中細說。

去中心化賬本

去中心化賬本這個概念沒有非常準確的定義,但我們這裡可以簡單的理解成 Peer to Peer 網路 + 賬本。Peer to Peer 網路的特徵是無准入機制,給人的印象也是不可靠,更不追求一致性,而賬本是要追求一致性的。比特幣創造性的把二者結合起來。所以一般所說的去中心化賬本,或者公鏈,關鍵一個特性就是無准入機制。

之前的賬本都是有準入機制的,並且賬本本身的運營成本以及收益透過系統外的機制來解決,那如果去掉准入限制,同時賬本的運營成本以及收益也透過賬本系統內建的機制來調節,會有哪些新的挑戰?

如何激勵生產者?生產者為什麼提供伺服器資源?如何度量生產者的工作?

如何實現一致性?無准入機制的情況下,節點數不確定,隨時加入退出,無法用 BFT 這樣的投票共識演算法。

如何防攻擊?比如生產大量資料(DoS攻擊),偽造大量節點(女巫攻擊)。有了激勵就有了攻擊和作弊的利益動機,傳統的 Peer to Peer 網路沒有激勵,一般人也不會做損人不利己的事情。

下面我們透過幾個公鏈是來分析上面的問題。

Bitcoin

比特幣首先帶給我們的是一套內生的激勵機制。雖然比特幣到底應該理解成貨幣,還是數字黃金,還是股票,大家爭論不休。這裡我們把比特幣設想成一個創業公司,這個創業公司要做一個記賬交易系統。於是它發行了2100萬股,發行規則直接寫到了這個記賬系統的程式碼中,分期釋放,獎勵給給這個系統提供執行資源的人。而使用者拿什麼來交易呢?也用它的股票來做交易媒介。這樣它就實現了軟體系統在經濟上的自舉,也帶給軟體系統一種能力:在程式演算法中引入經濟博弈機制。

Proof of Work

PoW 到底應該算是激勵的評估機制,還是共識演算法,還是反 DoS 策略?實際上它兼具多種功能。所以這也是公鏈的共識演算法和傳統分散式共識演算法的差異之處,容易讓人迷惑。

最早應用 PoW 的是 hashcash,它的主要目的就是透過 PoW 來實現郵件的反垃圾,關鍵點是透過 PoW 製造額外成本,這樣發郵件少的使用者可以接受成本,但發垃圾郵件的使用者就很難承擔這樣的成本。

同時,有了成本也就可以作為貢獻的評估標準,Proof of Work 這個詞,顧名思義,就像是一個工作的評估機制。執行比特幣系統,需要機房,機器,頻寬等,如何透過程式來評估資源提供者的工作呢?比特幣的做法就是算雜湊函式,要求算出來的雜湊值小於一個難度。雖然簡單粗暴,但它難計算,易驗證,是一種可行的辦法。

中本聰共識(Nakamoto Consensus)

只有 PoW 是無法實現一致性的,需要再加上其他的一些策略,統稱為中本聰共識。

內建的校驗機制(包括 hash 難度校驗,merkle 校驗,鏈式關係校驗,UTXO 校驗等),每個區塊只認可透過校驗的合法區塊,拒絕非法區塊。

最長鏈選擇 如果由於網路延遲造成軟分叉,每個節點應該在最長的一條鏈上繼續工作。

如果有節點試圖違反以上規則,則會帶來經濟成本(自己挖出的塊不合法被拒絕,在短鏈上的工作不被認可等),透過經濟上的博弈實現防作弊。

中本聰共識的特點是無互動,純非同步,每個節點只需要按照內建的規則處理即可,無需和其他節點互動協調。

區塊與鏈式結構

比特幣帶來的區塊與鏈式結構,也是區塊鏈這個名字的由來。但區塊和鏈式結構是必須的嗎?真的存在一條這樣的全域性鏈式結構嗎?實際上區塊只是一種為了降低網路開銷的批次操作,鏈式結構的主要目的是建立一種時間上的依賴關係,即便兩個交易本身不相關,但由於鏈式結構的存在,後面的交易實際上給前面的交易做了背書,增加了篡改和回滾的成本,因為一旦想要撤回前面的交易,必然也會影響後來的交易。這種結構和關係只是共識協議的一部分,並不存在這樣一個全域性的結構,具體每個節點如何儲存資料,是節點自己決定的。鏈式結構雖然存在分叉,但只要配合共識機制,最終可以選擇出一條唯一的鏈,達到最終一致性。也就是說,只要能達到這個目標,區塊和鏈式結構並不是必須的,也沒必要因為這個名字糾結什麼是真正的區塊鏈。

UTXO 與 MerkleTree

UTXO 本身是一種複式記賬法。比特幣的定位是數字貨幣,UTXO 屬於它的賬本業務邏輯。這種記賬法的好處是任何一筆交易都可以回溯到創幣交易,保證貨幣只能由創幣交易產生,無法憑空產生。如果只是貨幣場景,UTXO 確實比 Account 模型要安全,但如果考慮到其他應用場景,應用的狀態就很難設計出一種 UTXO 模型來追蹤變更,這也是為什麼後來的面向應用的鏈放棄 UTXO 的原因。

比特幣透過 MerkleTree 提供交易證明,方便沒有全量賬本的輕客戶端校驗交易。但比特幣的 MerkleTree 是每個賬本一個,沒有全域性 MerkleTree,也就是說沒辦法提供全域性證明,輕客戶端的實現就會比較複雜。這方面比特幣社羣也討論很久,詳情可以參看我以前的一篇文章:《談談區塊鏈的 UTXO 證明》。後面會談到 Ethereum 的改進。

Bitcoin

比特幣的 可以理解成一種支付校驗邏輯的擴充套件能力。前面說了,去中心化賬本的業務邏輯和共識機制融合在一起了,支付校驗本身也屬於業務邏輯。這種邏輯的變更會影響共識,進而可能導致硬分叉,而提供一種可自定義邏輯的指令碼,則是一種兼顧的策略。

同時,比特幣的這種能力也給後來的染色幣(Colored Coin)提供了機會。本來比特幣的賬本只能記錄比特幣的交易,但有了 後,可以在 嵌入自定義資料結構,可以理解成對比特幣賬本的資料擴充套件。染色幣就利用這種機制來製造新的加密幣。

這種機制的好處是染色幣不需要重新構建一個去中心化的賬本網路,降低了時間以及經濟成本。但缺點也很明顯,一方面,這種目的畢竟不屬於比特幣的初始設想,得不到更多支援,另外一方面,比特幣 只能嵌入資料,無法嵌入對這種資料的校驗邏輯,校驗邏輯還需要透過部署獨立的節點程式來實現。

於是這種需求背景下,以太坊產生了。

Ethereum

以太坊的設想是既然執行一個去中心化賬本成本這麼高,那能不能先執行一個通用的賬本,然後提供機制允許使用者在上面自定義業務邏輯?所以它的目的不是數字貨幣,而是執行『智慧合約』的平臺。如果說以太坊當前的 PoW 共識機制等只是在比特幣 PoW 基礎上的最佳化改良,它的最關鍵的創新就是智慧合約和 Global State Trie。

智慧合約

這裡順便扯一下對『智慧合約』的看法。很多批評『智慧合約』的人說這只是一種指令碼程式,並不智慧。那這樣說智慧手機(Smart Phone)哪裡智慧了?智慧家居,智慧手錶,智慧xx不都一樣?中文領域裡把 Smart 和 Intelligence(Artificial Intelligence,AI 人工智慧) 都翻譯成智慧,確實造成混淆。但這是歷史遺留問題了,糾結這個名字沒有意義。

於是以太坊提供了一種圖靈完備的指令碼語言來定義業務邏輯,交易資料中明確允許嵌入自定義資料結構(以太坊 transaction 的 data 欄位),鏈不關心合約本身的邏輯,只是透過在不同的節點重複執行合約,來保證合約的輸出是確定的。它和比特幣的 的差異不僅在是否圖靈完備,更大的差異在於自定義資料和自定義邏輯的結合。染色幣這樣的場景,它同時託管了染色幣的賬本資料和交易邏輯,於是引來了一場發幣的熱潮。它這種機制帶來的挑戰是不同的場景的業務邏輯的輸入輸出不一樣,如何儲存和維護?如何提供證明?

於是它創造性的引入了 Global State Trie。

Global State Trie

以太坊的黃皮書中透過一個公式來定義以太坊。

這個公式中的 sigma 表以太坊的狀態,Upsilon 代表處理函式(包括合約以及內建的 Ether 交易邏輯),T 代表交易(包含呼叫合約的交易), t+1 的狀態等於處理函式在 t 狀態基礎上處理 T 的執行結果。

而這裡的狀態的程式表達形式就是一個 Merkle Patrica Trie。

這是一個兩層的 Trie,第一層的葉節點上儲存的是每個 Account 的餘額(Balance),以及針對合約 Account 的 CodeHash 和 Storage root。Storage root 是另外一個 Trie 結構,葉節點是合約內部的狀態。任何一個 Account 的餘額或者合約狀態變更,都會導致 Global State Root 變更,而每個區塊都會在區塊頭上帶上當前區塊中的 Transaction 執行完後的 State Root 。

這樣,一方面提供一種全域性校驗機制,只要比較 State Root 就可以快速知道不同節點的狀態是否一致,這個和 Git 中引入 Merkle hash 證明機制的原理是一樣的。Linus 一次分享 Git 的時候也說了,Git 的這種機制可以讓他方便的信任來自第三方儲存的程式碼。有了這套機制後,新節點同步的時候可以信任一定區塊以前的全域性狀態,而不是完全透過區塊回放來重新構建。這也回答了我們前面提出的那個問題,如何快速校驗不同機房的資料狀態一致性。

另外一方面,它也提供了一種單個賬號狀態和全域性狀態關係的證明能力,可以透過 Merkle Path 證明一個賬號的當前狀態和全域性狀態之間的關係,輕錢包實現就會更容易。

如果純粹從模型看,以太坊已經是一個非常理想的模型了。大家常說程式就是資料結構加演算法,它既提供了資料結構的自定義以及儲存能力,也提供了演算法的計算環境,理論上任何程式都可以放上去執行了。但套用一句俗話,理想是豐滿的,現實是骨感的,這樣的全球分散式賬本的儲存和計算成本太高了,稍微複雜的應用都很難執行起來。

EOS

EOS 自專案啟動開始,主打的旗幟就是吞吐和效能。如果說比特幣和以太坊兩個專案帶有一種理想主義特質,EOS 則帶有非常明顯的實用主義特質。

前面說到,Peer to Peer 網路的問題是無准入,節點數不固定,匿名情況下防作弊成本高。EOS 的 DPoS 思路就是透過投票選舉,讓參與共識的節點在一定時間內保持穩定,同時透過競選機制,讓競選節點不再匿名,降低防作弊的成本,然後把注意力集中到吞吐以及應用模型的改進上。

網際網路應用開發者看了 EOS 的應用模型後,會感覺更容易理解。看它的 ABI 描述檔案,第一眼的感覺就像是在定義應用表結構。它交易結構中直接嵌入的是 Message,相當於 EventSource 架構中的 Event。以太坊的鏈上還保留了 Ether 本身的交易邏輯,而 EOS 上 EOS Token 本身也是透過合約實現的,只是合約分為系統合約和使用者應用合約,整個鏈成為了一個更純粹的合約執行平臺。

EOS 中沒有 Global State Trie,這個問題 Vitalik 和 BM 爭論過很多次,這代表了兩種不同的思維方式,感興趣的人可以找來看看,我個人是同意 Vitalik 的看法的。

EOS 另外兩個值得關注的點是它的經濟模型以及鏈上治理模型。它試圖提供免費的交易,但畢竟資源有限,所以透過其他限制來替代交易費模式。鏈上治理帶來的啟示是,大家常說的共識到底包含哪些方面?程式碼中的共識邏輯?最終的一致性賬本?社羣的使用者選擇是否也可以沉澱到鏈上,以解決分歧以及約束區塊生產者(礦工)?

到底需要多少去中心化賬本?

前面我們分析了賬本的架構演進以及幾條典型的公鏈。如果說比特幣是一個區塊鏈應用的演示,以太坊和 EOS 則可以看成應用實驗平臺。那到底世界需要多少去中心化賬本?多少條公鏈?通用公鏈的擴充套件性困境不僅僅來自技術層面的容量和吞吐,同時也來自應用方向。做一個有無限可能的鏈,還是一個和具體業務邏輯繫結的鏈?是新鏈開發者必須要面臨的選擇。

當前的情況下,透過分片來解決擴充套件性(容量和吞吐)問題的複雜度過高,短期很難落地,於是社羣提出了分層的概念。

Layer2 的道理很簡單,也符合大家的認知常識。不同的賬本需要的安全級別以及共識範圍是不一樣的,沒必要每個交易都需要全球共識。但關鍵是怎麼做到呢?

它的核心思路是透過 Layer1(鏈層)提供的機制來約束 Layer2,具體方案可分為兩種:

狀態通道(比如閃電網路)顧名思義,它主要是兩個人之間的一個通道,相當於兩個人之間的一個賬本。因為每個賬本只有兩個人,所以賬本上只需記錄每個人的最終狀態,無需記錄每次交易,最後按最終狀態分賬就行,沒有直接通道的使用者之間可以透過路由中轉的方式來進行交易。鏈提供機制,避免作弊以及不合作風險,具體安全策略這裡不詳述,有興趣的朋友看我的影片10分鐘理解閃電網路以及區塊鏈二層解決方案的原理。

多方鏈下賬本 如果是多個人之間可以直接互相交易,又不希望建立過多通道(成本原因),就只能透過維護一個多人的共同賬本來實現了。這個賬本也必須找到託管方,但關鍵是如何保證安全。我們傳統的賬本安全其實是靠審計,使用者以及第三方監督等機制實現,那能不能把這套機制也在鏈上實現?鏈用來公示以及爭議裁判(雙方需要提供證明,程式自動判決),使用者和賬本託管方互相監督,再或者引入其他託管方把賬本變成一個聯盟鏈。

關於 Layer2 的各種方案的探索,至少給我們展示了一個可能,就是各種賬本之前並沒有涇渭分明的界線,會有機制將它們混合在一起,共同形成價值網路,後面會寫再文章單獨分析。

總結

本文整體從賬本的作用以及架構演進來闡釋區塊鏈。闡釋區塊鏈的方式有很多種,我這裡主要以技術演進的角度進行。

早就想寫一個系列,談談區塊鏈,但年初的時候區塊鏈鼓吹者甚多,作為一個技術人,完全插不上嘴。最近熊市,冷清了許多,連區塊鏈是一種落後技術的言論都出來了,於是決定寫一寫。

區塊鏈絕對不是一種落後的技術,而是一種更優秀的分散式系統。同時它帶來的技術挑戰和契機也非常大,以前我們主要關心資料如何計算以及儲存,區塊鏈時代我們更要關心如何證明,從儲存到計算整個體系都會有變革的契機。

更多資訊請關注:和數傳媒。和數傳媒(heshumedia.com),全球最新科技資訊釋出平臺,每日持續更新報道IT業界、網際網路、區塊鏈、人工智慧、AI等技術及產品資訊新聞,是最及時權威的產業新聞及硬體新聞報道平臺,致力於挖掘世界價值,傳遞積極、真實的價值觀和資訊能量,去偽存真,精準分析行業全球最新資訊,構建和諧發展的科技生態圈。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;