Filecoin Virtual Machine(FVM)


1. 簡介

  FVM 是 Filecoin 的虛擬機,不太懂區塊鏈的話可以簡單認為和 eth 的 EVM 類似(完全不懂這個就可以不看本文啦),但其實 FVM 更像 dfinity 的 WASM 容器,並且FVM 也是用 WASM 實現的.Filecoin 預計在2022年6月左右引入該功能.這種幅度的變化會影響許多組件:

  1. 鏈狀態層,用於存儲和加載用戶提供的代碼.
  2. 執行層, 用於編譯/解釋用戶提供的代碼,運行設計此類代碼的狀態轉換,並驗證結果.
  3. gas 模型,用於保護網絡並面對用戶可編程代碼時調節鏈容量需求/供應動態.
  4. 預先存在的baseline協議,以促進針對系統功能的可編程性.

  Filecoin 虛擬機(FVM)是一個基於IPLD(簡單描述:將文件分為固定大小的trunk,然后所有trunk構建一個merkle樹,多個版本的文件可以共用相同的trunk,甚至於可以像git一樣,新trunk存儲舊trunk和對舊trunk的修改就好)的 WASM執行層,能夠運行任意用戶提供的代碼.FVM取代了現有的非可編程執行層 Legacy VM.native actors的邏輯(相當於Filecoin中的智能合約)部署為Wasm 字節碼.針對非Filecoin 運行時(例如evm)的foreign actors也通過運行時模擬得到支持.

  本文是對FIP-0030的歸納總結,FIP-0030 為FVM 提供了一個參考的架構,並結識了它各種組件:(a) Machine,(b) Call Manager,(c) Invocation Container, (d)Kernel,(e)Syscalls 和 (f)Externs.定義了actor 代碼必須遵守的contract、系統調用可用的目錄、IPLD狀態操作的機制以及進一步的技術細節.

2. FVM 規范

2.1. 參考實現

filecoin-project/ref-fvm是fvm的一個參考實現,和本規范配套.

2.2. 上下文和 VM 接口

  在 Filecoin 中 VM 是執行層中負責在狀態樹上應用transactions的組件.這些transactions被封裝在消息中,有兩種消息:

  • 顯示消息 由secp256k1 或 BLS 賬戶actors 發送到鏈上,帶有簽名以證明其真實性
  • 隱式消息 由系統生成,不會出現在鏈上,也沒有簽名.比如包括cron ticks 和 reward cycles

VM 實例輸入參數簡單示范

let machine = Machine::new(
  epoch,                  // 鏈 epoch
  base_fee,               // 當前有效的基本費用
  base_circ_supply,       // 基礎循環供應
  nv,                     // 網絡版本
  state_root,             // 初始狀態樹的根 CID
  blockstore,             // blockstore 在執行期間加載和保存對象
)

  然后將消息應用到機器.每個應用程序都會生成一個返回對象,其中至少包含一個消息回執,一個礦工懲罰和一個礦工tip.

let ApplyRet { receipt, penalty, tip } := machine.apply_message(msg1);
let ApplyRet { receipt, penalty, tip } := machine.apply_message(msg2);
let ApplyRet { receipt, penalty, tip } := machine.apply_message(msg3);

消息回執記錄在鏈上.它保存交易的退出代碼、使用的gas,並且(可選)僅在成功時返回數據.
懲罰和 tip 是協議的加密經濟規則用來計算塊生產者的塊獎勵數量
一旦調用者處理完所有應用消息,就會刷新機器.這個操作將會計算最終狀態根.此操作還可能將新寫入的塊提交到blockstore

let final_state_root = machine.flush();

2.3. 責任

   FVM 講消息應用到狀態樹,它並不負責推進鏈本身.具體而言,主要負責:

  • 加載鏈上的Wasm 模塊並將他們編譯為機器碼
  • 對提供的消息執行預先檢查
  • 跨actors 路由呼叫, 通過呼叫管理器抽象
  • 處理來自actors的系統調用,並交付結果
  • 必要時與外部環境(filecoin 客戶端)交互
  • 管理IPLD狀態讀取和寫入操作
  • 實例化<核心技術設計>中描述的對象堆棧以此應用消息

2.4. 核心技術設計

該圖可以作為FVM技術設計的參考

Machine

Machine 是FVM在具體epoch的實例化,在特定的狀態根上,准備好接收消息以執行

Call Manager

Call Manager 協議奧處理給定消息所涉及的調用堆棧.這需要配置和銷毀Invocation Container,跟蹤gas使用情況,並在超過gas限制時停止執行

Invocation Container

