使用actor查询

快速入门中,您第一次看到了一个用于 Internet Computer 的简单容器,其中涉及一个参与者对象和异步消息传递。 作为学习编写利用基于 actor 的消息传递的容器的下一步,本教程说明了如何修改传统的 Hello, World! 容器以定义一个actor,然后在本地容器上部署和测试您的容器 执行环境。

开始之前

在开始本教程之前,请验证以下内容:

  • 您已按照下载并安装中的说明下载并安装了 {sdk-short-name} 包。

  • 您已停止任何本地容器执行环境进程

完成本教程大约需要 20 分钟。

创建一个新项目

要为本教程创建一个新项目:

  1. 在本地计算机上打开终端 shell(如果您还没有的话) 有一个打开。

  2. 更改为您用于 Internet Computer 项目的文件夹(如果您正在使用一个)。

  3. 通过运行以下命令创建一个新项目:

    dfx new actor_hello
  4. 通过运行以下命令切换到您的项目目录:

    cd actor_hello

修改默认配置

Exploring the default project 教程中,您看到创建新项目会将默认的`dfx.json` 配置文件添加到您的项目目录中。 在本教程中,您需要修改一些默认设置以反映您的项目。

修改 dfx.json 配置文件:

  1. 在文本编辑器中打开 dfx.json 配置文件。

  2. 检查 actor_hello 项目的默认设置。

  3. 请注意,源文件和输出文件的名称和路径都使用 actor_hello 项目名称。

    例如,默认容器智能合约名称为`actor_hello,主代码文件的默认路径为src/actor_hello/main.mo`。

    您可以重命名这些文件或目录中的任何一个。 但是,如果您进行任何更改,请确保您在文件系统上用于文件和目录的名称与您在 dfx.json 配置文件中指定的名称匹配。 如果您打算使用默认目录和文件名,则无需更改。

  4. 从文件中删除所有 actor_hello_assets 配置设置。

    本教程的示例容器不使用任何前端资产,因此您可以从配置文件中删除这些设置。

    例如,删除 actor_hello_assets 部分后的配置文件如下所示:

    {
      "canisters": {
        "actor_hello": {
          "main": "src/actor_hello/main.mo",
          "type": "motoko"
        }
      },
      "defaults": {
        "build": {
          "packtool": ""
        }
      },
      "dfx": "0.9.2",
      "networks": {
        "local": {
          "bind": "127.0.0.1:8000",
          "type": "ephemeral"
        }
      },
      "version": 1
    }
  5. 保存更改并关闭文件以继续。

修改默认容器

在链接:explore-templates.html[Exploring the default project] 教程中,您看到创建一个新项目会创建一个带有模板 main.mo 文件的默认 src 目录。 在本教程中,您将修改模板代码以创建一个简单的“Hello, World!”容器。 通过在 Motoko 中定义一个actor。 在 Motoko 中,Internet Computer 容器被表示为 Motoko actor。

修改默认模板源代码:

  1. 通过运行以下命令切换到项目的源代码目录:

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

    下一步是编写一个容器,打印类似传统的“Hello, World!”这样的语句。 样品容器。 但是,要为 Internet Computer 编译容器,您的 Motoko 代码必须定义一个 actor

  3. 将以下示例代码复制并粘贴到 main.mo 文件中:

    import Debug "mo:base/Debug";
    actor HelloActor {
       public query func hello() : async () {
          Debug.print ("Hello, World from DFINITY \n");
       }
    };

    让我们仔细看看定义我们的容器的这个 Motoko actor:

    • 代码导入一个 Debug 模块以提供 print 功能。

    • actor 使用 public query func 声明来定义一个 Internet Computer query 方法。 我们的方法不需要对参与者的状态进行任何永久性更改。 将其声明为查询意味着它所做的任何更改都是暂时的,并在查询完成后被丢弃。

    有关使用查询调用的更多信息,请参阅query calls in 容器包括程序和状态

  4. 保存更改并关闭 main.mo 文件。

检查容器是否构建

通常,为了构建一个容器,首先需要在 Internet Computer 区块链主网上保留一个唯一的容器标识符。

但是,也可以在完全不连接到 Internet Computer 区块链主网的情况下编译您的程序。 dfx build --check 命令使用一个临时的硬编码容器标识符来完成此操作。

