以太坊會是區塊鏈的終極形態嗎?

原文標題:《區塊鏈抽象和互操作性 2.0》
撰文:謝晗劍(Jan Xie),Nervos 首席架構師,祕猿科技首席執行官,前以太坊核心研發團隊成員

比特幣於 2009 年誕生後,我們很快就迎來了所謂的「山寨幣」時代。人們在比特幣的基礎上衍生出了諸多想法,並付諸實驗,一時間湧現出成千上萬種加密貨幣。一些新的加密貨幣活了下來,另一些很快消失在我們的視野中。其中最成功的莫過於以太坊了。爲什麼是以太坊?

在以太坊之前,每當有人推出新的區塊鏈應用,就會有一種新的「山寨幣」被創造出來以實現該應用。以太坊終結了這種繁瑣的創新方式,通過引入一種通用編程模型讓開發者可以在其上構建任意去中心化應用。有了以太坊,開發者得以卸下編寫共識代碼和構建點對點網絡的負擔,將更多寶貴時間投入到商業邏輯上。以太坊之於其它「山寨幣」就像 iPhone 之於它的功能手機 [1] 前輩,爲我們開啓了 dApp 的寒武紀大爆發。

回顧這段歷史的時候,我們很容易理解以太坊之所以能發展成最有價值的區塊鏈的原因 —— 在其它項目還在一次解決一個問題的時候,它就通過系統化的方法一舉解決了成千上萬個問題。而以太坊提供系統化解決方案的方法,是通過在一個不同的層級解決問題:不滿足於回答如何構建下一個應用,而是要回答如何更方便的去構建接下來的一萬個應用 —— 有沒有比「一個應用一條鏈」更好的方法?這樣一種對其它「山寨幣」的降維打擊 [2],開啓了屬於以太坊的新時代。由於開發成本大幅降低,dApp 得以蓬勃發展。如今,幾乎所有 dApp 都在以太坊上運行,這讓以太坊成爲加密貨幣的佼佼者。

常有人問:以太坊會是區塊鏈的終極形態嗎?還是說未來會出現一個新的區塊鏈,其之於以太坊就像以太坊之於比特幣一樣?下一個時代會是什麼樣子?

區塊鏈抽象

以太坊的主要突破是由 EVM 和賬戶模型構成的通用編程模型(又稱智能合約模型,在本文中可互換),在其上開發者可以實現各類應用邏輯。智能合約模型是一箇中間層,將開發者與開發應用不需要關心的區塊鏈底層細節隔絕開來,同時又爲開發者提供極好的編程靈活性。以太坊所做的事情正是抽象,如維基百科上對抽象的定義 [3] 所說:

在軟件工程和計算機科學中,抽象指的是:

  • 在研究某些對象或系統時忽略其物理、空間或時間上的細節或屬性,只關注更重要細節的過程。其本質上與泛化過程相似;

  • 通過復刻各種非抽象對象或系統的共同特徵或屬性(抽象過程的結果)來創建抽象概念對象。

從這個角度來看,以太坊就是比特幣和所謂「山寨幣」的抽象。抽象是系統演化的永恆主題,在歷史上發生過很多次。在編程技術的早期階段,我們只能寫着彙編代碼直接與機器打交道,後來人們創造出了高級編程語言和編譯器,將我們從繁瑣的機器細節中解放了出來,只需關注更重要的問題。

起初,我們直接在自己的程序內管理硬件資源,後來我們構建了操作系統作爲中間層,代理我們處理那些繁重的任務。再往後,我們又實現了硬件虛擬化,於是應用可以在雲端運行。早期的互聯網只有少數幾層協議,如 TCP/IP,後來發展出應用層,於是有了 HTTP、FTP 和 SMTP 等。如你所見,抽象的例子比比皆是。

因此,我想說的是,新的抽象是演化的標誌,下一代區塊鏈必須比上一代更加抽象。從比特幣到以太坊的跨越是初代區塊鏈抽象,同時我相信抽象的進程不會就此終止。如果想要知道後以太坊時代會是什麼樣子,我們首先應該思考的是,還可以從以太坊中進一步抽象掉什麼。