Invocation Container(IC)是在單個調用的上下文中運行actor 代碼的環境/沙箱.同一actor 的沖入或遞歸將衍生出另一個IC.
IC 是FVM實現合約的Wasm 引擎的一個實例.合約包括:

  • 可用sysCalls作為可導入的主機提供的函數
  • 表示跨FVM邊界的數據的共享類型
  • actore 擁有的內存,用於在Syscalls中交換數據
  • 透明的gas 核算和自動執行暫停
  • (未來)社區通過一些治理過程"blessed"普及Wasm模塊的動態連接,以減少actore 字節碼大小(例如FVM SDK、IPLD編解碼器等)

Syscalls

Syscall是 Wasm 導入提供給actor的函數,允許它與Externs環境交互,並調用在客戶端執行(而不是Wasm)的性能更高的復雜操作(例如加密原語)

Kernel

Kernel 是有Call Manager 創建並注入 Invocation Container的對象,它處理Syscalls,並存儲調用范圍內的狀態

Externs

和SYScalls是FVM 提供給actor的函數蕾西,Externs是node 提供給FVM的函數.根據所使用的編程語言,Externs 層可能只是邏輯(如果客戶端和FVM都是用相同的語言編寫的),或者是FFI 形式的物理表示.

2.5. actors

actors 相當於其他網絡中的只能合約: 他們是存在於鏈上的邏輯片段,可以通過 message 觸發.

2.5.1 actor type

我們區分了3中類型的actor:

  1. Built-in actors
  2. Native actors
  3. Foreign actors

built-in actors

built-in actors 是協議定義的actor 類型.到目前為止,這些actor 與 legacy VM一起發布並與其緊密集成.對於Lotus,這些actor 位於 filecoin-project/specs-actors

通過采用通用的、可以值得執行字節碼格式,所有Filecoin客戶端都可以依賴編譯為Wasm自己嗎的單個代碼庫.這加快了協議開發,縮短了協議升級時間.並減少了協調開銷.

該代碼庫位於 filecoin-project/builtin-actors, FIP-0031 通過狀態遷移提出了其在網絡中的標准化.

這種方法有一些實際意義

  1. 規范actors 成為filecoin的公共代碼庫,核心開發人員圍繞它集中開發工作.
  2. Filecoin 客戶端會將規范的Wasm 字節碼嵌入到他們的二進制文件中.具體機制取決於實現.
  3. 網絡升級將同意在升級時期遷移到內置參與者的確切CodeCID

下面列出了所有built-in actors 的類型

/// The bundled CAR embedded as a byte slice for easy consumption by Rust programs.
///
/// The root CID of the CAR points to an actor index data structure. It is a
/// CBOR-encoded IPLD Map<String, Cid>, enumerating actor name and their
/// respective CIDs.
///
/// The actor names are values from this enumeration:
///
/// - "account"
/// - "cron"
/// - "init"
/// - "market"
/// - "miner"
/// - "multisig"
/// - "paych"
/// - "power"
/// - "reward"
/// - "system"
/// - "verifreg"
///
/// The Filecoin client must import the contents of CAR into the blockstore, but
/// may opt to exclude the index data structure.
pub const BUNDLE_CAR: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/bundle/bundle.car"));

Native user-defined actors

Native user-defined actors 定義的 actor 是專門為 FVM 運行時編寫的 actor.
用戶可以使用任何可以編譯成 Wasm 字節碼的編程語言編寫本地用戶定義的Wasm.但是一些特定語言的開銷(例如運行時,垃圾收集,stdlib等)可能會導致Wasm字節碼大小和執行開銷過大,從而轉化為更高的gas成本.使用Rust 編寫Native user-defined actors是合理的選擇,它缺乏運行時並可以具有通過no_std省略stdlib的能力和及其成熟的Wasm支持.

Foregin actors

Foregin actors 針對非FVM 運行時的智能合約或程序,通過仿真在可以在Filecoin網絡中運行.

運行Foregin actors 的能力對於跨鏈互操作性很有用, 並將Filecoin的范圍和實用性擴展到其他區塊鏈,使他們能夠更無縫地訪問filecoin 網絡的存儲能力.

我們目標第一個Foregin actors 通過部署EVM 字節碼支持eth 智能合約.這允許將現有經過實戰考驗的eth 智能合約直接且相對無風險地移植到Filecoin 網絡.

每個外部運行時都是一個actor 類型,有CodeCID標識.外部運行時的安裝就像任何其他actor 類型一樣.Foregin actor 實例是通過 InitAcotr 構建的.

總結

對filecoin 來說是很重要的一步,但在整個公鏈行業里只能說是平平無奇了,我個人還是推崇definity.

引用

filecoin-project/fip-0030


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM