Rust的Holochain CLI沙盒库holochain_cli_sandbox使用指南:分布式应用开发与测试环境搭建
Rust的Holochain CLI沙盒库holochain_cli_sandbox使用指南:分布式应用开发与测试环境搭建
概述
holochain_cli_sandbox是一个用于创建和管理Holochain沙盒环境的Rust库和命令行工具,主要用于分布式应用的开发和测试。
CLI安装
通过Cargo安装
系统要求
- 已安装Rust工具链
- 系统PATH中包含Holochain二进制文件
安装方式
安装独立沙盒工具:
cargo install holochain_cli_sandbox
或安装完整Holochain CLI工具集:
cargo install holochain_cli
基本用法
1. 沙盒生成与管理
生成单个沙盒:
hc sandbox generate
生成多个沙盒并指定端口:
hc sandbox generate --num-sandboxes 3 --run 9000,9001,9002
2. 网络配置
指定QUIC网络协议:
hc sandbox generate network quic
3. 沙盒生命周期管理
列出活动沙盒:
hc sandbox list
清理所有沙盒:
hc sandbox clean
高级用法
1. 持久化沙盒配置
创建持久化沙盒:
hc sandbox create \
--root ./my-sandboxes \
--directories node1,node2,node3 \
--run 9000,9001,9002
2. 应用程序管理
安装hApp到沙盒:
hc sandbox generate ./my-app.happ
库API使用示例
示例1:创建测试环境
// 使用Sandbox构建器创建测试环境
use holochain_cli_sandbox::Sandbox;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 配置沙盒参数
let sandbox = Sandbox::new()
.with_root_dir("test-env")
.with_num_sandboxes(2)
.with_network("quic")
.generate()?;
// 启动沙盒(第一个不指定端口,第二个使用9500)
sandbox.run(vec![0, 9500])?;
// 执行测试...
// 清理环境
sandbox.clean()?;
Ok(())
}
示例2:高级API交互
// 与运行中的沙盒进行交互
use holochain_cli_sandbox::{AdminApi, Sandbox};
use holochain_conductor_api::{AdminRequest, AppInfo};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 创建并启动沙盒
let sandbox = Sandbox::new()
.with_root_dir("api-test")
.generate()?;
sandbox.run(vec![9500])?;
// 连接到管理员接口
let admin = AdminApi::new("http://localhost:9500").await?;
// 获取应用列表
let apps: Vec<AppInfo> = admin.call(AdminRequest::ListApps).await?;
println!("Active apps: {:#?}", apps);
// 停止沙盒
sandbox.clean()?;
Ok(())
}
示例3:多节点测试场景
// 模拟多节点网络环境
use holochain_cli_sandbox::Sandbox;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 创建3节点测试网络
let network = Sandbox::new()
.with_num_sandboxes(3)
.with_directories(vec!["alice", "bob", "carol"])
.with_network("quic")
.generate()?;
// 分配不同端口
network.run(vec![9000, 9001, 9002])?;
// 这里可以添加节点间通信测试代码
// 清理环境
network.clean()?;
Ok(())
}
最佳实践
-
开发建议:
- 为每个测试用例创建独立的沙盒环境
- 使用
--root
参数指定专用目录 - 测试完成后及时清理沙盒
-
调试技巧:
- 使用
hc sandbox list
查看运行状态 - 检查沙盒目录中的日志文件
- 通过Admin API实时监控应用状态
- 使用
注意:请根据实际项目需求调整参数配置,所有示例代码需要合适的错误处理和生产环境加固。
1 回复
Rust的Holochain CLI沙盒库holochain_cli_sandbox使用指南
介绍
holochain_cli_sandbox是一个用于Holochain开发的Rust库,它提供了一个命令行界面(CLI)沙盒环境,用于简化分布式应用的开发和测试流程。Holochain是一个用于构建去中心化应用的框架,而这个沙盒库让开发者能够快速设置本地测试环境,无需配置完整的Holochain网络。
主要特性
- 快速启动本地Holochain测试环境
- 简化的API用于测试Holochain应用(称为"hApps")
- 支持多个并发代理(agent)模拟
- 内置网络仿真功能
- 与现有Holochain工具链无缝集成
安装方法
首先,确保你已经安装了Rust和Cargo。然后添加以下依赖到你的Cargo.toml
文件中:
[dependencies]
holochain_cli_sandbox = "0.1.0" # 请检查最新版本
tokio = { version = "1.0", features = ["full"] } # 需要异步运行时
基本使用方法
1. 创建沙盒环境
use holochain_cli_sandbox as sandbox;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 创建默认配置的沙盒
let sandbox = sandbox::Sandbox::new().await?;
// 或者使用自定义配置
let config = sandbox::SandboxConfig {
network: Some(sandbox::NetworkConfig::default()),
..Default::default()
};
let sandbox = sandbox::Sandbox::with_config(config).await?;
Ok(())
}
2. 安装和运行hApp
let dna_path = "/path/to/your/happ.dna";
let installed_app = sandbox.install_app("my_app", &dna_path).await?;
sandbox.start_apps().await?;
3. 创建代理(Agent)和调用Zome函数
// 创建新代理
let agent = sandbox.create_agent("alice").await?;
// 调用zome函数
let result: serde_json::Value = sandbox
.call_zome(
&agent,
"my_app",
"my_zome",
"my_function",
serde_json::json!({"arg": "value"}),
)
.await?;
println!("Zome call result: {:?}", result);
4. 模拟多个代理交互
let alice = sandbox.create_agent("alice").await?;
let bob = sandbox.create_agent("bob").await?;
// Alice创建一条记录
let create_result: serde_json::Value = sandbox
.call_zome(
&alice,
"my_app",
"posts",
"create_post",
serde_json::json!({"content": "Hello from Alice"}),
)
.await?;
// Bob获取这条记录
let get_result: serde_json::Value = sandbox
.call_zome(
&bob,
"my_app",
"posts",
"get_post",
serde_json::json!({"hash": create_result["hash"]}),
)
.await?;
println!("Bob retrieved: {:?}", get_result);
高级功能
网络仿真
let config = sandbox::SandboxConfig {
network: Some(sandbox::NetworkConfig {
latency: std::time::Duration::from_millis(100),
bandwidth: 1024, // KB/s
..Default::default()
}),
..Default::default()
};
let sandbox = sandbox::Sandbox::with_config(config).await?;
测试并发场景
use futures::future::join_all;
let agents = vec![
sandbox.create_agent("agent1").await?,
sandbox.create_agent("agent2").await?,
sandbox.create_agent("agent3").await?,
];
let calls = agents.iter().map(|agent| {
sandbox.call_zome(
agent,
"my_app",
"my_zome",
"concurrent_function",
serde_json::json!({"id": agent.id()}),
)
});
let results = join_all(calls).await;
清理资源
// 关闭沙盒环境
sandbox.shutdown().await?;
实际应用示例
以下是一个完整的测试示例,模拟一个简单的博客应用:
use holochain_cli_sandbox as sandbox;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. 初始化沙盒
let sandbox = sandbox::Sandbox::new().await?;
// 2. 安装博客应用
let installed_app = sandbox
.install_app("blog_app", "./path/to/blog_app.dna")
.await?;
sandbox.start_apps().await?;
// 3. 创建两个用户
let alice = sandbox.create_agent("alice").await?;
let bob = sandbox.create_agent("bob").await?;
// 4. Alice创建一篇博客
let post_content = "My first blog post about Rust and Holochain!";
let create_result: serde_json::Value = sandbox
.call_zome(
&alice,
"blog_app",
"blog",
"create_post",
serde_json::json!({"content": post_content}),
)
.await?;
let post_hash = &create_result["hash"];
println!("Alice created post with hash: {}", post_hash);
// 极客时间
// 5. Bob获取并评论这篇博客
let comment_content = "Great post about Holochain!";
let _comment_result = sandbox
.call_zome(
&bob,
"blog_app",
"blog",
"create_comment",
serde_json::json!({
"post_hash": post_hash,
"content": comment_content
}),
)
.await?;
// 6. 验证博客和评论
let get_result: serde_json::Value = sandbox
.call_zome(
&alice,
"blog_app",
"blog",
极客时间
"get_post_with_comments",
serde_json::json!({"post_hash": post_hash}),
)
.await?;
println!("Full post with comments: {:#?}", get_result);
// 7. 清理
sandbox.shutdown().await?;
Ok(())
}
完整示例demo
下面是一个完整的社交网络应用测试示例,展示如何使用holochain_cli_sandbox测试用户之间的社交互动:
use holochain_cli_sandbox as sandbox;
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. 初始化沙盒环境
let config = sandbox::SandboxConfig {
network: Some(sandbox::NetworkConfig {
latency: std::time::Duration::from_millis(50),
bandwidth: 2048,
..Default::default()
}),
..Default::default()
};
let sandbox = sandbox::Sandbox::with_config(config).await?;
// 2. 安装社交应用
let installed_app = sandbox
.install_app("social_app", "./path/to/social_app.dna")
.await?;
sandbox.start_apps().await?;
// 3. 创建三个用户
let alice = sandbox.create_agent("alice").await?;
let bob = sandbox.create_agent("bob").await?;
let charlie = sandbox.create_agent("charlie").await?;
// 4. Alice发布帖子
let post_content = "Check out my new Holochain project!";
let post_result: serde_json::Value = sandbox
.call_zome(
&alice,
"social_app",
"posts",
"create_post",
json!({"content": post_content}),
)
.await?;
let post_hash = &post_result["hash"];
println!("Alice created post with hash: {}", post_hash);
// 5. Bob和Charlie关注Alice
let _follow_result1 = sandbox
.call_zome(
&bob,
"social_app",
"profiles",
"follow",
json!({"agent": alice.id()}),
)
.await?;
let _follow_result2 = sandbox
.call_zome(
&charlie,
"social_app",
"profiles",
"follow",
json!({"agent": alice.id()}),
)
.await?;
// 6. Bob评论Alice的帖子
let comment_result: serde_json::Value = sandbox
.call_zome(
&bob,
"social_app",
"posts",
"create_comment",
json!({
"post_hash": post_hash,
"content": "Looking great Alice!"
}),
)
.await?;
let comment_hash = &comment_result["hash"];
// 7. Charlie点赞评论
let _like_result = sandbox
.call_zome(
&charlie,
"social_app",
"posts",
"like_comment",
json!({"comment_hash": comment_hash}),
)
.await?;
// 8. 验证社交互动
let interactions: serde_json::Value = sandbox
.call_zome(
&alice,
"social_app",
"posts",
"get_post_interactions",
json!({"post_hash": post_hash}),
)
.await?;
println!("Post interactions: {:#?}", interactions);
// 9. 清理资源
sandbox.shutdown().await?;
Ok(())
}
总结
holochain_cli_sandbox为Holochain应用开发提供了强大的测试工具,使得开发者能够:
- 快速搭建本地测试环境
- 模拟多个用户交互
- 测试分布式应用逻辑
- 验证数据一致性
- 模拟网络条件
通过这个库,你可以更高效地开发和测试你的Holochain应用,而无需担心复杂的网络配置和基础设施设置。