Rust分布式应用开发框架Holochain CLI的使用,Holochain CLI助力构建去中心化P2P应用
Rust分布式应用开发框架Holochain CLI的使用,Holochain CLI助力构建去中心化P2P应用
Holochain CLI简介
Holochain CLI提供了hc
二进制工具,用于开发、检查、执行和测试Holochain应用。主要功能包括:
hc dna
、hc app
和hc web-app
:分别用于创建、打包和解包DNA、hApps和web hAppshc sandbox
:创建和执行临时或持久的conductor配置,用于运行测试实例hc run-local-services
:运行本地bootstrap和WebRTC信号服务器hc scaffold
:通过交互式提示生成hApp的完整性、协调器、UI和测试代码hc launch
:运行带有实时重载UI窗口的沙盒化hApp实例
安装方式
快速安装
按照Holochain开发者门户的快速入门指南安装所有开发工具,包括hc
CLI和官方扩展。
从源码构建
要求:
- Rust
- 系统PATH中包含Holochain二进制文件
构建命令:
从GitHub安装:
cargo install holochain_cli --git https://github.com/holochain/holochain
从holochain仓库安装:
cargo install --path crates/hc
完整示例demo
创建一个简单的Holochain应用:
- 首先安装holochain_cli:
cargo install holochain_cli
- 创建一个新项目:
hc scaffold my_first_app
- 进入项目目录:
cd my_first_app
- 构建DNA:
hc dna pack workdir/dna
- 运行测试沙盒环境:
hc sandbox generate workdir/dna --output=./sandbox
hc sandbox run --network=memory --bootstrap=null ./sandbox
- 开发UI界面(可选):
hc web-app pack workdir/web-app --output=./dist
- 启动完整应用:
hc launch --dna=./workdir/dna --ui=./dist
这个示例展示了使用Holochain CLI创建、构建和运行一个基本去中心化应用的完整流程。
Holochain CLI:构建去中心化P2P应用的Rust开发框架
Holochain简介
Holochain是一个用于构建完全分布式、点对点应用程序的框架,使用Rust编写。它不同于传统的区块链技术,采用了一种称为"代理中心架构"的模型,每个用户运行自己的节点,只存储和处理与自己相关的数据。
Holochain CLI安装
首先需要安装Holochain CLI工具:
# 使用npm安装
npm install -g @holochain/holochain-cli
# 或者使用cargo安装(需要Rust环境)
cargo install hc-cli
安装完成后验证版本:
hc --version
基本使用方法
1. 创建新项目
hc init my_holochain_app
cd my_holochain_app
这会创建一个包含基本目录结构的新项目:
dna/
- DNA定义文件tests/
- 测试代码ui/
- 用户界面代码
2. 构建DNA
hc package
这将编译您的DNA定义并生成.dna
文件。
3. 运行测试
hc test
4. 启动本地开发环境
hc run
这会启动一个本地Holochain容器,加载您的DNA,并提供一个开发用的Web界面。
示例:创建一个简单的分布式应用
1. 定义DNA
在dna/zomes/hello/code/src/lib.rs
中添加:
#[hdk_extern]
pub fn hello_holo(_: ()) -> ExternResult<String> {
Ok("Hello Holochain!".to_string())
}
2. 定义zome接口
在dna/zomes/hello/code/src/lib.rs
中添加:
#[hdk_extern]
pub fn hello_holo(_: ()) -> ExternResult<String> {
Ok("Hello Holochain!".to_string())
}
3. 更新测试
在tests/src/test.rs
中添加测试:
#[tokio::test]
async fn hello_holo() {
let result: String = call_zome!("hello", "hello_holo", ()).await;
assert_eq!(result, "Hello Holochain!");
}
4. 构建并运行
hc package
hc run
高级功能
1. 创建自定义网络
hc generate https://github.com/holochain/holochain
cd holochain
nix-shell
hc net create mynetwork
2. 添加节点到网络
hc net add mynetwork
3. 部署DNA到网络
hc net install mynetwork path/to/your.dna
4. 与UI集成
Holochain CLI可以与各种前端框架集成。例如,使用React:
npx create-react-app ui
cd ui
npm install @holochain/client
然后在React组件中调用zome函数:
import { AppWebsocket } from '@holochain/client';
async function callHelloHolo() {
const appWs = await AppWebsocket.connect(`ws://localhost:${process.env.REACT_APP_HC_PORT}`);
const result = await appWs.callZome({
cap: null,
cell_id: yourCellId,
zome_name: 'hello',
fn_name: 'hello_holo',
payload: null,
provenance: yourAgentPubKey
});
console.log(result);
}
调试技巧
- 查看日志:
hc admin --lair-connection-url ws://localhost:port interface
- 使用Rust调试工具:
RUST_LOG=debug hc run
- 检查DNA完整性:
hc dna inspect your_app.dna
完整示例demo
下面是一个完整的Holochain应用示例,包含前后端集成:
1. 创建项目结构
hc init full_demo_app
cd full_demo_app
2. 定义DNA(dna/zomes/demo/code/src/lib.rs)
use hdk::prelude::*;
// 定义一个简单的创建和查询帖子功能
#[hdk_entry_helper]
#[derive(Clone)]
pub struct BlogPost {
pub title: String,
pub content: String,
}
#[hdk_extern]
pub fn create_post(post: BlogPost) -> ExternResult<HeaderHash> {
create_entry(&post)?;
Ok(header_hash)
}
#[hdk_extern]
pub fn get_post(header_hash: HeaderHash) -> ExternResult<Option<BlogPost>> {
get(header_hash, GetOptions::default())?
.and_then(|element| element.entry().to_app_option().transpose())
.transpose()
}
3. 前端React组件(ui/src/App.js)
import React, { useState } from 'react';
import { AppWebsocket } from '@holochain/client';
function App() {
const [title, setTitle] = useState('');
const [content, setContent] = useState('');
const [posts, setPosts] = useState([]);
async function handleSubmit() {
const appWs = await AppWebsocket.connect(`ws://localhost:${process.env.REACT_APP_HC_PORT}`);
const result = await appWs.callZome({
cap: null,
cell_id: yourCellId,
zome_name: 'demo',
fn_name: 'create_post',
payload: { title, content },
provenance: yourAgentPubKey
});
console.log('Post created:', result);
}
return (
<div>
<input value={title} onChange={e => setTitle(e.target.value)} placeholder="Title" />
<textarea value={content} onChange={e => setContent(e.target.value)} placeholder="Content" />
<button onClick={handleSubmit}>Create Post</button>
<div>
<h3>Posts</h3>
{/* 这里显示帖子列表 */}
</div>
</div>
);
}
export default App;
4. 测试代码(tests/src/test.rs)
#[tokio::test]
async fn test_blog_post() {
// 测试创建帖子
let post = BlogPost {
title: "Test".to_string(),
content: "Content".to_string(),
};
let header_hash: HeaderHash = call_zome!("demo", "create_post", post).await;
// 测试获取帖子
let retrieved: Option<BlogPost> = call_zome!("demo", "get_post", header_hash).await;
assert!(retrieved.is_some());
assert_eq!(retrieved.unwrap().title, "Test");
}
5. 运行完整应用
# 构建DNA
hc package
# 启动Holochain容器
hc run &
# 启动React前端
cd ui
npm start
这个完整示例展示了如何创建一个简单的博客应用,包括:
- Rust后端定义数据结构和业务逻辑
- React前端与Holochain集成
- 完整的测试用例
- 前后端联调运行
Holochain CLI为开发者提供了一个强大的工具集,用于构建和测试分布式应用程序。通过结合Rust的性能和安全性,以及Holochain的分布式架构,开发者可以创建真正去中心化的P2P应用。