觀點:區塊鏈客戶端的未來將百花齊放
在最低級別上,你需要進行組裝優化、編寫編譯器和虛擬機器 (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年,作者認為我們將見證這些針對所有下一代區塊鏈的專業化客戶端的崛起。
問題是我們是否將會看到這些客戶端是否會像當前一樣針對比特幣和以太坊。作者對此持懷疑態度,因為這涉及到大量的工作,但其中的有利可圖將可能會鼓勵更多的人蔘與進來。