觀點:區塊鏈客戶端的未來將百花齊放

當前作者任職於 Parity Technologies,從事建立區塊鏈客戶端的工作。區塊鏈在很多方面都很吸引人,從軟件工程的角度來看更是如此。從事區塊鏈客戶端的工作就意味著需要與軟件堆棧的所有級別 (不管高低) 進行交互。

在最低級別上,你需要進行組裝優化、編寫編譯器和虛擬機 (VM)。你通過網絡和數據庫進行工作。最後,在最高層次上,你將處理諸如開源組織以及如何在一個大型複雜的應用程序中組織代碼之類的問題。

本文將主要涉及到更高的層次上,即我們如何管理應用程序的複雜性?

作者想補充一點關於區塊鏈客戶端的入門知識,以及它們如何隨著時間的推移在生態系統中進行交互。區塊鏈 (通常) 從協議開始,由某個協議規範加以規定。

比特幣從一篇白皮書開始,緊接著是 C++ 實現。這種 C++ 實現已經成為協議的規範,且真正的多客戶端生態系統從未得到過推廣。

但是,在諸如以太坊 (Ethereum) 這樣的區塊鏈中,從其誕生伊始就存在了多個客戶端。關於協議應該是什麼而不是由任何一個實現來定義的黃皮書和其他規範,存在著某種社區共識。但這並沒有將哪種類型的客戶端可以或應該存在考慮在內。

本文將主要研究以太坊,所以作者將主要從這個角度來展開。在區塊鏈生命的早期,存在一種可以做任何事情的客戶端,所有區塊鏈都是運行在這種客戶端之上,這是無可厚非的。

那時,區塊鏈和狀態都足夠小,同步不成問題,而且幾乎不使用任何資源。每個人都運行一個全節點 (full node),因此不需要輕客戶端 (light clients),而且在這條鏈上也沒有一個大型的服務行業與客戶端有著不同的需求。

但是,隨著這個鏈條的增長,其生態系統也在增長,因此擁有一個可以做所有事情的軟件已經沒有任何意義了。我們早期在對以太坊的研究瞭解到,節點不應該負責管理私鑰。如果用戶擁有一個聯網的軟件,該軟件同時還管理用戶私鑰,這將是一場災難 (很多相關的災難已經發生了)。

隨著我們的進一步發展,作者相信我們將看到大量的專業客戶端的出現。以太坊客戶端主要負責以下工作:

  • 作為輕客戶端 (不存儲完整的狀態信息),允許用戶與網絡進行交互;
  • 作為全節點,存儲完整的狀態信息和所有的歷史記錄;
  • 作為檔案節點,能夠創建自定義索引和數據集來檢查過去的狀態;
  • 通過 JSON-RPC 處理來自節點的數據請求
  • 為挖礦軟件提供數據;
  • 廣播區塊和交易;

這裡的問題是,在一個成熟的生態系統中,幾乎沒有任何一個用戶想要做所有上面這些事情。

這將如何影響軟件的複雜性?

搭建一個完成所有這些任務的區塊鏈客戶端是一項巨大的任務,需要幾年的技術工作。Parity 的以太坊代碼庫預計總共包含了約有 500kloc 行 Rust 代碼。(備註:kloc 即 kilo lines of code, 千行代碼)

但是代碼行數並不是複雜性的最佳標誌。作為一個開源項目,我們看到了不管是 Parity 公司內部還是外部的人員你都試圖加入這個項目。根據經驗,大約需要3個月的時間才能使代碼庫變得富有成效,然後你肯定依舊沒有完全掌握它。我想說的是,全世界共計最多隻有10個人瞭解以太坊客戶端的方方面面。比特幣的情況可以說更糟,因為它只有一種實現方式。我們曾建立一個比特幣客戶端,C++ 實現中存在的奇怪的邊角案例 (corner cases) 和 bug 的數量令人吃驚。由於沒有多個 (活躍的) 實現,這些漏洞從未被發現,因此成為了現在比特幣的一部分。

