3个版本 (破坏性)

0.3.0 2023年6月28日
0.2.0 2023年1月14日
0.1.0 2022年12月7日

#849数据结构

Download history 40/week @ 2024-03-11 252/week @ 2024-03-18 82/week @ 2024-03-25 165/week @ 2024-04-01 32/week @ 2024-04-08 16/week @ 2024-04-15 11/week @ 2024-04-22 118/week @ 2024-04-29 73/week @ 2024-05-06 133/week @ 2024-05-13 276/week @ 2024-05-20 149/week @ 2024-05-27 116/week @ 2024-06-03 141/week @ 2024-06-10 261/week @ 2024-06-17 290/week @ 2024-06-24

809 每月下载次数

MIT/Apache

120KB
2.5K SLoC

参考Filecoin VM实现(v4;开发版)

Continuous integration

此仓库包含Filecoin VM(规范)的参考实现。它使用Rust编写,旨在通过FFI集成到非Rust客户端(例如Lotus、Fuhon)或直接集成到Rust客户端(例如Forest)。仓库内提供了Go的FFI绑定,并鼓励开发者为其他语言贡献绑定。

有关详细信息,请参阅项目网站

构建要求

构建说明

$ git clone https://github.com/filecoin-project/ref-fvm.git
$ cd ref-fvm
$ make

代码结构

以下是每个目录中包含的内容

  • /fvm
    • Filecoin虚拟机的核心。关键概念包括
      • Machine:机器的一个实例,锚定在特定的状态根和时代,准备接收要应用的消息。
      • Executor:在Machine上执行消息的对象。
      • CallManager:跟踪和管理给定消息的调用栈。
      • 调用容器(概念层,代码中未明确出现):在调用栈中运行的特定actor所在的WASM实例和沙盒。
      • Kernel:与调用容器相关联的环境,用于外部交互。
    • 系统中有两个API边界
      1. actor代码和Kernel之间的边界,通过调用Syscalls进行遍历。
      2. FVM和主机节点之间的边界,由Externs表示。
    • FVM的一些部分基于Forest实现。
  • /sdk
    • 编写Filecoin本地actor的参考SDK实现,通过Actors FVM运行时shim由标准内置actor使用。
    • 使用Rust编写的用户定义FVM actor也可以使用此SDK,尽管它目前边缘相当粗糙。在未来几周内,我们预计将改进它以提高开发者体验。
    • 社区中将出现替代的SDK。我们也期待社区团队开发其他WASM可编译语言的SDK,例如Swift、Kotlin(使用Kotlin Native)甚至Go(通过TinyGo编译器)。
  • /shared
    • 核心类型和原始数据在FVM和SDK之间共享的crate。
  • /ipld
    • IPLD库。其中一些基于并从Forest实现中改编。
  • /testing/conformance
    • 包含测试向量运行器和其上的基准测试工具。
    • 一致性测试运行器将位于https://github.com/filecoin-project/fvm-test-vectors的测试向量语料库输入到ref-fvm,以验证规范一致性。
    • 基准测试工具使用Rust库criterion来测量ref-fvm在各种方面的性能和开销。
    • 有关如何运行测试和基准测试的说明,请参阅说明
    • 免责声明
      • 基准测试的运行、设置和拆卸目前非常慢,这是由于使用了默认的WASM缓存,很快就会修复。

许可

双许可:MIT、Apache Software License v2,通过Permissive License Stack


actors和vm是从ChainSafe/forest的提交73e8f95a108902c6bef44ee359a8478663844e5b分叉的。


lib.rs:

用于作为rust IPLD数据结构的KAMT crate,代表“固定大小键值AMT”,基本上是HAMT的副本,增加了一些被认为太复杂而无法添加到那里的额外功能。

KAMT中诞生的这些功能原本的目的是为了优化HAMT以适应EVM/Solidity存储布局,该布局使用哈希+偏移量来将数组项在连续的地址空间中定位。虽然HAMT允许以这种方式工作,但它导致树中非常深的部分只有叶子节点包含键值对。该数据结构的主要特点是跳过空级别并直接指向下一个数据节点。

另一个区别是,为了强调这一点,KAMT本身不执行任何哈希操作,它使用固定大小的字节数组作为键。

数据结构参考

依赖关系

~2–3MB
~57K SLoC