1个稳定版本
6.0.2 | 2022年3月3日 |
---|
#705 in 异步
5KB
70 行
内置Filecoin角色
该仓库包含从2022年7月6日的网络版本16、周期1960320开始的Filecoin网络上链内置角色的代码。
这些角色是用Rust编写的,并设计在Filecoin虚拟机内运行。后者的参考实现存在于filecoin-project/ref-fvm。
该仓库的构建过程将每个角色编译成Wasm字节码,并生成一个聚合包供所有客户端导入。该包的结构是标准化的。下面详细说明。
该代码库已在FIP-0031中进行规范化。因此,从网络版本16开始,该角色实现是网络唯一认可的实现。
预FVM角色
以下nv16之前的网络版本的角色也在此实现
- nv14角色以方便测试。
- nv15角色以启用nv15=>nv16升级。
可导入的包
该仓库的主要输出是一个CARv1存档,将所有角色的Wasm字节码打包到一个文件中,具有以下特性
- CARv1头部指向一个单一的根CID。
- 根CID解析为一个DAG-CBOR编码的块,定义一个
Manifest
类型(下面定义),包含包格式的版本号(目前总是1
)和一个指向ManifestPayload
的CID。 ManifestPayload
(下面定义)包含在一个DAG-CBOR编码的块中,并定义了一个类型,将角色类型名称与其对应的CID相关联。- 所有角色的CID都包含在与RAW块内编译的Wasm字节码相同的CARv1归档中。
清单 模式
# 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
预编译的actor包以本repo中的发布二进制文件的形式提供。在crates.io上的fil_builtin_actors_bundle
包将不会更新。
发布
我们通过更改顶级Cargo.toml
文件中的workspace.package.version
同时发布所有actor、运行时和状态抽象。
- 在顶级的
Cargo.toml
文件中更改workspace.package.version
。 - 在GitHub中创建一个发布。
这将触发GitHub CI的自动打包构建,生成的包将附加到GitHub发布中。
客户端实现说明
获取actor包
有两种选择
- 从源代码构建。
- 从GitHub下载预编译的发布包。
从源代码构建的说明(选项1)
- 克隆repo。
- 检出相关分支或标签(见下面的版本控制部分)。
- 从工作区根目录执行
make bundle
。
包将写入到output/builtin-actors.car
。
两种选项都兼容通过脚本或CI管道进行自动化。
集成actor包
这部分是特定于实现的。选项包括
- 将包的CARv1字节嵌入到发行版的二进制文件中。
- 启动时下载CARv1文件(带有某些形式的校验和以提高安全性)。
使用ref-fvm加载和actor包
一旦实现已验证包的真实性,它预计将执行以下操作
- 将CARv1导入到blockstore。
- 在内存中保留根CID,按网络版本索引。
- 将根CID馈送到ref-fvm的Machine构造函数,以便告诉ref-fvm哪个CodeCID映射到哪个内置actor。
支持多个网络版本
由于每个网络版本可能由不同的actor代码支持,实现应准备好加载多个actor包并按网络版本对其进行索引。
在实例化ref-fvm Machine时,必须传递网络版本和相应的Manifest根CID。
版本控制
一个公正的问题是crate版本控制如何与协议概念ActorVersion
相关联。我们采用与specs-actors类似的策略
- crate版本中的主版本号与
ActorVersion
相关。 - 我们通常不使用次要版本;这些总是设置为
0
。 - 我们努力通过主crate版本来表示给定网络升级的最终发布。然而,由于无法预测软件工程的某些方面,这不是一条硬性规则,并且可能会通过增加补丁号来发布进一步版本。
开发版本将使用如-rc(发布候选)之类的限定符。
以下是一个将此策略应用于v10 actor版本谱系的示例
- 不稳定开发版本通过提交哈希引用。
- 稳定开发版本标记为发布候选:10.0.0-rc1、10.0.0-rc2等。
- 最终发布:10.0.0。
- 修补的最终发布:10.0.1。
- 修补的最终发布:10.0.2。
- 网络升级于10.0.2启动。
关于此代码库
与specs-actors的关系
本仓库取代了 specs-actors,并承担两个角色
- 内置actors的可执行规范。
- 内置actors的规范、可移植实现。
致谢
此代码库最初是从Forest客户端的actors v6实现中分叉而来,并适应了FVM环境。
社区
由于此代码库是所有Filecoin客户端实现中的公共资源,它为所有核心开发者提供了一个汇聚点,无论他们认同哪种实现或项目。
许可证
双许可:通过MIT、Apache软件许可证v2,由许可许可证栈提供。
除了EVM预编译的测试数据,它根据LGPL v3许可,不包括在crates或构建工件中。
依赖项
~130KB