新的抽象

與比特幣相比,以太坊的通用智能合約模型是一大進步。若要再進一步抽象,一個方向是基於以太坊智能合約模型創建一個更抽象的模型。如果我們更深入探究以太坊模型,我們會發現該模型融入了很多特定的設計選擇,其中比較主要的有:

1.賬戶地址。用戶需要通過 EOA (外部賬戶)來發起交易。EOA 地址是公鑰的 Keccak256 (一個特定的哈希算法)哈希值。
2.發送方身份驗證。以太坊使用 Secp256k1 和 Keccak256 這兩種特定的密碼學算法對交易發送方進行身份認證。要想創建一筆有效的以太坊交易,客戶端(如錢包)必須實現 Secp256k1 和 Keccak256 算法以簽署該交易。這也導致客戶端需要一種安全的方法來管理 Secp256k1 密鑰對。
3.密碼學原語(作爲基礎組件使用的一類算法)。爲了給開發者提供便利,一些事先選擇好的特定密碼學原語被硬編碼到 EVM (以太坊虛擬機)中作爲預編譯合約,例如,ECDSA 簽名驗證和 SHA256 哈希函數。同樣的算法,被硬編碼到 EVM 中比利用 Solidity 實現要高效得多,前者因此獲得實用性。
4.世界狀態結構。以太坊的世界狀態是一個巨大的 Merkle Patricia Tree (MPT),賬戶就是葉節點。其中每個賬戶也以 MPT 的形式維護一個自己內部的鍵值數據庫。MPT 是衆多可驗證數據結構的選項之一。

對於非技術背景的用戶來說,這些設計選擇看上去不明所以,但是其重要性不亞於共識算法或經濟模型參數的選擇。這些選擇影響着以太坊的方方面面,就好像對普朗克常數 [4] 進行微調也會給我們的宇宙帶來翻天覆地的變化 [5]。構建一個新的去中心化生態就像是創建一個新的宇宙,而這些設計選擇就像是這個宇宙中設定好的物理規律。

當時有這些設計選擇是爲了幫助以太坊實現其初始目標,事後看來它們並非最佳選擇。例如,發送方身份驗證算法 Secp256k1 對設計者來說可能就是順手一選,但是在不支持 secp256k1 的環境中 [6] 它帶來了不必要的障礙;通過一份小小的白名單內嵌預編譯合約的做法,使得大部分廣泛使用中的密碼學原語被排除在應用之外;狀態數據結構中使用的 MPT 也被證明是效率非常低下 [7] 的,不僅加劇 [8] 了狀態爆炸問題,還導致了與 IO 相關的 EVM 操作碼 [9] 的定價困難,而定價不當可能會引發 DoS 攻擊等安全問題。

以太坊社區和其它一些新型協議也注意到了這些問題,並嘗試了不同的解決方案。例如,以太坊通過一系列硬分叉來增加更多有用的預編譯合約,並對操作碼重新定價;Tezos 增加了 Secp256r1 作爲新的發送方身份驗證算法,等等。

問題在於,這與人們當時在「山寨幣」時代解決應用需求的方式毫無區別。更麻煩的是,這些設計選擇可能比應用程序更加複雜和難以理解,而且通常不存在最佳解決方案。面對不同的情況,可能會有不同的最優解。即使遇到極少數存在一般最優解的情況,我們也無法保證當下的最佳選擇在將來還是如此。因此,更好的方式是,我們再次從新的層面去思考:與其繼續通過需要核心團隊協調的硬分叉來增加新功能,我們是否可以創建新的抽象並給予智能合約開發者充分的自由?

Nervos CKB 回答了這個問題,並創建了新抽象的層級。例如,CKB 交易 是抽象的,因爲用戶和開發者不僅限於使用默認的 Blake2b-Secp256k1 驗證算法,任何人都能將其替換成 [10] 諸如 Blake2b-Secp256r1、Keccak256-ED25519 或 Blake2b-SHA3-Schnorr 的其他方式;CKB-VM 是抽象的,裏面不包含任何預編譯合約,即使是像哈希函數 Blake2b 和簽名驗證算法 Secp256k1 這樣的默認密碼學原語也只是在虛擬機中運行的智能合約,換言之,這些密碼學原語與應用開發者創建的智能合約在同一個環境中運行,沒有任何特權;Cell 模型是抽象的,其中每個 Cell 只是單純的數據存儲空間,沒有任何內部結構,其佈局完全取決於開發者,就像我們在 sUDT[11] 和 xUDT[12] 看到的那樣。

