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 每月下载量
67KB
1.5K SLoC
timestampvm-rs
timestampvm-rs
是一个虚拟机,可以从用户提供的任意数据构建区块。它是使用 Avalanche Rust SDK 实现的 Avalanche 自定义虚拟机 (VM) 的最小化实现。
目前,Avalanche 自定义 VM 需要以下条件
- 编译为
avalanchego
可以作为子进程启动的二进制文件。 - 插件二进制文件路径为 32 字节哈希。
- 实现了
snowman.block.ChainVM
接口,可以通过rpcchainvm.Serve
进行注册。 - 实现了可以通过区块链 ID 的 URL 路径提供的服务。
- (可选) 实现了可以通过 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