使用不同的语言进行开发

本指南中的大多数示例 dapp 都使用 Motoko - 专门设计用于与 Internet Computer 一起使用的编程语言。 但是,您可以使用任何可以编译为 WebAssembly 的语言编写 dapp,以部署在 Internet Computer 上运行的应用程序。 本节提供了一些关于用不同语言编写 dapp 以及如何在 Internet Computer 上部署它们的高级指南。

使用Rust

您可以通过使用 Cargo 并编译您的 dapp 以使用 WebAssembly 作为目标输出来创建要在 Internet Computer 上运行的 Rust 项目。

本节总结了将 Rust 程序部署为 Internet Computer 上的容器智能合约所涉及的关键步骤。 但是,您应该注意,此处描述的步骤仅说明了一种方法。 其他实现方法也是可能的。

注意Rust canister development kit (Rust CDK)提供了一些快捷方式,使编写函数作为查询和更新调用更容易,并包含几个link:https: //github.com/dfinity/cdk-rs/tree/next/examples[examples] 让您开始构建基于 Rust 的项目,但您也可以在不使用 Rust CDK 的情况下为 Internet Computer 开发 dapp。

创建一个项目

因为大多数 Rust 程序员使用 Cargo 来处理构建和包管理任务,例如下载和编译你的 dapp 所依赖的库,所以你的第一步是使用 Cargo 命令行界面创建一个新的 Rust 项目。

或者,您可以使用 DFINITY Canister Software Development Kit (SDK) 而不是 Cargo 创建一个新项目,但使用 Cargo 创建一个项目代表了创建 Rust 项目的典型工作流程。

创建一个新的 Rust 项目:

通过运行以下命令验证您是否已安装 Cargo:

+

cargo --version
  1. 切换到您用于 Internet Computer 或 Rust 示例项目的文件夹。

  2. 通过运行类似于以下的命令创建一个新项目:

    cargo new my_rust_dapp

    此命令创建一个新的 my_rust_dapp 目录,其中包含默认的 Cargo.toml 文件和一个 src 目录,其中包含默认的 main.rs 文件。

  3. 通过运行以下命令切换到您的项目目录:

    cd my_rust_dapp

    如果你列出这个目录的内容,你会发现它只包含`Cargo.toml文件和src`目录。 要编译此项目以在 Internet Computer 上运行,您需要一些额外的文件。

修改 Cargo 配置文件

Cargo.toml 文件为每个 Rust 包提供了一个 manifest。 清单包含指定包的配置详细信息的部分。 为了准备在 Internet Computer 上运行 Rust 项目,我们将复制默认的 Cargo.toml 文件,然后修改项目的一些配置细节。

修改 Cargo.toml 文件:

  1. 如有必要,通过运行 pwd 命令检查您是否位于项目的根目录中。

  2. 运行以下命令,将默认的 Cargo.toml 文件复制到 src 目录:

    cp Cargo.toml src/Cargo.toml

    在 Internet Computer 上运行的项目通常使用一个项目级 Cargo.toml 文件为项目的容器成员设置工作区,并在源代码目录中使用第二个 Cargo.toml 文件进行配置 每个容器的设置。

  3. 在文本编辑器中打开作为项目根目录的 Cargo.toml 文件。

    默认情况下,该文件包含 [package][dependencies] 部分。

  4. [package] 部分替换为 [workspace] 部分,类似于以下内容:

    [workspace]
    members = [
        "src/my_rust_dapp",
    ]

    有关 [workspace] 部分和 [workspace] 键的信息,请参阅 Workspaces。 有关您可以在 Cargo.toml 文件中配置的其他部分和键的信息,请参阅The Manifest Format

  5. 删除 [dependencies] 部分。

  6. 保存更改并关闭文件以继续。

  7. 在文本编辑器中打开 src/Cargo.toml 文件。

  8. 添加一个 [lib] 部分,其主源代码的路径类似于以下内容:

    [lib]
    path = "main.rs"
  9. 使用任何包依赖项更新 [dependencies] 部分。

  10. 保存更改并关闭文件以继续。

添加容器配置文件

当您使用 {sdk-short-name} 创建新项目时,dfx new 命令会自动将默认的`dfx.json` 配置文件添加到项目目录中。 因为我们使用 Cargo 创建了 Rust 项目,所以您需要在项目目录中手动创建此文件。

