追求極致的設計理念!用 RISC-V 從頭設計 CKB 虛擬機

Nervos 底層公鏈 CKB 的虛擬機(CKB-VM)是基於 RISC-V 指令集打造的區塊鏈虛擬機。在上一堂分享中,我們簡單介紹了區塊鏈虛擬機,以及我們理想中的區塊鏈虛擬機的樣子。在本篇文章中,CKB-VM 設計者將詳細的介紹 CKB 虛擬機的設計理念,以及選擇 RISC-V 指令集背後的思考邏輯。

祕猿科技區塊鏈小課堂第 23 期


CKB-VM 的設計理念

CKB 是 Nervos Network 的基礎層,其目標是 爲上層應用提供足夠的安全性和去中心化 。在調研 CKB-VM 選型的過程中,我們反覆思考:CKB-VM 應該要有哪些特性?顯然,對於一個在區塊鏈上使用的虛擬機,有兩個關鍵特性在任何情況下都必須滿足:

  1. 確定性 :對於固定程序和輸入,虛擬機必須始終返回固定的輸出結果,結果不會由於時間、運行環境等其他外部條件而改變;
  2. 安全性 :執行虛擬機時不會影響到平臺本身的運行。

但是這些條件僅僅是強制性條件,我們希望設計出一個虛擬機,能夠更好地服務於 CKB 的目標。經過深思熟慮,我們認爲這樣的虛擬機應該 滿足如下特性:

  • 靈活性

我們的目標是設計出一個足夠靈活,能夠長期運轉的虛擬機,從而使得 CKB 能夠與密碼學的發展攜手並進。密碼學的歷史是一段「執劍」和「破壁」的永恆之戰:數千年的密碼學發展史,加密與解密是一場沒有終點的智力角逐,過往如此,未來亦然。一些適用於今天的加密算法,比如 secp256k1,將來可能會被淘汰;未來還會有更多有價值的新算法和技術(如 Schnorr 或後量子簽名等)不斷涌現。在區塊鏈的虛擬機上運行的程序,應該能夠更自由便捷地使用新的算法,同時那些已經被過時的算法應該能夠自然地被淘汰。

爲了方便理解,我們用比特幣來舉例。目前,比特幣使用的是 SIGHASH 1 來進行交易簽名,並且在共識協議中使用了 SHA-256 哈希算法。那麼我們能夠確保幾年後比特幣用的這種 SIGHASH 方式仍然是最好的選擇嗎?或者說,伴隨着日益增長的算力,SHA-256 仍然適合作爲穩定的哈希算法嗎?而目前我們研究的所有區塊鏈協議,若需要升級加密算法,則則不可避免地需要硬分叉。 在設計 CKB 時,我們希望探索如何通過 VM 的設計來降低硬分叉的可能性。

我們在思考,虛擬機是否可以允許升級加密算法?或者說,是否能夠向 VM 添加新的交易驗證邏輯?比如,在仍然使用 secp256k1 的情況下,如果有經濟激勵的驅動,或者出現更新算法的需求,我們是否可以在不分叉的前提下實現更高效的簽名驗證算法?又或,如果有人找到了在 CKB 上實現更好算法的途徑,或者需要引入一個新的加密算法,那麼我們是否能夠確保他/她自由的實現?

我們希望 CKB-VM 能夠給大家提供更多的實現空間,最大限度地提供靈活性,並且可以讓用戶無需等待硬分叉即可使用新的加密算法。

  • 運行透明性

在對當前這一代區塊鏈 VM 進行研究後,我們注意到了一個問題,還是以比特幣爲例:比特幣的 VM 層提供的僅僅是一個堆棧,並且執行時堆棧無法知曉可以存儲在堆棧上的數據大小,或堆棧深度,其它所有以堆棧模式實現的 VM 都有同樣的問題,雖然共識層可以提供堆棧深度的定義或間接提供堆棧深度(基於指令長度或 gas 限制)。這會讓 VM 上的程序開發者必須要去猜測程序運行時的狀態,這種類型的 VM 讓程序無法充分發揮 VM 的全部潛能。

