4 个版本
0.2.2 | 2023 年 11 月 27 日 |
---|---|
0.2.1 | 2023 年 7 月 28 日 |
0.2.0 | 2023 年 6 月 15 日 |
0.1.0 | 2023 年 4 月 26 日 |
#2360 in 神奇豆子
320KB
6K SLoC
Tezos Smart Rollups 的 SDK。
要了解更多关于 Tezos 中 Smart Rollups 的工作原理,请参阅 Smart Rollup 文档。
此 SDK 的目的是使在 Rust 中编写 Smart Rollup 内核变得更加简单。
要了解 SDK 当前版本的更改,请参阅 变更日志。
Smart Rollup 内核
内核是一个在 Smart Rollup 上运行的 32 位 WebAssembly 程序。它决定 Rollup 如何处理输入消息,更新 Rollup 状态,以及何时输出针对 Layer 1 的消息。
虽然任何具有 WebAssembly 编译支持的编程语言 都可以 用于编写 Rollup 内核,但由于 Rust 的第一类 WASM 支持、确定性的运行时和安全的内存管理,Rust 是一个非常好的选择。
设置 Rust
rustup 是获取 Rust 的标准方式。一旦安装了 rustup
,可以通过以下命令启用 WASM 作为编译目标:
rustup target add wasm32-unknown-unknown
Rust 还有一个 wasm64-unknown-unknown
编译目标。此目标 不兼容 Tezos Smart Rollups,因为它们只提供 32 位地址空间。
安装 Clang
为了构建 Rust SDK,除了 Rust 之外,还需要 clang >= 11
。这可以通过您喜欢的包管理器安装。
在 MacOS 上,可以通过 homebrew 安装 LLVM 和 WebAssembly 二进制工具包 (WABT)
brew install llvm
brew install wabt
LLVM_PATH=$(brew --prefix llvm)
export AR="${LLVM_PATH}/bin/llvm-ar"
export CC="${LLVM_PATH}/bin/clang"
在 Linux 上,通常默认的 CC
是 gcc,它不支持内核构建。请确保正在使用 clang
export CC=clang
功能
功能 | 默认? | 启用 | 关于 |
---|---|---|---|
std |
✅ | alloc |
为 #![no_std] 集成禁用 |
alloc |
✅ | 启用需要 alloc crate 的方法/类型 |
|
panic-hook |
✅ | 将恐慌打印到调试日志并中止 | |
dlmalloc |
✅ | 启用 dlmalloc 作为默认分配器 |
|
crypto |
✅ | tezos_crypto_rs |
与 tezos_crypto_rs 类型集成 |
bls |
✅ | tezos_crypto_rs/bls |
Dac证书签名验证 |
数据编码 |
✅ | tezos数据编码 |
与 tezos_data_encoding 特性集成 |
测试 |
❌ | crypto ,tezos_smart_rollup_mock |
启用 MockHost 以编写测试 |
用法
以下 Cargo.toml
文件可用于设置与 Kernel SDK 一起进行开发
[package]
name = "kernel"
version = "0.1.0"
edition = "2021"
rust-version = "1.71.1"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
tezos-smart-rollup = "0.2.2"
tezos_data_encoding = "0.5"
tezos_crypto_rs = { version = "0.5", default-features = false }
nom = "7.1"
[dev-dependencies]
tezos-smart-rollup = { version = "0.2.0", features = ["testing"] }
请注意,需要 cdylib
crate 类型才能启用编译到 wasm。
以下 lib.rs
文件可用于开始使用“hello kernel”。此内核将在每个收件箱级别运行一次。
use tezos_smart_rollup::prelude::*;
use tezos_smart_rollup::kernel_entry;
kernel_entry!(hello_kernel);
fn hello_kernel(host: &mut impl Runtime) {
debug_msg!(host, "Hello, kernel!\n");
}
将这两个文件保存到 Cargo.toml
和 src/lib.rs
中,您可以编译内核
cargo build --release --target wasm32-unknown-unknown
cp target/wasm32-unknown-unknown/release/kernel.wasm .
通常,会产生大型 .wasm
文件。使用 wasm-strip 可以显著减少这些文件的大小,该工具将删除二进制文件中不需要的调试符号和元数据,例如在智能合约上执行时不需要的
wasm-strip kernel.wasm
您可以使用 octez-smart-rollup-wasm-debugger
测试此内核。
# Create an empty inputs.json file - the 'hello world' kernel does not read inputs.
echo '[[], []]' > inputs.json
# Run the kernel:
octez-smart-rollup-wasm-debugger --kernel kernel.wasm --inputs inputs.json
一旦进入调试器,您可以使用以下命令测试内核
> load inputs
Loaded 0 inputs at level 0
> step kernel_run
Hello, kernel!
Evaluation took 11000000000 ticks so far
Status: Waiting for input
Internal_status: Collect
> load inputs
Loaded 0 inputs at level 1
> step kernel_run
Hello, kernel!
Evaluation took 11000000000 ticks so far
Status: Waiting for input
Internal_status: Collect
如您所见,在每个级别,内核都会将 Hello, kernel!
打印到调试日志中。
单元测试
有关编写针对内核的单元测试的信息,请参阅 MockHost
。
依赖关系
~0.8–11MB
~108K SLoC