由於 CKB 在很多方面都是抽象的,開發者被賦予了更多的自由和新能力。CKB 是以太坊的抽象,正如以太坊是比特幣的抽象那樣。抽象讓 CKB 成爲了簡單卻又強大的區塊鏈,並將很多工作轉移到了鏈下(包括 Layer 2)。以太坊對比特幣進行抽象的結果是將開發者分成了兩部分:一部分是聚焦於底層區塊鏈的區塊鏈開發者,另一部分是構建應用的智能合約開發者。可以預見 CKB 對以太坊進行抽象也會將智能合約開發者分成系統合約開發者和應用合約開發者,前者聚焦於系統級智能合約,如密碼學原語、lock script,甚至是內存管理模塊。

最近以太坊社區已經認識到了區塊鏈抽象的重要性並提出了一些相關的改進 [13]。如果這些改進得以實現,我認爲它會讓以太坊變得比現在更加抽象,並與其它做不到這一點的項目拉開更大的距離。然而我不認爲這些關於區塊鏈抽象的提案能讓以太坊達到與 CKB 同等的抽象層級,因爲要對一個正在運行的生態系統做如此底層的改變是極其困難的,就像我們無法在不破壞宇宙的情況下改變普朗克常數那樣。例如,賬戶抽象會爲交易池等重要模塊引入新的安全複雜性——此時每當簽署新的交易時,驗證節點都需要處理任意計算,而非固定的簽名驗證。

抽象也可以從可擴展性入手。分片和 Layer 2 解決方案都存在同樣的問題,即,在某些方面改變了應用的開發方式。例如,跨分片調用 [14] 或跨 Layer 2 交易在處理方式上可能與 Layer 1 上的合約調用完全不同。Layer 2 應用開發者還可能會在不同分層上遇到不同的智能合約模型(例如,Layer 1 採用的是賬戶模型,Layer 2 卻採用 UTXO 模型,或者相反)。我們該如何屏蔽這些細節,爲應用開發者提供無異於 Layer 1 的流暢開發體驗?這個問題尚無定論,這是我們正在積極挑戰的問題之一。

CKB 上的首個通道設計,Generic Payment Channel (GPC),就是遵循這個思路構建的。GPC 旨在爲 Layer 1 上的 UDT (用戶定義代幣)提供一個「透明的」性能擴展層,以便任何 UDT 從一出生就可以被「通道化」,而無需 UDT 開發者做任何另外的事情。在 GPC 中,我們爲 UDT 開發者抽象掉了支付通道協議的細節。Godwoken 和 Polyjuice 是我們的另一個嘗試,這兩個解決方案可以認爲分別是 CKB 上的可擴展性和計算抽象。

互操作性 2.0

每一個區塊鏈抽象層級都會給我們帶來新的東西,我們在之前的抽象層級上從未見過的東西。第一次區塊鏈抽象爲我們帶來了通用可編程性和互相連接的去中心化應用。下一次區塊鏈抽象將爲我們帶來什麼?

互操作性 2.0 (我在 2020 年萬向區塊鏈大會上首次提到這個概念)必將是新抽象層級孕育的果實之一。我們對數字經濟未來的設想是,公有鏈、許可鏈和中心化系統都將並存。有了互操作性,我們就可以在彼此獨立的系統之間轉移資產並調用智能合約。近年來,人們已經進行 [15] 了很多關於互操作性 [16] 的研究 [17] 和嘗試 [18] ,並且相信該問題可以通過一系列互操作基礎原語解決,例如多籤公證、中繼和哈希鎖定。

雖然區塊鏈互操作性目前在技術上是可行的,但是與具備無縫互操作性的數字經濟之間還存在缺失環節。