添加 dfx.json 配置文件:

  1. 如有必要,通过运行 pwd 命令检查您是否仍在项目目录中。

  2. 在项目的根目录中创建一个新的 dfx.json 配置文件。

  3. 在文本编辑器中打开 dfx.json 文件。

  4. 将具有类似于以下设置的 versioncanisters 键添加到 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 部分指定项目容器的名称。 在这种情况下,只有一个容器,它被命名为`my_rust_dapp`。

    • type 键设置为 custom,因为此容器不是当前识别的(motokoassets)容器类型之一。

    • candid 键指定用于此项目的 Candid 接口描述文件的名称和位置。

    • wasm 键指定由 cargo build 命令生成的 WebAssembly 文件的路径。

    • build 键指定用于编译输出的 cargo 命令。

    这些是所需的最低设置。 当您构建更复杂的程序时,您可能需要在 Cargo.toml 文件、dfx.json 文件或这两个文件中包含其他配置详细信息。 .保存更改并关闭文件以继续。

创建一个 Canid 接口描述文件

除了 dfx.json 配置文件,你还需要有一个 Candid 接口描述文件——例如,my_rust_dapp.did——将你的 dapp 的输入参数和返回值格式映射到它们在 坦率。

添加 Candid 接口描述文件:

  1. 如有必要,通过运行 pwd 命令检查您是否仍在项目目录中。

  2. 在项目的 src 目录中创建一个新的 Candid 接口描述文件,例如 my_rust_dapp.did

  3. 在文本编辑器中打开 Candid 接口描述文件,并为 dapp 定义的每个功能添加描述。

    例如,如果 my_rust_dapp 是一个使用 incrementreadwrite 函数递增计数器的简单 dapp,则 my_rust_dapp.did 文件可能如下所示:

    service : {
      "increment": () -> ();
      "read": () -> (nat) query;
      "write": (nat) -> ();
    }
  4. 保存更改并关闭文件以继续。

修改默认dapp

当您创建一个新项目时,您的项目 src 目录包含一个模板 main.rs 文件,其中包含“Hello, World!” 程序。

修改模板源代码:

  1. 在文本编辑器中打开模板 src/main.rs 文件并删除现有内容。

  2. 编写要在 Internet Computer 上部署的程序。

    在编写程序时,请记住有两种类型的调用——更新调用和查询调用——并且更新函数使用异步消息传递。

  3. 保存更改并关闭 main.rs 文件。

部署 dapp

在部署和测试 dapp 之前,您需要执行以下操作:

  • 连接到本地容器执行环境或 Internet Computer 区块链主网。

  • 为应用程序注册一个特定于网络的标识符。

  • 使用 WebAssembly 的目标输出编译 dapp。

因为您使用编译为 WebAssembly 的 cargo build 命令配置了自定义 dfx.json 文件,所以可以使用 dfx 命令行界面和标准工作流程来执行所有剩余步骤。

在本地构建和部署 dapp:

  1. 如有必要,通过运行 pwd 命令检查您是否仍在项目目录中。

  2. 在本地计算机上打开一个新的终端窗口或选项卡,然后导航到您的项目目录。

    例如,如果在 macOS 上运行终端,您可以执行以下任一操作:

    • 单击 Shell,然后选择 New Tab 在当前工作目录中打开一个新终端。

    • 单击 Shell 并选择 New Window,然后如果您的 location_hello 项目位于 ic-projects 工作文件夹中,则在新终端中运行 cd ~/ic-projects/location_hello

    您现在应该打开两个终端,并将您的项目目录作为当前工作目录**。

  3. 通过运行以下命令启动本地容器执行环境:

    dfx start

    根据您的平台和本地安全设置,您可能会看到显示的警告。 如果系统提示您允许或拒绝传入的网络连接,请单击 Allow

  4. 让显示网络操作的终端保持打开状态,然后将注意力转移到创建项目的原始终端。

  5. 通过运行以下命令为应用程序注册一个唯一的容器标识符:

    dfx canister create --all
  6. 通过运行以下命令构建 dapp:

    dfx build
  7. 通过运行以下命令在本地容器执行环境中部署 dapp:

    dfx canister install --all
  8. 从命令行或浏览器测试 dapp 中的功能。

使用 C

由于 Internet Computer 支持编译为标准 WebAssembly 模块的 dapp,因此您可以使用标准编译器和工具链以 C、C++、Objective-C 和 Objective-C++ 编程语言和 `Clang 等语言构建应用程序 ` 编译器。