對此我們能做些什麼呢?

作者相信,在未來,區塊鏈將變得司空見慣,生態系統將變得更加成熟,沒有一個客戶端可以完成所有這些事情。很有可能礦工將運行一種類型的客戶端,諸如區塊瀏覽器 (block explorers) 這樣的歸檔服務將運行另一種客戶端,而終端用戶將運行輕客戶端 (可能在移動應用程序中)。對於那些想通過向輕客戶端提供數據或存儲歷史區塊數據的方式來獲利的人,區塊鏈網絡上將引入更多的角色。

關於為什麼會發生這種情況,存在兩個主要的論據。首先,這是處理複雜和大規模核心開發的唯一方法,如果我們想要有一個功能良好和成熟的生態系統,這是必要的。

第二個是經濟問題。無論是以太坊還是比特幣,目前核心開發者都不可能賺錢。這是一個典型的“公地悲劇 (tragedy of the commons)”的情況,即每個人都在使用這個軟件,但沒有人覺得對它負有責任,或特別想為它花錢。

作者認為,我們不可能擺脫這個公地悲劇的問題,除非我們實現客戶端的專業化,並開始在軟件的使用中引入經濟模型。因為所有的都是開源軟件,你總是可以刪除任何硬編碼的經濟模型,但作者認為這並不是一個問題。

從作者今天在許多生態系統中觀察到的情況來看,核心的開發工作往往是通過團隊提供顧問服務或者從慷慨的捐助者獲取的資金來加以支撐的。但這是不可持續的。對於大多數核心開發團隊來說,從事顧問工作是讓人分心的,這並不是他們想從事的工作。這就是專業的區塊鏈客戶端可以發揮作用的地方。

區塊鏈客戶端的類型 & 如何通過客戶端來獲利

當前,礦工並不認為他們應該為使用某個區塊鏈客戶端而付費,因為客戶端是開放源代碼的,對每個人都有好處。但如果存在一個專門為礦工服務的區塊鏈客戶端,那會怎樣呢?這個客戶端可能有一個小標誌,即它允許你設置一個貢獻率,並且默認值可以設為諸如每挖一個區塊則需要支付1美元。

如果 Parity 公司通過 Parity 客戶端從以太坊主網獲得$1/區塊的收益,那麼該公司從中獲得的收益將超過其獲得的任何商業項目和贈款的總和。更重要的是,它將給 Parity 一個可持續的和可預測的收入來源,只要 Parity 客戶端被礦工使用且有價值。但其中的問題是,對於礦工來說,某個客戶端將可能要遠優於其他試圖為所有人提供最優服務的客戶端,如此一來,多客戶生態系統所帶來的好處將蕩然無存。

如果你關注挖礦用例,你可以對節點的操作方式進行基本的更改。你可以使用完全不同的方式來管理 merkle-trie。不需要通過 trie 訪問數據的方式來實現同步或為輕客戶端提供服務,只需要生成一個 merker-root 即可。你可以對資源使用進行完全不同的假設,比如要求礦工必須有 32GB 的內存,而輕客戶端用戶則無需如此。

你將根本不需要管理 RPC,並且可以為此消除整個複雜性。礦工們將需要去工作並報告挖出的區塊,這是兩個端點。你可以通過在客戶端中囊括礦池軟件、部署分層服務器所需的工具等等來提升競爭力。這些都與普通用戶無關,也不屬於“適用所有人”的區塊鏈客戶端範疇。

為了解決所有礦工都使用相同的挖礦軟件的問題,你可以根據挖礦軟件的分佈情況來衡量獎勵,鼓勵更多的參與者,或者任何人都沒有獎勵。你還可以在這裡玩其他聰明的經濟遊戲,但是它們都需要非常複雜的協議層更改,這可能會導致其他副作用。作者還不清楚如何解決這個問題,除非希望市場上的經濟競爭對它不利。

