#smart #rollup #tezos

无需 std tezos-smart-rollup

Tezos Smart Rollup 内核开发的 SDK

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 神奇豆子

MIT 许可证

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 特性集成
测试 cryptotezos_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.tomlsrc/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