为了说明如何将用 C 编写的 dapp 迁移到 Internet Computer 上运行,我们看一下链接中的简单 reverse.c 程序:https://github.com/dfinity/examples/tree/master/c [示例] 存储库。 reverse.c 程序包含一个名为 go 的函数,它可以将字符串反转。

搭建开发环境

要将 reverse.c 程序编译成 WebAssembly,您需要安装 clang 编译器和标准库。 您可以通过运行以下命令检查本地计算机上是否安装了`clang`:

clang --version

如果安装了`clang`,该命令会显示类似如下的信息:

clang version 10.0.0
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin

如果命令没有返回版本信息,请在继续之前安装`clang。 安装 `clang 的步骤因您使用的操作系统而异。 例如,在 Debian Linux 上,运行以下命令:

sudo apt-get install clang lld gcc-multilib

在 macOS 上,您可以通过安装 Developer Command-Line Tools 或使用 Homebrew 安装 LLVM 来安装 clang。 例如,如果 clang 未安装,请运行以下命令:

brew install llvm

将程序编译成 WebAssembly

您可以编译 C 程序以作为 WebAssembly 模块运行,首先使用 clang 进行编译,然后使用 wasm-ld 进行链接。 根据您使用的操作系统和 clang 版本,您可能会使用不同版本的 WebAssembly 链接器,例如 macOS 上的 wasm-ld 或 Debian 上的 wasm-ld-8

在 macOS 上编译为 WebAssembly:

  1. 通过运行以下 clang 命令编译程序:

    clang --target=wasm32 -c -O3 reverse.c
  2. 通过运行以下 wasm-ld 命令运行链接器以创建 WebAssembly 模块:

    wasm-ld --no-entry --export-dynamic --allow-undefined reverse.o -o reverse.wasm

创建一个最小的配置文件

接下来,您需要准备一个简单的配置文件,将 reverse dapp 二进制文件标识为可以安装在 Internet Computer 上的包和一个 build 目录,以便您可以使用 dfx 命令- 线接口安装和运行包作为一个容器。

准备配置文件和构建目录:

  1. 通过运行以下命令,使用 canisters 键创建一个 dfx.json 文件:

    echo '{"canisters":{"reverse":{"main":"reverse"}}}' > dfx.json
  2. 通过运行以下命令为 dapp 创建一个 build 目录:

    mkdir build
  3. 通过运行以下命令为 dapp 创建一个 reverse 目录:

    mkdir build/reverse
  4. 通过运行以下命令将 WebAssembly 模块复制到新的 build/reverse 目录:

    cp reverse.wasm build/reverse/

创建一个最小的接口描述文件

在标准开发工作流程中,运行 dfx build 命令会在 canisters 输出目录中创建多个文件,包括一个或多个处理关联数据类型的类型匹配的 Candid 接口描述 (.did) 文件 具有程序的功能。

有关用于不同数据类型的语法的详细信息,请参见Candid Guide 和链接:https://github.com/dfinity/candid/tree/ 主/规范[坦率规范]。

为这个程序创建一个 Candid 接口描述文件:

  1. 在您为 reverse.c 程序源创建的 build 目录中打开一个终端

  2. 创建一个名为 reverse.did 的新文本文件。

  3. 添加对`go`函数的描述。

    例如:

    service : {
      "go": (text) -> (text);
    }
  4. 保存更改并关闭文件以继续。

部署和测试 dapp

在部署和测试 dapp 之前,您需要执行以下操作:

  • 连接到本地容器执行环境或 Internet Computer 区块链主网。

  • 为应用程序注册一个特定于网络的标识符。

在本地部署和测试 dapp:

  1. 在本地计算机上打开一个新的终端窗口或选项卡。

    例如,如果在 macOS 上运行终端,请单击 Shell,然后选择 New Tab 以在当前工作目录中打开一个新终端。

  2. 通过运行以下命令,在您的第二个终端中启动本地容器执行环境:

    dfx start
  3. 通过运行以下命令为 reverse 应用程序注册一个唯一的容器标识符:

    dfx canister create --all
  4. 通过运行以下命令在本地容器执行环境中部署默认 dapp:

    dfx canister install --all
  5. 通过运行以下命令调用 dapp 中的 go 函数:

    dfx canister call reverse go reward
    ("drawer")

您可以在链接中找到 C dapp 的其他示例examples 存储库。