本文譯自 IOHK 博客《Cardano: robust, resilient – and flexible》,作者:Kevin Hammond,軟件工程師。2021 年 10 月 21 日。
導讀:Cardano 區塊鏈上的 NFT 項目正在爆發式發展,但與此同時,由於 NFT 創建過程涉及到在短時間內處理大量交易,因此使得 Cardano 出現了明顯的網絡擁堵問題。IOHK 的這篇文章從架構設計和參數配置角度解釋了這些問題出現的原因並簡單說明了短期及中長期的可能方案。
Cardano 的設計目標是能以全球級分散式的方式為數以億計用戶提供服務。與其它去中心化區塊鏈一樣,這意味著我們需要穩定持續地產生符合預期的新區塊;這些區塊以透明的方式記錄了用戶之間的交易,合在一起會讓區塊鏈不斷增長。為了確保新區塊能以一種高效且安全的方式傳播到整個網絡,整個系統必須要在計算、內存、存儲和網絡資源的消耗上達到足夠高的效率。
靈活性是此中關鍵,因此 Cardano 協議的一個重要特徵就是其架構設計充分考慮了真正的可擴展性(scalability)。這不只是為了實現更長期的目標,即把 Cardano 打造成一個真正全球化的、完全去中心化的操作系統;而且其還採用了參數化的方法,旨在靈活應對價格波動、網絡飽和及需求增長等情況。Cardano 提供了一些協議參數,可讓該系統無需硬分叉即可實現對系統行為的調整。即便如此,如果確實需要更重大的升級,也能夠使用我們的硬分叉組合器(HFC/hard fork combinator)技術實現。這些特性組合起來,成為了 Cardano 不同於現有其它區塊鏈的差異化要素,讓今天的 Cardano 就已經非常穩健和可靠,並且使其具備了高度敏捷(agile)的升級路徑,從而能靈活應對網絡的增長和使用情況的變化。
Cardano 的路線圖設計分為一系列階段,從而讓我們能一步一個腳印地邁向最終目標。Byron 階段的目標是採用聯合網絡形式實現基本的交易功能。這讓我們可以開始構建社區和建立合作關係,同時向下一階段努力。Byron reboot 為進一步的功能開發奠定了堅實的基礎,而 Shelley 階段則引入了質押池,進一步擴大了社區規模並開始了 100% 去中心化的區塊生產之旅。
今年 Cardano 又引入了幾個備受期待的新功能。自 2021 年初以來,隨著 Mary 世代的到來,Cardano 已經支持在賬本上創造其它資產代幣和非同質化代幣(NFT)。由於 Cardano 手續費很低,而且代幣創建無需智能合約,因此我們看到 Cardano NFT 出現了爆發式的增長。進入 9 月,Alonzo 升級使 Cardano 開始支持 Plutus 智能合約,從而使其可以運行種類繁多的去中心化應用(DApp)。目前 Cardano 的智能合約還處於相當早期的階段,但已經有數十個項目在開發 DApp 了而且已經有幾個項目已經接近可部署狀態。很快相關的開發活動會進一步加速。這些新功能會影響 Cardano 賬本處理新腳本和交易的方式,同時也會對可用資源產生新的需求。隨著交易活動增多,Cardano 架構支持實現敏捷地應對和適應需求。
網絡容量#
網絡連接是 Cardano 運作的核心。Cardano 網絡會向分散全球的節點分發交易和區塊數據,而這些節點的作用是生成和驗證該區塊鏈。這個過程稱為數據擴散(data diffusion),這個必需的過程能為節點提供所需的信息,保證共識算法正確決策。這些決策能推動該區塊鏈向前演進,因為節點之間的共識可確保所有交易都得到檢驗和驗證,並進一步被公開透明地納入到新的區塊中。
Cardano 的共識協議是去中心化的 Ouroboros Praos。通過對協議參數 d 執行一系列修改,Cardano 已經從之前的聯合式 Ouroboros Classic 協議遷移到了 Praos 協議。Ouroboros Praos 的安全性是有高度保證的,其基礎是許多在頂級網絡安全和加密技術會議與期刊中經受過同行評議的研究論文。
網絡性能會影響該系統整體工作的速度。其中包括以下指標:
- 吞吐量(傳輸的數據量)
- 及時性(納入區塊的時間)
這兩項要求是互相矛盾的。當我們已能最高效地使用生成的區塊時,我們可以盡可能最大地提升吞吐量。反過來,這意味著要有足夠的緩衝來掩蓋延遲,這能減緩全球分散式系統的不便。
更多緩衝通常意味著能更好地使用區塊(及網絡),但其代價是當系統過度飽和時延遲(即納入到鏈中的時間)會更長。
區塊預算#
要理解 Cardano 執行交易和腳本的速度,我們首先應該定義區塊預算(block budget)的概念。Cardano 的區塊大小目前限制為最大 64 KB,這個參數的設計平衡考慮了優良的網絡利用率與盡可能小的交易延遲。單個區塊可能會包含多種不同的交易,包括使用 Plutus 腳本的交易(智能合約)、native token、元數據、基本 ADA 交易(支付)。類似地,目前單個交易的大小規模限制在最大 16KB。這能確保單個區塊總是包含多個交易(至少 4 個,但通常會多得多),由此提升整體的交易吞吐量。
區塊時間預算也是一個重要屬性,這是指用於處理單個區塊中所有交易可用的時間,這個時間長度是固定的。這分為用於執行 Plutus 腳本的時間和用於執行其它交易的時間。這個屬性能確保使用 Plutus 腳本的交易不會壟斷所有可用的時間預算,因此該系統總是可以在包含 Plutus 腳本的區塊中處理基本支付。用於生成每個區塊的總時間預算(包括網絡連接成本)設置為 1 秒,其中用於執行 Plutus 腳本的可用時間預算大約為 50 毫秒。在實踐中,這個參數是相當寬鬆的 —— 基準測試已經表明:在參考系統上,許多真實腳本的執行時間都小於 1 毫秒。
區塊時間預算目前設置為 1 秒。出於安全考慮,Praos 共識協議會在有可能加到鏈上的區塊中選擇小部分(二十分之一)。那麼在當前的協議參數下,最大交易吞吐量(簡單交易)大約為每秒 11 筆交易(11 TPS)。很顯然,不同交易的數據量大小不一樣,也具有不同的有效負載。舉個例子,單筆交易就能最終確定一整輪 Catalyst 投票,轉移價值數百萬美元的資產。
正如前面討論的,每個區塊都包含用戶通過錢包或命令行工具(CLI)等提交的許多交易。這些交易會被保存在一個臨時的內存托管區(即 mempool / 內存池),直到它們可被處理並納入到區塊中。當一個區塊生成之後,未被處理的交易會被移出內存池,然後新的交易又會加入內存池。通過使用大小固定的內存池,我們可以避免網絡在需求旺盛時過載,但這也意味著錢包或應用可能需要重新提交交易。目前內存池的大小設定為 128 KB:即當前區塊大小的兩倍。這個參數是基於排隊模型(queuing model)選取的。
網絡延展#
Ouroboros 的設計目標是有能力處理大量數據以及不同複雜度和大小的交易和腳本。目前來說,使用當前的參數,Cardano 網絡平均只能使用大約 25% 的容量。當然,最高效的情況是 Cardano 的容量基本 100% 能用掉(即網絡飽和)。雖然許多網絡連接方案可能會在這種情況下出問題,但 Ouroboros 和 Cardano 網絡的結構設計使其能夠公平且高度彈性地應對嚴重飽和的情況。基準測試分析表明:在 200% 飽和度下,Cardano 的整體性能仍然是有彈性的,不會出現網絡故障問題。即使是在 44 倍的壓力測試下,整體可用的網絡容量依然沒有出現問題(但某些交易可能會稍有延遲)。Cardano 網絡的工作模式就是這樣設計的,使用背壓(backpressure)機制來管理整體系統負載。因此,舉個例子,儘管某些用戶在參與大型 NFT 項目發行時可能會等待更長的交易時間,或可能需要重新提交大批量交易中某些個別交易(或使得 NFT 發行過程持續更長時間),但這並不意味著網絡「崩潰了」。這實際上表明 Cardano 網絡的表現正符合預期。我們稱之為「優雅的降級」,更多詳情請參閱這篇關於網絡設計的論文。
錢包#
錢包的作用是代表最終用戶向區塊鏈提交支付和其它交易,此外還能用於跟蹤區塊鏈狀態。錢包提供一大核心服務是:代表用戶提交交易、確認交易已經被區塊鏈接受、如果提交沒成功便繼續重試。也就是說,錢包應該考慮到網絡飽和時的背壓影響以及其它網絡問題的影響(比如暫時斷開連接、可能的鏈分叉等)。錢包分為兩種:
- 全節點錢包(如 Daedalus),其使用本地計算和網絡資源運行一個直接連接至 Cardano 網絡的節點。
- 輕錢包:其使用共享的計算和網絡資源來為大量最終用戶提供服務。
在網絡需求很高時(比如 NFT 發售時),這兩類錢包可能都會需要重試交易。輕錢包由於會向許多用戶共享資源,因此可能需要臨時擴展可用的計算和網絡資源(包括複製服務端點),這樣才能滿足用戶需求。這種按需擴展類似於公司發布一款受歡迎的新產品時需要臨時滿足的需求。相對而言,全節點錢包可能不會受到根本性的影響。交易可能會有所延遲,但每個錢包都會有重試提交交易的專屬資源,包括其自有的網絡連接。類似的原則對 DApp 提供商來說也適用 —— 其在提供特定的網絡端點時應該擴展系統資源來滿足需求。
過程優化#
我們自然歡迎 NFT 社區正在發生的創新(和交流)。為了提升用戶體驗,我們有必要優化開發流程,使得創建 NFT 等過程即使是在系統飽和時也能有效運作。舉個例子,許多 NFT 創建者會使用批處理來創建 NFT,這樣做的效率更高。
我們也鼓勵 NFT 創造者繼續優化流程,以盡可能減少網絡擁塞。我們也希望大家都加入到創造者社區的 Discord 討論中,我們有工程師幫助尋找適合特定案例的最佳匹配方案。
除了由參數調整提供的靈活性(如有必要可在一個 epoch 內實現),從中長期看,我們還有更進一步的選擇。Hydra 讓 Cardano 可以並行執行多個操作,實現更強的可擴展性。state-channel 解決方案可以提升系統吞吐量,同時降低對鏈上執行的需求。但是,儘管 Hydra 有多個可擴展性用例加持,但它並不能針對性地解決 NFT 創建效率問題。隨著 Cardano 繼續成熟和發展,我們將繼續努力優化網絡和管理網絡容量。正如我最近在十月份的月中更新中談到的那樣,隨著 Cardano 運行容量增長,我們可以按需調整 Cardano 的參數。比如,我們可以降低區塊時間預算、優化 Plutus 腳本的大小和執行時間或降低其執行成本、提升吞吐量。