Rust分布式应用开发库holochain_conductor_api的使用,构建去中心化P2P应用的Rust插件库
holochain_conductor_api
以下是基于提供内容的完整示例代码,展示了如何使用holochain_conductor_api库进行基本操作:
已提供的示例代码
use holochain_conductor_api::{AdminRequest, AdminResponse, InterfaceDriver};
use std::convert::TryFrom;
// 创建一个简单的Holochain应用示例
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 创建接口驱动
let mut driver = InterfaceDriver::try_from(("127.0.0.1", 1234))?;
// 生成一个新的管理员请求
let request = AdminRequest::GenerateAgentPubKey;
// 发送请求并等待响应
let response: AdminResponse = driver.request(request).await?;
// 处理响应
match response {
AdminResponse::AgentPubKeyGenerated(pub_key) => {
println!("生成的代理公钥: {}", pub_key);
}
_ => println!("收到其他类型的响应"),
}
Ok(())
}
// 另一个示例: 安装应用
async fn install_app(driver: &mut InterfaceDriver) -> anyhow::Result<()> {
let app_id = "my_app".to_string();
let bundle_path = "./path/to/happ/bundle.happ".to_string();
let request = AdminRequest::InstallApp {
app_id,
bundle_path,
installed_app_id: None,
network_seed: None,
membrane_proofs: None,
};
let response: AdminResponse = driver.request(request).await?;
match response {
AdminResponse::AppInstalled { app_id } => {
println!("成功安装应用: {}", app_id);
Ok(())
}
AdminResponse::Error(error) => {
Err(anyhow::anyhow!("安装失败: {}", error))
}
_ => Err(anyhow::anyhow!("意外的响应类型")),
}
}
完整示例demo
use holochain_conductor_api::{AdminRequest, AdminResponse, InterfaceDriver};
use std::convert::TryFrom;
use anyhow::Context;
// 完整的Holochain应用示例
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. 初始化接口驱动连接到本地Holochain导体
// 注意: 确保Holochain导体正在运行并监听指定端口
let mut driver = InterfaceDriver::try_from(("127.0.0.1", 1234))
.context("无法连接到Holochain导体")?;
// 2. 生成代理公钥
let agent_pub_key = generate_agent_pub_key(&mut driver).await?;
println!("成功生成代理公钥: {}", agent_pub_key);
// 3. 安装应用程序
install_app(&mut driver, "demo_app", "./demo.happ").await?;
// 4. 激活应用
activate_app(&mut driver, "demo_app").await?;
Ok(())
}
// 生成代理公钥
async fn generate_agent_pub_key(driver: &mut InterfaceDriver) -> anyhow::Result<String> {
let request = AdminRequest::GenerateAgentPubKey;
let response: AdminResponse = driver.request(request).await?;
match response {
AdminResponse::AgentPubKeyGenerated(pub_key) => Ok(pub_key),
AdminResponse::Error(error) => Err(anyhow::anyhow!("生成公钥失败: {}", error)),
_ => Err(anyhow::anyhow!("收到意外的响应类型")),
}
}
// 安装应用
async fn install_app(
driver: &mut InterfaceDriver,
app_id: &str,
bundle_path: &str,
) -> anyhow::Result<()> {
let request = AdminRequest::InstallApp {
app_id: app_id.to_string(),
bundle_path: bundle_path.to_string(),
installed_app_id: None,
network_seed: None,
membrane_proofs: None,
};
let response: AdminResponse = driver.request(request).await?;
match response {
AdminResponse::AppInstalled { app_id } => {
println!("成功安装应用: {}", app_id);
Ok(())
}
AdminResponse::Error(error) => {
Err(anyhow::anyhow!("安装失败: {}", error))
}
_ => Err(anyhow::anyhow!("意外的响应类型")),
}
}
// 激活应用
async fn activate_app(driver: &mut InterfaceDriver, app_id: &str) -> anyhow::Result<()> {
let request = AdminRequest::EnableApp {
installed_app_id: app_id.to_string(),
};
let response: AdminResponse = driver.request(request).await?;
match response {
AdminResponse::AppEnabled { app_id } => {
println!("成功激活应用: {}", app_id);
Ok(())
}
AdminResponse::Error(error) => {
Err(anyhow::anyhow!("激活失败: {}", error))
}
_ => Err(anyhow::anyhow!("意外的响应类型")),
}
}
这个完整示例展示了使用holochain_conductor_api的主要功能:
- 初始化连接Holochain导体
- 生成代理公钥
- 安装Happ包
- 激活应用
使用前请确保:
- Holochain导体已运行并配置了正确的接口端口
- 有可用的.happ应用包文件
- 项目中已添加holochain_conductor_api依赖
这个API主要用于构建去中心化P2P应用,与Holochain导体进行管理交互。
1 回复
Holochain Conductor API: Rust分布式应用开发库指南
介绍
Holochain Conductor API是一个用于构建去中心化P2P应用的Rust插件库,它提供了与Holochain Conductor交互的接口。Holochain是一个用于构建完全分布式应用程序的框架,而Conductor是运行Holochain应用程序(DNA)的运行时环境。
这个库允许开发者:
- 以编程方式管理Holochain Conductor实例
- 安装、激活和管理DNA(分布式应用程序)
- 与运行的DNA实例进行交互
- 构建去中心化的P2P应用程序
安装方法
在Cargo.toml中添加依赖:
[dependencies]
holochain_conductor_api = "0.0.17"
tokio = { version = "1.0", features = ["full"] }
基本使用方法
1. 创建Conductor配置
use holochain_conductor_api::conductor::ConductorConfig;
async fn create_conductor_config() -> ConductorConfig {
ConductorConfig::default()
}
2. 启动Conductor
use holochain_conductor_api::ConductorHandle;
async fn start_conductor(config: ConductorConfig) -> anyhow::Result<ConductorHandle> {
let conductor = ConductorHandle::new(config).await?;
Ok(conductor)
}
3. 安装DNA
use holochain_conductor_api::InstallAppDnaPayload;
async fn install_dna(
conductor: &ConductorHandle,
dna_path: &str,
app_id: &str,
) -> anyhow::Result<()> {
let payload = InstallAppDnaPayload {
path: dna_path.into(),
installed_app_id: Some(app_id.into()),
..Default::default()
};
conductor.install_app_dna(payload).await?;
Ok(())
}
4. 激活DNA实例
use holochain_conductor_api::EnableAppPayload;
async fn activate_app(
conductor: &ConductorHandle,
app_id: &str,
) -> anyhow::Result<()> {
let payload = EnableAppPayload {
installed_app_id: app_id.into(),
};
conductor.enable_app(payload).await?;
Ok(())
}
高级用法示例
调用DNA的Zome函数
use holochain_conductor_api::{
call_zome::CallZomePayload,
AppRequest, AppResponse,
};
async fn call_zome_function(
conductor: &ConductorHandle,
app_id: &str,
zome_name: &str,
fn_name: &str,
payload: serde_json::Value,
) -> anyhow::Result<AppResponse> {
let call = CallZomePayload {
cell_id: None,
zome_name: zome_name.into(),
fn_name: fn_name.into(),
payload,
provenance: None,
cap_secret: None,
};
let request = AppRequest::CallZome(Box::new(call));
let response = conductor.app_interface(app_id, request).await?;
Ok(response)
}
完整示例: 创建并运行一个简单的Holochain应用
use holochain_conductor_api::{
conductor::ConductorConfig,
ConductorHandle,
InstallAppDnaPayload,
EnableAppPayload,
AppRequest, AppResponse,
call_zome::CallZomePayload,
};
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. 创建配置
let config = ConductorConfig::default();
// 2. 启动Conductor
let conductor = ConductorHandle::new(config).await?;
// 3. 安装DNA (假设有一个本地DNA文件)
let dna_path = "./path/to/your/dna.happ";
let app_id = "my_app";
let install_payload = InstallAppDnaPayload {
path: dna_path.into(),
installed_app_id: Some(app_id.into()),
..Default::default()
};
conductor.install_app_dna(install_payload).await?;
// 4. 激活应用
let enable_payload = EnableAppPayload {
installed_app_id: app_id.into(),
};
conductor.enable_app(enable_payload).await?;
// 5. 调用Zome函数
let call_payload = CallZomePayload {
cell_id: None,
zome_name: "some_zome".into(),
fn_name: "some_function".into(),
payload: json!({"key": "value"}),
provenance: None,
cap_secret: None,
};
let request = AppRequest::CallZome(Box::new(call_payload));
let response = conductor.app_interface(app_id, request).await?;
println!("Zome function response: {:?}", response);
Ok(())
}
完整示例demo
下面是一个更完整的示例,展示了如何创建一个简单的社交应用:
use holochain_conductor_api::{
conductor::ConductorConfig,
ConductorHandle,
InstallAppDnaPayload,
EnableAppPayload,
AppRequest, AppResponse,
call_zome::CallZomePayload,
};
use serde_json::json;
use std::path::PathBuf;
use tokio::fs;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. 初始化配置
let mut config = ConductorConfig::default();
config.environment_path = Some(PathBuf::from("./holochain_environment"));
// 2. 启动Conductor
println!("启动Holochain Conductor...");
let conductor = ConductorHandle::new(config).await?;
// 3. 安装DNA
println!("安装DNA...");
let dna_path = "./social_app.happ"; // 假设有这个文件
let app_id = "social_network";
// 检查DNA文件是否存在
if !PathBuf::from(dna_path).exists() {
return Err(anyhow::anyhow!("DNA文件不存在: {}", dna_path));
}
let install_payload = InstallAppDnaPayload {
path: dna_path.into(),
installed_app_id: Some(app_id.into()),
..Default::default()
};
conductor.install_app_dna(install_payload).await?;
// 4. 激活应用
println!("激活应用...");
let enable_payload = EnableAppPayload {
installed_app_id: app_id.into(),
};
conductor.enable_app(enable_payload).await?;
// 5. 创建用户档案
println!("创建用户档案...");
let profile_data = json!({
"username": "rust_dev",
"name": "Rust开发者",
"bio": "专注于去中心化应用开发"
});
let call_payload = CallZomePayload {
cell_id: None,
zome_name: "profiles".into(),
fn_name: "create_profile".into(),
payload: profile_data,
provenance: None,
cap_secret: None,
};
let request = AppRequest::CallZome(Box::new(call_payload));
let response = conductor.app_interface(app_id, request).await?;
println!("创建档案响应: {:?}", response);
// 6. 获取用户档案
println!("获取用户档案...");
let get_payload = CallZomePayload {
cell_id: None,
zome_name: "profiles".into(),
fn_name: "get_my_profile".into(),
payload: json!(null),
provenance: None,
cap_secret: None,
};
let request = AppRequest::CallZome(Box::new(get_payload));
let response = conductor.app_interface(app_id, request).await?;
println!("我的档案: {:?}", response);
Ok(())
}
注意事项
- Holochain生态系统仍在快速发展中,API可能会有较大变化
- 需要先安装Holochain运行时环境
- 分布式应用开发需要考虑网络拓扑和同步策略
- 错误处理非常重要,因为P2P环境中的失败是常态而非例外
通过holochain_conductor_api,Rust开发者可以构建完全去中心化的应用程序,这些应用程序不依赖于中心服务器,而是直接在用户设备之间运行和同步数据。