28 个稳定版本 (3 个主要版本)

9.0.1 2022 年 10 月 20 日
8.0.0 2022 年 6 月 23 日
7.5.1 2022 年 5 月 27 日
7.2.2 2022 年 4 月 29 日
6.1.0 2022 年 3 月 29 日

#2982 in 神奇豆

Download history 4/week @ 2024-03-08 18/week @ 2024-03-15 89/week @ 2024-03-29 33/week @ 2024-04-05

每月下载量 161
用于 3 crates

MIT/Apache

685KB
14K SLoC

内置的 Filecoin 演员库

此仓库包含从 2022 年 7 月 6 日网络版本 16,时期 1960320 开始,Filecoin 网络中运行的链上内置演员的代码。

这些演员是用 Rust 编写的,并设计在 Filecoin 虚拟机 内运行。后者的一个参考实现存在于 filecoin-project/ref-fvm

此仓库的构建过程将每个演员编译成 Wasm 字节码,并生成一个聚合包供所有客户端导入。此包的结构是标准化的。以下为详细信息。

此代码库已在 FIP-0031 中规范化。因此,从网络版本 16 开始,此演员实现是网络唯一认可的实现。

Pre-FVM 演员库

以下网络版本(nv16 之前)的演员也在此实现

  • nv14 演员以促进测试。
  • nv15 演员以启用 nv15=>nv16 升级。

可导入的包

本仓库的主要输出是一个将所有演员的Wasm字节码打包成单个文件的CARv1存档,具有以下特点:

  • CARv1头指向一个单一的根CID。
  • 根CID解析为一个DAG-CBOR编码的块,该块定义了一个包含版本号(目前总是1)和ManifestPayload的CID的Manifest类型(如下定义)。
  • ManifestPayload(如下定义)包含在一个DAG-CBOR编码的块中,并定义了一个类型,该类型将演员类型名称与其对应的CID关联。
  • 所有演员的CID都包含在相同的CARv1存档中,与包含在RAW块中的编译Wasm字节码相同。

Manifest 架构

# Manifest is encoded as: [version, CID]
type Manifest struct {
  version Int
  payload &ManifestPayload
} representation tuple

# ManifestPayload is encoded as: [ ["actorkey", CID], ["actorkey", CID], ... ]
#
# It alternatively may be interpreted as:
#   type ManifestPayload {String : &ActorBytecode} representation listpairs
# Or simply as a list of tuples.
type ManifestPayload struct {
  system &ActorBytecode
  init &ActorBytecode
  cron &ActorBytecode
  account &ActorBytecode
  storagepower &ActorBytecode
  storageminer &ActorBytecode
  storagemarket &ActorBytecode
  paymentchannel &ActorBytecode
  multisig &ActorBytecode
  reward &ActorBytecode
  verifiedregistry &ActorBytecode
  datacap &ActorBytecode
  placeholder &ActorBytecode
  evm &ActorBytecode
  eam &ActorBytecode
  ethaccount &ActorBytecode
} representation listpairs

# RAW block
type ActorBytecode bytes

在此仓库中,预编译的演员包以发布二进制文件的形式提供。在crates.io上的fil_builtin_actors_bundle存储库将不会更新。

发布

我们通过以下方式同时发布所有演员、运行时和状态抽象:

  1. 更改顶层Cargo.toml文件中的workspace.package.version
  2. 在GitHub中创建一个发布

这将触发GitHub CI的自动打包构建,生成的包将被附加到GitHub发布中。

客户端实现说明

获取演员包

有两种选择

  1. 从源代码构建。
  2. 从GitHub下载预编译的发布包。

从源代码构建说明(选项1)

  1. 克隆仓库。
  2. 检出相关的分支或标签(见下文版本节)。
  3. 从工作区根目录运行make bundle

包将被写入到output/builtin-actors.car

两种选项都支持通过脚本或CI管道进行自动化。

集成演员包

这部分是特定实现的。选项包括

  1. 将包的CARv1字节嵌入到发行版的二进制文件中。
  2. 启动时下载CARv1文件(带有某种形式的校验和以提高安全性)。

使用ref-fvm加载和演员包

一旦实现已验证包的真实性,它应该执行以下操作

  1. 将CARv1导入到块存储中。
  2. 在内存中保留根CID,按网络版本索引。
  3. 将根CID馈送到ref-fvm的Machine构造函数中,告诉ref-fvm哪个CodeCID映射到哪个内置演员。

支持多个网络版本

由于每个网络版本可能由不同的演员代码支持,实现应准备好加载多个演员包并按网络版本对其进行索引。

在实例化ref-fvm Machine时,必须传递网络版本和相应的Manifest根CID。

版本控制

一个公平的问题是crate版本控制如何与ActorVersion的协议概念相关。我们采用了与specs-actors类似的政策

  • crate版本中的主版本号与ActorVersion相关。
  • 我们通常不使用小版本;这些版本始终设置为 0
  • 我们努力使主版本号保持为圆形,以表示特定网络升级的最终版本。然而,由于无法预测软件工程的一些方面,这不是一条硬性规则,后续版本可能通过增加补丁号来发布。

开发版本将使用如 -rc(发布候选)之类的限定符。

以下是一个将此政策应用于 v10 行为版本谱系的示例

  • 不稳定开发版本通过提交哈希引用。
  • 稳定开发版本标记为发布候选:10.0.0-rc1,10.0.0-rc2,等等。
  • 最终发布版本:10.0.0。
  • 修补后的最终发布版本:10.0.1。
  • 修补后的最终发布版本:10.0.2。
  • 网络升级在 10.0.2 上启动。

关于此代码库

与 specs-actors 的关系

此存储库取代了 specs-actors,并承担两个角色

  • 内置行为的可执行规范。
  • 内置行为的规范、可移植实现。

致谢

此代码库最初是从 Forest 客户端 的行为 v6 实现中分叉的,并适应了 FVM 环境。

社区

由于此代码库是所有 Filecoin 客户端实现中的公共财富,它为所有核心开发者提供了一个汇聚点,无论他们认同哪种实现或项目。

许可

双许可:MITApache 软件许可协议 v2,通过 宽容许可协议栈

除了 EVM 预编译 测试数据,它根据 LGPL v3 许可,不包括在 crate 或构建工件中。

依赖项

~11MB
~187K SLoC