执行器
执行器负责向 Substrate Runtime 调度和执行调用。
Runtime 执行
Substrate Runtime 被编译成一个本地可执行文件和一个 WebAssembly(Wasm)二进制文件。
本机 Runtime 作为节点可执行文件的一部分,而 Wasm 二进制文件则存储在区块链上的一个已知的存储键值下。
Runtime 的这两种表示方式可能不一样。 例如:当 Runtime 升级后。 执行器决定在调度调用时使用哪个版本的 Runtime。
执行策略
在 Runtime 开始执行之前,Substrate 客户端会建议使用哪个 Runtime 执行环境。 这是由执行策略控制的,可以针对区块链执行过程的不同部分进行配置。 这些策略是:
NativeWhenPossible
:如果本地的环境与给定的 wasm 模块兼容,就使用本地环境执行;否则退回到 wasm。Wasm
:使用给定的 wasm 模块。Both
:同时使用 wasm 和本地变体(若兼容)运行。 任何差异将报错。NativeElseWasm
:首先选择原生的,然后如果失败或不可能,就用wasm。
区块链执行过程中不同部分的默认执行策略是:
- 同步:
NativeElseWasm
- 导入区块:
NativeElseWasm
- 区块构造:
Wasm
- 链下 Worker:
NativeWhenPossible
- 其他:
NativeWhenPossible
Wasm 执行
Substrate runtime 的 Wasm 表示被视为规范的 runtime。 因为这个 Wasm Runtime 被放置在区块链存储中,网络必须就此二进制文件达成共识。 因此可以验证它在所有同步节点间是一致的。
Wasm 执行环境比本地执行环境更具限制性。 例如,Wasm Runtime 总是在具有可配置内存限制(最大4 GB)的32位环境中执行。
由于这些原因,即使 Wasm 执行比本地执行要慢得多,区块链还是倾向于使用 Wasm Runtime 进行区块构建。 在 Wasm 中执行的某些逻辑将总是能在本地执行环境中运行,但不能反过来说。 Wasm 执行可以帮助确保区块生产者创建有效的区块。
本地执行
本地 Runtime 仅在被选择为执行策略,并且与请求的 Runtime 版本兼容时,执行器才会选择使用它。 对于除了区块构造以外的所有其他执行过程,首选本地 Runtime,因为它性能更高。 在不应运行本地可执行文件的任何情况下,都将以执行规范的 Wasm Runtime 代替。
后续步骤
进一步学习
- 查看 Runtime 文档 阅读更多关于 runtime 升级。
例子
代办事项
参考文档
Check out the different 执行策略。
Take a look at the different 执行策略选项。
Review the Runtime 版本的定义。