要检查容器是否构建:

  1. 导航回项目目录的根目录。

  2. 通过运行以下命令,使用临时的硬编码标识符构建容器可执行文件:

    dfx build --check

    --check 选项使您能够在本地构建项目以验证它是否可以编译并检查生成的文件。 因为 dfx build --check 命令仅使用临时标识符,您应该会看到类似于以下内容的输出:

    Building canisters to check they build ok. Canister IDs might be hard coded.
    Building canisters...

    如果容器编译成功,您可以在默认的 .dfx/local/canisters 目录和 .dfx/local/canisters/actor_hello/ 子目录中检查输出。

    例如,您可以使用 tree 命令查看创建的文件:

    tree .dfx/local/canisters

    该命令显示类似于以下内容的输出

.dfx/local/canisters
├── actor_hello
│   ├── actor_hello.d.ts
│   ├── actor_hello.did
│   ├── actor_hello.did.js
│   ├── actor_hello.js
│   └── actor_hello.wasm
└── idl

2 directories, 5 files

部署项目

您无法将 dfx build --check 命令的输出部署到本地容器执行环境或 Internet Computer 主网。 如果要部署此项目,则需要执行以下操作:

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

  • 注册特定于连接的容器标识符。

  • 部署容器。

让我们更详细地考虑这些步骤。 在部署此项目之前,您必须连接到由 dfx 提供的本地容器执行环境或 Internet 计算机区块链主网。 连接到本地容器执行环境或 Internet Computer 主网后,您还必须生成唯一的、*连接特定的*容器标识符来替换本地定义的标识符。 要亲自查看涉及的步骤,让我们在本地部署项目。

要在本地部署此项目:

  1. 如果需要,打开终端并导航到您的项目目录。

  2. 通过运行以下命令在本地计算机上启动本地容器执行环境:

    dfx start --background

    对于本教程,您可以使用 --background 选项将本地容器执行环境作为后台进程启动。 使用此选项,您可以继续下一步,而无需在本地计算机上打开另一个终端 shell。

  3. 通过运行以下命令,在本地容器执行环境中为您的项目生成新的容器标识符:

    dfx canister create actor_hello

    您应该会看到类似于以下内容的输出:

    Creating a wallet canister on the local network.
    The wallet canister on the "local" network for user "pubs-id" is "rwlgt-iiaaa-aaaaa-aaaaa-cai"
    Creating canister "actor_hello"...
    "actor_hello" canister created with canister id: "rrkah-fqaaa-aaaaa-aaaaq-cai"

    dfx canister create 命令还将连接特定的容器标识符存储在 .dfx/local 目录中的 canister_ids.json 文件中。

    例如:

    {
      "actor_hello": {
        "local": "rrkah-fqaaa-aaaaa-aaaaq-cai"
      }
    }
  4. 通过运行以下命令构建容器:

    dfx build

    该命令显示类似于以下内容的输出:

    Building canisters...
  5. 通过运行以下命令,在本地容器执行环境中部署您的 actor_hello 项目:

    dfx canister install actor_hello

    该命令显示类似于以下内容的输出:

    Installing code for canister actor_hello, with canister_id rrkah-fqaaa-aaaaa-aaaaq-cai

查询容器

您现在已经在本地容器执行环境中部署了容器,并且可以使用 dfx canister call 命令测试您的容器。

要测试您在本地容器执行环境中部署的容器:

  1. 通过运行以下命令,使用 dfx canister call 调用 hello 函数:

    dfx canister call actor_hello hello
  2. 验证该命令是否返回为 hello 函数指定的文本以及运行本地容器执行环境的终端中的检查点消息。

    例如,容器在输出中显示“Hello, World from DFINITY”,类似于以下内容:

    [Canister rrkah-fqaaa-aaaaa-aaaaq-cai] Hello, World from DFINITY

    请注意,如果您在单独的终端而不是在后台运行 Internet 计算机主网,则会在显示主网活动的终端中显示“Hello, World from DFINITY”消息。

停止本地容器执行环境

完成对容器的试验后,您可以停止本地容器执行环境,使其不会继续在后台运行。

要停止本地容器执行环境,您可以:

  1. 在用于与您的容器交互的终端中,发出命令“dfx stop”; 要么

  2. 在显示来自本地容器执行环境的操作的终端中,按 Control-C 中断该进程; 要么

  3. 使用操作系统的命令或工具终止“副本”进程。

  4. 通过运行以下命令停止本地容器执行环境:

    dfx stop