教程 | 如何使用Rust在Internet Computer上开发一个Hello World项目

D Plus Community

    在IC链上开发虽然Motoko可能是最拥有优势的编程语言之一,但是在开发者层面来说Motoko作为新兴编程语言对他们来说是陌生的,这时候大部分的开发者在IC链上开发时都会选择自己熟悉的编程语言进行构建Dapp,而不管是Motoko、Rust、C、JavaScript等编写的Dapps,最后都会被编译为WebAssembly部署在Internet Computer运行。最重要的是即使Dapp的组件是由不同语言编写的,也可以通过Candid无缝集成,这也是IC链上开发的魅力所在。本期文章带各位小伙伴探讨如何使用不同的语言编写Dapp以及如何在Internet Computer上部署Dapp。
    
    使用Rust在Internet Computer上开发
    开发人员可以通过使用Cargo并编译Dapp以使用WebAssembly作为目标输出来创建Rust项目在Internet Computer上运行。
    本字节概述将Rust程序部署为Internet Computer上的Canister所涉及的关键步骤,需要注意的是此处描述的步骤只是一种实现方法,也可通过其他方法实现。以下操作流程的示例项目是以下存储库中示例项目的其中之一。
    注意:Rust CDK可以提供了一些快捷方式实现更轻松的编写查询和更新调用的函数(也可通过其他方法实现)。
    
    最低到最高级别的Rust CDK程序库
    
  • Rust CDK程序库: https://github.com/dfinity/cdk-rs
  • 使用Rust CDK快捷方式编写查询更新调用示例项目: https://github.com/dfinity/cdk-rs/tree/main/examples

    01 创建项目
    由于大多数开发者都是使用Cargo来处理build和packagse management task:下载和编译Dapp所依赖的程序库,以下是使用Cargo命令行界面创建的一个新的Rust项目示例。(或者可以通过DFINITY Canister SDK创建一个新项目)但使用Cargo创建一个项目代表创建Rust项目的典型工作流程如下:
    1、在本地打开一个终端窗口。
    2、运行以下命令验证是否安装Cargo:
    由于大多数开发者都是使用Cargo来处理build和packagse management task:下载和编译Dapp所依赖的程序库,以下是使用Cargo命令行界面创建的一个新的Rust项目示例。(或者可以通过DFINITY Canister SDK创建一个新项目)但使用Cargo创建一个项目代表创建Rust项目的典型工作流程如下:
    1、在本地打开一个终端窗口。
    2、运行以下命令验证是否安装Cargo:
    
  • cargo --version

    3、更改为用于Internet Computer或Rust示例项目的文件夹名。
    4、运行以下命令来创建一个新项目:
    
  • cargo new myrustdapp

    此命令创建一个my_rust_dapp带有默认Crago.toml文件的新目录和一个带有 src 目录的main.rs的默认文件。 5、运行以下命令切换到项目目录:
    
  • cd myrustdapp

    如果你列出项目目录内容,将会看到它只包含 Crago.toml 文件和 src目录,要编译此项目在Internet Computer上运行需要一些附加文件。
    02 修改Crago配置文件
    该Crago.toml文件为每个Rust程序包提供一个清单,清单包含指定Rust程序包配置详细信息,为了准备Rust项目在Internet Computer上运行,我们需要复制默认Crago.toml文件,然后修改项目的一些配置细节。修改Grago.toml文件:
    1、运行pwd命令检查是否位于项目的根目录文件。
    2、运行以下命令将默认Crago.toml文件复制到src目录中:
    
  • cp Cargo.toml src/Cargo.toml

    在Internet Computer上运行的项目通常使用一个项目级Crago.toml文件来为项目Canister成员设置工作区,并使用Crago.toml源代码目录中的第二个文件来配置每个Canister的设置。
    3、在文本编辑器中打开Crago.toml作为项目根目录文件。默认情况下该文件包含[package]和[dependencies]分区。
    4、将该[package]分区替换为[workspace]类似于以下内容的分区:
    [workspace]
    members = [
    
"src/my\_rust\_dapp",

    ]
    
  • 有关[workspace]分区和[workspace]键值的信息参考如下: /uploads/202208/04/workspaces1106.html
  • 有关于Crago.toml文件中配置的其它分区和键值的信息如下: /uploads/202208/04/manifest1106.html

    5、删除[dependencies]分区。
    6、保存更改并关闭文件继续以下流程。
    7、在文本编辑器中打开src/Cargo.toml文件。
    8、添加一个包含主源代码路径的[lib]分区,类似于以下内容:
    [lib]
    path = "main.rs"
    9、使用任何程序包依赖项更新[dependencies]分区。
    10、保存更改文件继续以下操作。
    03 添加Canister配置文件
    当你使用DFINITY Canister SDK创建新项目时,dfx new 命令会自动将默认dfx.json配置文件添加到项目目录中,因为以上示例是使用Cargo创建的Rust项目,所以需要在项目目录中手动去创建这个文件。添加dfx.json配置文件流程如下:
    1、运行 pwd 命令检查是否在项目目录中。
    2、在项目根目录中创建一个新的 dfx.json 配置文件。
    3、在文本编辑器中打开 dfx.json 文件。
    4、将具有类似以下设置的 version 和canisters 键值添加到 dfx.json 文件中:
    { "version": 1, "canisters": {
    
"my\_rust\_dapp": { 
     "type": "custom",
     "candid": "src/my\_rust\_dapp.did",
     "wasm": "target/wasm32-unknown-unknown/debug/my\_rust\_dapp.wasm",
     "build": "cargo build --target wasm32-unknown-unknown --package my\_rust\_dapp"
    }

    } }
    以上设置解释:
    
  • version 设置用于标识创建项目的软件版本;
  • canisters 分区指定项目Canister的名称,在以上情况下只有一个Canister,名为 my_rust_dapp;
  • type 键值设置为custom,因为该Canister不是当前识别的(一个Motoko或assets)Canister types之一;
  • Candid 键值指定名称和Candid的接口描述文件的位置用于此项目;
  • Wasm 键值指定由 crago build 命令生成WebAssembly文件路径;
  • build 键值指定crago命令用于编译的输出;

    这些是所需的最低设置,当需要构建更复杂的程序时,需要在Cargo.toml、dfx.json这两个文件中包含其它配置信息。
    5、保存更改关闭文件继续以下操作。
    04 创建Candid接口描述文件
    除了 dfx.json 配置文件之外,还需要一个Candid接口描述文件— 例如:my_rust_dapp-did —将Dapp的输入参数和返回值格式映射到它们在Candid中与语言无关的表示。创建Candid接口描述文件流程如下:
    1、运行pwd检查是否仍在项目目录中。
    2、在src项目目录中,创建一个新的Candid接口描述文件,例如 my_rust_dapp_did。
    3、在文本编辑器中打开Candid文件,为Dapp定义每个功能添加描述,如果 my_rust_dapp 是一个简单的增量计数器Dapp使用 increment、read 和write 功能,该 my_rust_dapp.did 文件是以下这样的:
    service : {
    "increment": () -> ();
    "read": () -> (nat) query;
    "write": (nat) -> ();
    }
    4、保存更改并改变文件继续以下流程。
    05 修改默认Dapp
    创建新项目时,项目的 src目录中会包含一个模版 main.re 文件,其中包含 “Hello World!”程序。修改模版源代码流程如下:
    1、在文本编辑器中打开 src/main.rs 模版文件并删除现有内容。
    2、编写要在Internet Computer上部署的程序,编写程序时,请注意有两种类型的调用—查询调用和更新调用—并且更新函数使用异步消息传递。
    3、保存更改并关闭 src/main.rs 文件操作以下流程。
    06 部署Dapp
    在部署和测试Dapp之前,需要执行以下操作:
    
  • 连接本地Canister执行环境或Internet Computer主网;
  • 为Dapp注册特定于网络的标识符;
  • 使用WebAssembly的目标输出编译Dapp;

    由于以上示例使用可编译为WebAssembly的Cargo build 命令配置了自定义dfx.json 文件,因此可以使用dfx命令行界面和标准工作流程来完成所有剩余步骤。在本地构建和部署Dapp流程如下:
    1、运行 pwd 检查是否在项目目录中。
    2、在本地计算机打开新的终端窗口或Tab,然后导航到项目目录中。如果是在macOS上运行终端,可以执行以下任一操作:
    
  • 单击shell,然后在New Tab在当前工作目录中打开一个新终端;
  • 单击shell并选择New Window,然后在新终端中运行cd-ic-projects/locationhello(假设locationhello项目在ic-projects工作文件夹中);

    3、通过运行以下命令启动本地Canister执行环境:运行结束后会根据平台和本地安全设置提示警告,如果系统提示允许或拒绝传入网络连接(allow or deny incoming network connections)点击Allow
    4、让显示网络操作的终端保持打开状态,然后将焦点切换到创建项目的原始终端。
    5、通过运行以下命令为Dapp注册唯一的Canister标识符:
    dfx canister create --all
    6、运行以下命令构建Dapp:
    dfx build
    7、运行以下命令在本地Canister执行环境上部署Dapp:
    dfx canister install --all
    8、从命令行或浏览器测试Dapp中的功能。
    以上是使用Rust在Interputer Computer上开发一个Hello World项目的流程。