第一,目前的互操作性嘗試只會導致更加嚴重的網絡分裂。Polkadot[19] 和 Cosmos[20] 等項目都定義了自己的標準,並試圖圍繞自己的「交換鏈(Hub)」建立一個多鏈網絡。此外還有努力搭建直接橋樑的項目,例如實現比特幣和以太坊之間的直接跨鏈。我們很難想象,這些獨立網絡的核心團隊和社區有朝一日能夠坐下來共同商定出一個所有人都遵守的互操作性標準。

第二,更重要的是,即使這些區塊鏈網絡之間具備完美的技術互操作性,用戶依然會被糟糕的互操作體驗勸退。從用戶的角度來看,如果我是一名比特幣用戶,想要將我的比特幣轉移到以太坊上參與 DeFi 應用,我必須先運行我的比特幣錢包,發起一筆跨鏈交易,然後使用另外一個以太坊錢包。爲了完成一次跨鏈操作,我必須安裝兩個錢包應用,保管兩組助記詞,使用兩個地址。這個過程本身非常複雜,而且僅適用於兩條區塊鏈的情況。如果用戶想要與更多區塊鏈交互,必須管理更多助記詞 / 地址 / 密鑰對。用戶體驗問題不僅阻礙了 dApp 的廣泛落地,還破壞了去中心化——區塊鏈的核心價值——因爲用戶不得不且一定會選擇中心化服務來避免所有這些麻煩。

爲解決上述兩個問題,我們需要一種新的互操作性,我們管它叫互操作性 2.0。具備這種新型互操作性的區塊鏈就像是一個「萬維交換港」,可以在無需對方知覺的情況下實現與其它區塊鏈的互操作。想要做到這一點,「萬維交換港」就必須要能理解並執行其它區塊鏈的協議,而非創建自己的協議並要求其它鏈來學習。它就好比是一個「語言通」,能主動學習並會說其他人的語言,這樣就能與使用不同語言的人交流,其他人也更願意與他交流。

在加密貨幣世界中,所有協議(即,區塊鏈使用的語言)都由密碼學技術構建。這也意味着「萬維交換港」必須廣泛支持各種密碼學原語,無論其是在現在還是將來的區塊鏈中被使用到。另外,「萬維交換港」還要能理解各種錢包所簽署的交易,讓用戶使用任意一個錢包(只需要一個錢包)都能夠使用這個「萬維交換港」上運行的一切應用。

互操作性 2.0 的這些需求恰好可以通過上面說的新抽象,密碼學原語和身份驗證來滿足。這就是爲什麼以太坊用戶可以使用 MetaMask 錢包操控 Nervos CKB 上的資產和 dApp[21] 而無需進行任何手動設置,甚至不會意識到自己正在使用 Nervos 應用。不僅是以太坊用戶,EOS、Tron 以及其他區塊鏈的用戶也可以在 Nervos CKB 上操控資產或 dApp[22]。如果當前的支持列表中沒有你喜歡的區塊鏈,不用擔心,你自己就可以通過創建並部署智能合約(或等待 / 僱傭智能合約開發者幫你做這件事)來添加支持。這一切都可以通過編寫智能合約來完成,無需請求核心開發團隊和 / 或實行硬分叉。

在 Nervos 上運行的應用可以免費獲得互操作性 2.0 帶來的好處。每一個 Nervos 應用都可以被所有的區塊鏈用戶羣體訪問到,我們將這種應用稱爲萬維應用(Universal Application)

  • 作爲一名開發者,你可以通過學習如何在 Nervos 上構建應用獲得比任何其他區塊鏈平臺能提供的更廣泛的用戶羣。

  • 作爲一名用戶,你只需使用現在用的順手錢包和賬戶即可訪問 Nervos 上的萬維應用,無需安裝新的應用或適應新的學習曲線。

你可能會感覺自己在使用以太坊或 EOS 上的 dApp,而實際上底層管道和基礎設施都是 Nervos 提供的。我相信這纔是生活應該有的樣子,就像一位互聯網用戶在訪問網站時纔不會關心這個網站是用 PHP 還是 JAVA 編寫的,使用的是 MySQL 還是 PostgreSQL。用戶根本不關心這些,而這纔是對的。