輕客戶端需要一種與網絡進行交互的方式來請求數據,它需要驗證默克爾證明 (Merkle proofs) 和 PoW 哈希,之後它需要一組 RPC 方法才能夠向使用該輕客戶端的應用程序傳遞這些信息,不管該應用程序是 Dapp 或是錢包應用。

從概念上講,這比其他任何事情都要簡單得多。在實踐中,輕客戶端與全節點在 RPC 方面有很多重疊的地方,我們稍後將討論這個問題。

輕客戶端的問題在於,它們目前依賴於利他行為 (altruistic behavior)。沒有人有任何理由去服務輕客戶端。它不能增強網絡 (這就是為什麼你想要廣播區塊和交易),所以你沒有理由去這麼做。在理想的情況下,輕客戶端的用戶將使用一個輕客戶端服務器來開啟一個支付通道,併為他們發出的每個請求發送一個微支付。

此外,你還可以讓輕客戶端打開一個通向軟件製造商的通道,並將該微支付的千分之一發送給軟件製造商 (或者任何其他適當的費率,也可能由用戶選擇)。假設某個輕客戶端擁有一個由數百萬移動輕客戶端用戶組成的龐大且健康的生態系統,這可能會帶來相當可觀的收入。

在編寫和維護的複雜度方面,全節點一直是複雜度最高的軟件,因為全節點需要進行的工作量最多。但仍然有一些事情是它們不需要做的:它們不需要成為輕客戶端,也不需要處理挖礦和區塊的生成。

它們需要能夠在網絡上發送、接收和驗證數據。它們還需要能夠為輕客戶端提供服務。它們可以從為輕客戶端提供服務而獲得報酬。與輕客戶端類似,軟件製造商也可以從獲得的利潤中抽取一部分 (通常是可選擇性的)。

我們可以想象通過取消 RPC 接口來消除大量的複雜性。除了通過一個輕客戶端之外,基本上沒有其他方法可以與節點進行交互。這可能會對性能產生負面影響 (尤其是對於沒有針對輕客戶端進行優化的 DApp)。高級用戶可能希望能夠直接與全節點交互,從而獲得最佳性能。但是,在輕客戶端和全節點之間添加一個“本地”接口 (例如 IPC 或類似的接口) 會更簡單,所以如果你是高級用戶,你可以同時運行這兩個接口,且輕客戶端仍然完全負責 RPC 接口的複雜性。

對於簡化接口,並圍繞生成 GraphQL 之類的提出更好的結構,這方面也有一些值得注意的地方,生成 GraphQL 既可以在“客戶端”( 用戶和節點之間) 也可以在“服務器端 ”(節點之間) 進行。

檔案節點 (archive node) 是一個有趣的例子,因為它在區塊鏈網絡上沒有任何用途,並且經常與全節點合併。檔案節點處理了很多額外的複雜性,因為它伴隨著更高的資源使用。

比特幣沒有類似於檔案節點的節點,但區塊瀏覽器仍需要建立自己的檔案節點。作者過去曾建議從主客戶端中刪除檔案節點,讓使用它的用戶構建自己的版本。當前,這顯然不會受那些依賴於檔案節點軟件的人的歡迎。

檔案節點是一個能夠快速獲取歷史數據、構建額外的索引和存儲中間狀態的全節點。對於構建上文描述的全節點的人來說,這裡有一個添加“鉤子”的機會,這樣就可以“將所有處理過的交易發送到 Elasticsearch 搜索引後端”。歸檔服務變得越來越複雜,現在出現了一些根本不使用內置歸檔模式的服務。它們使用全節點的 RPC 來提取數據並將其塞入 Kafka 或類似的東西中進行處理。

我們可以想象一個單獨與網絡交互來獲取數據的軟件。然後,它將為外部索引器和數據源提供靈活性,使它們能夠獲取數據並進行處理。

無論哪種情況,這都是很難收費的,因為期間並沒有發生鏈上交易或鏈下支付。作者相信,一個好的檔案軟件將會成為一個封閉源碼專用軟件的絕佳案例,因為它本質上只是一個分析工具。