基於這個問題,我們認爲應該優先定義 VM 操作期間所有資源的限制,包括 gas 限制和堆棧空間大小,並讓在 VM 上運行的程序能夠查詢資源的使用情況, 這將使得在 VM 上運行的程序可以根據資源可用性來採用不同的算法 。通過這種設計,程序可以充分發揮 VM 的潛能。並且在以下場景中,我們能夠看到 VM 更多的靈活性:

  1. 可以根據用戶在 CKB 上可用的存儲空間(Cell Capacity)爲存儲數據的智能合約選擇不同的策略。當 Cell Capacity 充足時,程序可以直接存儲數據以減少使用的 CPU cycle(CPU 要執行一條機器指令經過的步驟)數量;當 Cell Capacity 受限時,程序可以壓縮數據以適應較小的 Capacity,使用更多的 CPU cycle。
  2. 可以根據用戶存儲的數據(Cell Data)的總量和剩餘內存的大小爲智能合約選擇不同的處理機制。當存在少量 Cell Data 或大量剩餘內存時,所有的 Cell Data 都可以被讀取到內存中進行處理。當存在大量 Cell Data 或剩餘內存很少時,每個操作可以僅讀取部分內存,類似於交換內存的操作。
  3. 對於一些常見的合約,比如哈希算法,可以根據用戶提供的 CPU cycle 數選擇不同的處理方法。例如,SHA3-256 的安全性已經足以滿足大多數場景的需求,但是,合約可以通過使用更多的 CPU cycles 來利用 SHA3-512算法以滿足更高的安全要求。
  • 運行期開銷

以太坊虛擬機(EVM)中的 Gas 機制是一個非常天才的設計,它優雅地解決了區塊鏈應用場景下的停機問題(因爲以太坊是圖靈完備的,所以允許循環語句,但是無限循環語句容易導致停機問題,Gas 機制限定了一個區塊的最大計算量,從而避免了這個問題),並允許程序在完全去中心化的虛擬機上進行計算。但是我們發現,在 EVM 中針對不同的 Opcode(操作符)設計一個合理的 Gas 計算方式是一件非常難的事情,EVM 幾乎在每次版本更新時都要調整 Gas 計算機制(EVM 的抽象層級相對較高,一條 EVM 指令可能對應若干條底層硬件指令,在執行程序時,處理的數據量和計算複雜度都只能通過估算來定價,所以 EVM 需要不斷的調整 Gas 計算機制)。

因此我們設想:能不能通過 VM 的設計來確保程序運行時資源消耗的計算方式更加合理準確?

我們希望能夠找到一個提供上述所有功能的 VM 設計,但是發現並沒有現成的解決方案可以實現我們對 CKB 的願景。於是,我們決定重新設計一個能滿足上述所有特性的 VM,以更好的實現 CKB 的願景。

解決方案:RISC-V

圖片描述

RISC-V 是由加州大學伯克利分校的教授於 2010 年設計的開源 RISC 指令集架構(ISA)。RISC-V 的目標是提供一個通用的 CPU 指令集架構,以支持下一代系統架構開發,並在未來數十年中不會產生遺留架構問題所帶來的負擔。

RISC-V 可以滿足從低功耗小型微處理器,到高性能數據中心(DC)處理器的實現要求 。與其他 CPU 指令集相比,RISC-V 指令集具有以下優點:

  • 透明性

RISC-V 的核心設計和實現均遵照 BSD 許可協議(自由軟件中使用最廣泛的許可協議之一)。任何公司和機構都可以使用 RISC-V 指令集,並可以不受限制地創造新的軟 / 硬件。

  • 精簡性

RISC-V 的 32 位整數核心指令集只有 41 條指令,即使支持 64 位整數,也只有 50 條指令左右。在提供同樣功能的前提下,RISC-V 指令集比起有上千條指令的 x86 指令集,實現起來更容易也更能避免 Bug (x86 指令集手冊有 2000 餘頁,並會不斷的增加,而 RISC-V 指令集手冊僅 100 餘頁)。

  • 模塊化

RISC-V 採用簡化的內核,使用模塊化機制以提供更多擴展指令集設置。例如,CKB 可能會選擇實現 RISC-V 內核中定義的 V extension 來支持向量計算或爲 256 位整數計算添加擴展指令集,從而爲高性能加密算法提供可能性。

  • 支持的廣泛性

GCC 和 LLVM 等編譯器都支持 RISC-V 指令集,Go 針對 RISC-V 的後端也在開發中。CKB-VM 的實現使用的是廣泛的 ELF 格式,也就是說, 任何可以編譯成 RISC-V 指令集的語言均可以直接用來爲 CKB 開發智能合約。

  • 成熟性

RISC-V 核心指令集已經得到了最終的確認和固定,未來所有 RISC-V 的實現都需要向後兼容。所以當更新 VM 指令時,CKB 不會因此出現硬分叉。另外,RISC-V 指令集已經有了硬件實現,並在真實的應用場景中驗證過,且不會存在一些存在於其他支持較少的指令集中的潛在風險。

雖然其他指令集可能也具備上述特性中的一部分特性,但根據我們的評估,RISC-V 指令集是 唯一一個具備所有上述特性的指令集 。因此,我們選擇使用 RISC-V 指令集來實現 CKB-VM,另外,智能合約將使用 ELF 格式以確保更廣泛的語言支持。

此外,我們將爲 CKB-VM 添加動態鏈接以確保 Cell Sharing。儘管 CKB 的實現提供的是最流行的加密算法,但我們鼓勵社區提供更優化的加密算法實現以減少運行時開銷(CPU cycles)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章