身爲開發者,我們有責任創建抽象,向用戶隱藏實現細節,這樣我們就可以持續的用更好的軟件來取代已有的實現,從而不斷提供更好的用戶體驗。互操作性 2.0 可以將加密貨幣世界變得像如今的互聯網這樣,而這需要通過新的區塊鏈抽象來實現。

Nervos 謝晗劍:從區塊鏈抽象和互操作性 2.0 理解區塊鏈的最終形態

更妙的是,除了區塊鏈用戶之外,萬維應用甚至可以觸及一個遠比區塊鏈用戶更大的羣體。加密貨幣世界依然是個很小的圈子,我們可以「破圈」而出。區塊鏈錢包和賬戶只不過是另一個賬戶 / 身份系統,而互聯網世界早已確立了多種身份 / 賬戶體系和驗證標準,如 OpenID、人臉識別和指紋識別等。通過密碼學原語和身份驗證抽象,Nervos CKB 同樣可以理解廣泛使用的互聯網協議。這樣一來,用戶就能使用瀏覽器和手機來訪問萬維應用,無需安裝任何區塊鏈錢包,無需生成密鑰對,甚至無需保管任何助記詞。通過這種方式,我們可以主動適應現有的互聯網生態,而非創建一個全新的生態。我們的爺爺奶奶不需要費力去學習一些看起來像是魔法的東西就能享受到技術帶來的便利。阻礙互聯網用戶進入加密貨幣世界的壁壘在這裏不再存在。

Nervos 謝晗劍:從區塊鏈抽象和互操作性 2.0 理解區塊鏈的最終形態

新的大都市

許多現代大都市都是從貿易樞紐或港口發展而來的。威尼斯、紐約、香港、上海和新加坡都是憑藉自身的港口優勢而成爲高度商業化的城市。在工業時代,我們利用 GPS、貨船和集裝箱這樣的互操作技術在不同城市之間轉移資產。如今,我們有了加密資產、區塊鏈和互操作性 2.0。更好的互操作性會爲城市帶來更多移民、貿易和活力。高樓將會聳立,貨物川流不息,資產在此棲息,人們在此聚集,一座新的大都市從此誕生。

Ref:

[1]https://en.wikipedia.org/wiki/Feature_phone

[2]https://en.wikipedia.org/wiki/Death%27s_End

[3]https://en.wikipedia.org/wiki/Abstraction_(computer_science)

[4]https://en.wikipedia.org/wiki/Planck_constant

[5]https://iopscience.iop.org/article/10.1088/0143-0807/37/5/055406/meta

[6]https://crypto.stackexchange.com/questions/85831/what-ec-curve-is-used-by-apple-ios-platform

[7]https://hackernoon.com/getting-deep-into-geth-why-syncing-ethereum-node-is-slow-1edb04f9dc5

[8]https://blog.ethereum.org/2021/03/03/geth-v1-10-0/

[9]https://eips.ethereum.org/EIPS/eip-1884

[10]https://talk.nervos.org/t/lay2-pw-sdk-build-dapps-on-ckb-and-run-them-everywhere/4289

[11]https://talk.nervos.org/t/rfc-simple-udt-draft-spec/4333

[12]https://talk.nervos.org/t/rfc-extensible-udt/5337

[13]https://hackmd.io/@SamWilsn/ryhxoGp4D

[14]https://ethresear.ch/t/cross-shard-defi-composability/6268

[15]https://docs.zkproof.org/pages/standards/accepted-workshop3/proposal-plumo_celolightclient.pdf

[16]https://docs.keep.network/tbtc/index.pdf

[17]https://www.r3.com/wp-content/uploads/2017/06/chain_interoperability_r3.pdf

[18]https://www.weforum.org/whitepapers/inclusive-deployment-of-blockchain-for-supply-chains-part-6-a-framework-for-blockchain-interoperability

[19]https://polkadot.network/

[20]https://cosmos.network/

[21]https://talk.nervos.org/t/2-0-nervos-unidapp-dapp/5332

[22]https://pay.lay2.dev/#/