17 个版本

0.0.18 2023 年 9 月 18 日
0.0.16 2023 年 6 月 7 日
0.0.14 2023 年 5 月 30 日
0.0.13 2023 年 4 月 7 日
0.0.6 2022 年 11 月 28 日

#1569 in 神奇豆

42 每月下载量

BSD-3-Clause

67KB
1.5K SLoC

crates.io docs.rs Github Actions

timestampvm-rs

timestampvm-rs 是一个虚拟机,可以从用户提供的任意数据构建区块。它是使用 Avalanche Rust SDK 实现的 Avalanche 自定义虚拟机 (VM) 的最小化实现。

目前,Avalanche 自定义 VM 需要以下条件

  1. 编译为 avalanchego 可以作为子进程启动的二进制文件。
  2. 插件二进制文件路径为 32 字节哈希。
  3. 实现了 snowman.block.ChainVM 接口,可以通过 rpcchainvm.Serve 进行注册。
  4. 实现了可以通过区块链 ID 的 URL 路径提供的服务。
  5. (可选) 实现了可以通过 VM ID 的 URL 路径提供的服务。

例如,可以这样运行时间戳 VM:

use avalanche_types::subnet;
use timestampvm::vm;
use tokio::sync::broadcast::{self, Receiver, Sender};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let (stop_ch_tx, stop_ch_rx): (Sender<()>, Receiver<()>) = broadcast::channel(1);
    let vm_server = subnet::rpc::vm::server::Server::new(vm::Vm::new(), stop_ch_tx);
    subnet::rpc::plugin::serve(vm_server, stop_ch_rx).await
}

有关插件实现,请参阅 bin/timestampvm,有关全面端到端测试,请参阅 tests/e2e

依赖项

  • 稳定 Rust 的最新版本。
  • 要构建和测试 timestampvm,您需要版本 >= 3.15.0 的 protoc

AvalancheGo 兼容性

版本 AvalancheGo 版本
版本 0.0.6 版本 1.9.2, 版本 1.9.3
版本 0.0.7 版本 1.9.4
版本 0.0.8, 版本 0.0.9 版本 1.9.7
版本 0.0.10 版本 1.9.8, 版本 1.9.9
版本 0.0.11, 版本 0.0.12 版本 1.9.10 - 版本 1.9.16
版本 0.0.13 版本 1.10.0
版本 0.0.14..版本 0.0.17 版本 1.10.1
版本 0.0.18 版本 1.10.9+

示例

# build the timestampvm plugin, run e2e tests, and keep the network running
./scripts/build.release.sh \
&& VM_PLUGIN_PATH=$(pwd)/target/release/timestampvm \
./scripts/tests.e2e.sh

# or, specify the custom avalanchego binary
./scripts/build.release.sh \
&& VM_PLUGIN_PATH=$(pwd)/target/release/timestampvm \
./scripts/tests.e2e.sh ~/go/src/github.com/ava-labs/avalanchego/build/avalanchego

# (optional) set NETWORK_RUNNER_ENABLE_SHUTDOWN=1 in "tests.e2e.sh"
# to shut down the network afterwards

要测试 timestampvm API,请尝试以下命令

# "tGas3T58KzdjcJ2iKSyiYsWiqYctRXaPTqBCA11BqEkNg8kPc" is the Vm Id
# e.g., timestampvm vm-id timestampvm
curl -X POST --data '{
    "jsonrpc": "2.0",
    "id"     : 1,
    "method" : "timestampvm.ping",
    "params" : []
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/vm/tGas3T58KzdjcJ2iKSyiYsWiqYctRXaPTqBCA11BqEkNg8kPc/static

# {"jsonrpc":"2.0","result":{"success":true},"id":1}
# "2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7" is the blockchain Id
curl -X POST --data '{
    "jsonrpc": "2.0",
    "id"     : 1,
    "method" : "timestampvm.ping",
    "params" : []
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7/rpc

# {"jsonrpc":"2.0","result":{"success":true},"id":1}
# to get genesis block
# "2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7" is the blockchain Id
curl -X POST --data '{
    "jsonrpc": "2.0",
    "id"     : 1,
    "method" : "timestampvm.lastAccepted",
    "params" : []
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7/rpc

# {"jsonrpc":"2.0","result":{"id":"SDfFUzkdzWZbJ6YMysPPNEF5dWLp9q35mEMaLa8Ha2w9aMKoC"},"id":1}

# "2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7" is the blockchain Id
curl -X POST --data '{
    "jsonrpc": "2.0",
    "id"     : 1,
    "method" : "timestampvm.getBlock",
    "params" : [{"id":"SDfFUzkdzWZbJ6YMysPPNEF5dWLp9q35mEMaLa8Ha2w9aMKoC"}]
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7/rpc

# {"jsonrpc":"2.0","result":{"block":{"data":"0x32596655705939524358","height":0,"parent_id":"11111111111111111111111111111111LpoYY","timestamp":0}},"id":1}
# to propose data
echo 1 | base64 | tr -d \\n
# MQo=

curl -X POST --data '{
    "jsonrpc": "2.0",
    "id"     : 1,
    "method" : "timestampvm.proposeBlock",
    "params" : [{"data":"MQo="}]
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/2wb1UXxAstB8ywwv4rU2rFCjLgXnhT44hbLPbwpQoGvFb2wRR7/rpc

# {"jsonrpc":"2.0","result":{"success":true},"id":1}

依赖项

~41–58MB
~1M SLoC