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

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

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


CKB-VM 的設計理念

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

  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)。

相關文章
相關標籤/搜索