這類軟件有很多的消費者。Block explorers 是區塊鏈世界的 Infura,它向終端用戶提供數據,而不需要經過網絡、或者是研究區塊鏈交易模式或行為的分析者或者研究者。它們都有不同的需求,但最好是通過構建連接到現有數據庫和工具的軟件來滿足這些需求,從而完成除了它們之外任何人都不需要做的事情。

這個角色還不存在,但作者認為這就是為什麼許多人將檔案節點與其他節點混淆的原因。在以太坊中,一個全節點存儲所有歷史數據,但它不需要這樣做。

實際上,全節點不需要存儲超過最後100個區塊的數據就可以達到敲定區塊的目的。移除其他的數據可以使全節點的存儲需求節省 100 GB 的容量。當前還沒有出現移除這些數據同時確保歷史數據的可用性的方法。當已經出現一些相關的討論,即將這些數據放在 IPFS (星際文件系統) 中,並將幾個對此感興趣的人的數據固定在 IPFS 上。

當然,這與一個需要利他行為者的輕客戶端的處境是一樣的。理想的情況是,我們能想出一種激勵機制來存儲這些歷史數據,這樣至少有一些經濟上的保證可以使用這些數據。人們可以想象使用某個互操作性網絡將這些數據存儲在眾多區塊鏈中的一個之上,該區塊鏈專門為長時間存儲大量數據而定製。

然後我們就可以解決這個問題,並消除所有全節點存儲所有歷史數據記錄的必要性。問題是誰將為此買單,因為確保數據可用性並不是單個實體的責任。它將必須通過通脹來進行支付,這需要一項艱難且可能引發爭議的共識改變。

未來之路

作者個人認為,區塊鏈的未來就是權益證明 (PoS)。這並不是說工作量證明 (PoW) 會消失,PoW 是一個了不起的發明,比特幣將永遠使用它。新的區塊鏈將使用 PoS 機制,並可能使用 PoW 來實現特殊的抗女巫攻擊,或者在諸如 VDF (可驗證延遲函數) 或 VRF (可驗證隨機函數) (作者傾向於將其歸類為 PoW 的一個子集) 等中使用 PoW。

我們已經在區塊鏈世界中看到了一些 PoS 的嘗試,但它們通常都非常簡單。在更復雜的 PoS 設計中,我們已經看到了將協議分為許多新角色的趨勢。

在 PoS 機制中會存在驗證者 (validator) 取代礦工 (miner),但有時也存在繼任者 (nominator) 或者代理人 (delegator)。在諸如比特幣等區塊鏈中,我們看到在第二層出現了許多新的角色,比如閃電網絡的瞭望塔 (watch tower) 等等。作者相信,上面的佈局同樣適用於 PoS 世界。

驗證者與全節點具有完全不同的興趣和需求。全節點的功能與輕客戶端也非常不同。

當第一次搭建軟件時,將所有東西構建為一個整體要容易得多,並且少數理解整個設計的人可以在一個地方完成所有的事情,並確保從第一天開始所有事情都是一致的和有效的。如果你從第一天就開始嘗試以分散的方式構建這種去架構,我幾乎完全肯定你會搬起石頭砸自己的腳。

我們進入以太坊已經5年了,我們現在才開始清楚地看到這些用戶和他們的需求。沒人能在第一天就預測到,幾乎整個以太坊的用戶群都會通過一箇中心化的服務與網絡進行交互。再過5年或10年,作者認為我們將見證這些針對所有下一代區塊鏈的專業化客戶端的崛起。

問題是我們是否將會看到這些客戶端是否會像當前一樣針對比特幣和以太坊。作者對此持懷疑態度,因為這涉及到大量的工作,但其中的有利可圖將可能會鼓勵更多的人參與進來。

參考鏈接:

https://medium.com/@folsen/the-future-is-a-myriad-of-blockchain-clients-d05e1d7ac181

作者 | Fredrik

來源 | Medium

編譯 | Jhonny


分享到:


相關文章: