Rust分布式应用开发框架Holochain CLI的使用,Holochain CLI助力构建去中心化P2P应用

Rust分布式应用开发框架Holochain CLI的使用,Holochain CLI助力构建去中心化P2P应用

Holochain CLI简介

Holochain CLI提供了hc二进制工具,用于开发、检查、执行和测试Holochain应用。主要功能包括:

  • hc dnahc apphc web-app:分别用于创建、打包和解包DNA、hApps和web hApps
  • hc sandbox:创建和执行临时或持久的conductor配置,用于运行测试实例
  • hc run-local-services:运行本地bootstrap和WebRTC信号服务器
  • hc scaffold:通过交互式提示生成hApp的完整性、协调器、UI和测试代码
  • hc launch:运行带有实时重载UI窗口的沙盒化hApp实例

安装方式

快速安装

按照Holochain开发者门户的快速入门指南安装所有开发工具,包括hcCLI和官方扩展。

从源码构建

要求:

  • Rust
  • 系统PATH中包含Holochain二进制文件

构建命令:

从GitHub安装:

cargo install holochain_cli --git https://github.com/holochain/holochain

从holochain仓库安装:

cargo install --path crates/hc

完整示例demo

创建一个简单的Holochain应用:

  1. 首先安装holochain_cli:
cargo install holochain_cli
  1. 创建一个新项目:
hc scaffold my_first_app
  1. 进入项目目录:
cd my_first_app
  1. 构建DNA:
hc dna pack workdir/dna
  1. 运行测试沙盒环境:
hc sandbox generate workdir/dna --output=./sandbox
hc sandbox run --network=memory --bootstrap=null ./sandbox
  1. 开发UI界面(可选):
hc web-app pack workdir/web-app --output=./dist
  1. 启动完整应用:
hc launch --dna=./workdir/dna --ui=./dist

这个示例展示了使用Holochain CLI创建、构建和运行一个基本去中心化应用的完整流程。


1 回复

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);
}

调试技巧

  1. 查看日志:
hc admin --lair-connection-url ws://localhost:port interface
  1. 使用Rust调试工具:
RUST_LOG=debug hc run
  1. 检查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

这个完整示例展示了如何创建一个简单的博客应用,包括:

  1. Rust后端定义数据结构和业务逻辑
  2. React前端与Holochain集成
  3. 完整的测试用例
  4. 前后端联调运行

Holochain CLI为开发者提供了一个强大的工具集,用于构建和测试分布式应用程序。通过结合Rust的性能和安全性,以及Holochain的分布式架构,开发者可以创建真正去中心化的P2P应用。

回到顶部