#rollup #tezos #smart

no-std mavryk-smart-rollup

Mavryk智能Rollup内核开发的SDK

1个不稳定版本

0.2.2 2024年7月30日

#5 in #tezos

Download history 66/week @ 2024-07-24 49/week @ 2024-07-31

115 每月下载量

MIT 许可证

370KB
7.5K SLoC

Mavryk智能Rollups的SDK。

要了解Mavryk中智能Rollups是如何工作的,请参阅智能Rollup文档

此SDK的目的是使在Rust中编写智能Rollup内核变得简单。

要了解SDK当前版本的更改,请参阅更改日志

智能Rollup内核

内核是一个在智能Rollup上运行的32位 WebAssembly 程序。它决定Rollup如何处理输入消息,更新Rollup状态,并在何时输出针对第1层的消息。

虽然任何具有WebAssembly编译支持的编程语言 都可以 用于编写Rollup内核,但由于Rust提供了第一级的WASM支持、确定性的运行时和安全的内存管理,因此Rust是一个非常好的选择。

Rust设置

rustup 是获取Rust的标准方式。一旦 rustup 安装,可以使用以下命令启用WASM作为编译目标:

rustup target add wasm32-unknown-unknown

Rust还有一个 wasm64-unknown-unknown 编译目标。这个目标 不兼容 Mavryk智能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 often 是gcc,它不支持内核构建。确保使用clang

export CC=clang

功能

功能 默认? 启用 关于
std alloc 禁用以进行 #![no_std] 集成
alloc 启用需要 alloc 包的方法/类型
panic-hook 将panic打印到调试日志并中止
dlmalloc 启用 dlmalloc 作为默认分配器
crypto mavryk_crypto_rs mavryk_crypto_rs 类型的集成
bls mavryk_crypto_rs/bls Dac证书签名验证
data-encoding mavryk_data_encoding mavryk_data_encoding 特性集成
测试 cryptomavryk_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]
mavryk-smart-rollup = "0.2.2"
mavryk_data_encoding = "0.5"
mavryk_crypto_rs = { version = "0.5", default-features = false }
nom = "7.1"

[dev-dependencies]
mavryk-smart-rollup = { version = "0.2.0", features = ["testing"] }

请注意,需要 cdylib crate 类型才能启用编译为 wasm。

以下 lib.rs 文件可用于开始使用 'hello kernel'。此内核将在每个 inbox 级别运行一次。

use mavryk_smart_rollup::prelude::*;
use mavryk_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 可以显著减小这些文件的大小,它将移除调试符号和元数据等不需要在 Smart Rollups 上执行的二进制文件

wasm-strip kernel.wasm

您可以使用 mavkit-smart-rollup-wasm-debugger 测试此内核。

# Create an empty inputs.json file - the 'hello world' kernel does not read inputs.
echo '[[], []]' > inputs.json

# Run the kernel:
mavkit-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–12MB
~132K SLoC