2025年Dfinity (ICP)开发基本操作-4

Dfinity (ICP)开发基本操作-4Dfinity 开发基本操作 安装 升级或删除软件 直接从终端安装最新的 从终端 shell 下载和安装 在本地计算机上打开终端外壳 例如 在 macOS 上打开 Applications 文件夹 然后打开 Utilities 并双击 Terminal 通过运行以下 curl 命令下载并安装 SDK 包

大家好,我是讯享网,很高兴认识大家。

Dfinity 开发基本操作

安装、升级或删除软件

直接从终端安装最新的

从终端 shell 下载和安装:

  1. 在本地计算机上打开终端外壳。

    例如,在 macOS 上打开 Applications 文件夹,然后打开 Utilities 并双击Terminal

  2. 通过运行以下curl命令下载并安装 SDK 包:
    sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)" 

    讯享网

从终端安装特定版本

如果要安装特定版本,例如,针对以前的版本进行测试,您可以修改安装命令以包含一个版本。

要从终端外壳下载并安装特定版本:

  1. 在本地计算机上打开终端外壳。
  2. DFX_VERSION环境变量设置为要作为curl命令前缀安装的 DFINITY Canister SDK 包的版本。

    例如,要安装 0.7.2 版,您将运行以下命令:

    讯享网DFX_VERSION=0.7.2 sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)" 

审查许可协议

在本地计算机上安装命令行界面可执行文件及其依赖项之前,安装脚本会提示您阅读并接受DFINITY Canister SDK 许可协议dfx。您必须键入y并按Enter才能继续安装。

接受许可协议后,安装脚本将显示有关安装在本地计算机上的组件的信息。

安装的组件

DFINITY Canister SDK 安装脚本在本地计算机的默认位置安装多个组件。下表描述了安装脚本安装的开发环境组件:

Component Description Default location
dfx DFINITY execution command-line interface (CLI) /usr/local/bin/dfx
moc Motoko runtime compiler ~/.cache/dfinity/versions/<VERSION>/moc
replica Internet Computer local network binary ~/.cache/dfinity/versions/<VERSION>/replica
uninstall.sh Script to remove the DFINITY Canister SDK and all of its components ~/.cache/dfinity
versions Cache directory that contains a subdirectory for each version of the DFINITY Canister SDK you install. ~/.cache/dfinity/versions
版本化目录中的核心组件

~/.cache/dfinity/versions目录存储 DFINITY Canister SDK 的一个或多个版本化子目录。每个版本化子目录都包含特定版本的 DFINITY Canister SDK 所需的所有目录和文件。例如,如果您列出目录的内容,~/.cache/dfinity/versions/0.7.2您将看到以下核心组件:

total  drwxr-xr-x 17 pubs staff 544 Mar 15 11:55 . drwxr-xr-x 4 pubs staff 128 Mar 25 14:36 .. drwxr-xr-x 49 pubs staff 1568 Mar 15 11:55 base drwxr-xr-x 20 pubs staff 640 Mar 15 11:55 bootstrap -r-x------ 1 pubs staff  Mar 15 11:55 dfx -r-x------ 1 pubs staff  Dec 31 1969 ic-ref -r-x------ 1 pubs staff  Dec 31 1969 ic-starter -r-x------ 1 pubs staff 9604 Dec 31 1969 libcharset.1.0.0.dylib -r-x------ 1 pubs staff 38220 Dec 31 1969 libffi.7.dylib -r-x------ 1 pubs staff  Dec 31 1969 libgmp.10.dylib -r-x------ 1 pubs staff  Dec 31 1969 libiconv.2.4.0.dylib -r-x------ 1 pubs staff 4200 Dec 31 1969 libiconv.dylib -r-x------ 1 pubs staff 96900 Dec 31 1969 libz.1.2.11.dylib -r-x------ 1 pubs staff  Dec 31 1969 mo-doc -r-x------ 1 pubs staff  Dec 31 1969 mo-ide -r-x------ 1 pubs staff  Dec 31 1969 moc -r-x------ 1 pubs staff  Dec 31 1969 replica 
Motoko 基本目录

base在DFINITY容器SDK的版本子目录目录包含元子基础库模块与该版本的DFINITY容器SDK兼容。由于 Motoko 基础库发展迅速,您应该只使用与您安装的 DFINITY Canister SDK 版本一起打包的基础模块。

引导目录

bootstrap目录包含已弃用的 Web 服务器代码。从 0.7.0 版本开始,代理可以调用 HTTP 中间件服务器而不是bootstrap代码。这一变化使容器能够直接响应 HTTP 请求,并且更像传统的基于 Web 的应用程序。

升级到最新版本

如果在您初始安装后有新版本的 DFINITY Canister SDK 可供下载,您应尽早安装更新版本,以便尽快获得最新的修复和增强功能。您可以使用该dfx upgrade命令将当前安装的版本与可供下载的最新版本进行比较。如果有更新的版本dfx可用,该dfx upgrade命令会自动下载并安装最新版本。

请注意,在安装新版本之前,您无需卸载软件。但是,如果您想执行全新安装而不是升级,您可以先按照删除软件中的说明卸载软件,然后重新运行下载和安装命令。

删除软件

安装 DFINITY Canister SDK 时,安装脚本会将所需的二进制文件放在本地目录中并创建缓存。您可以通过运行uninstall位于.cache文件夹中的脚本从本地计算机中删除 SDK 二进制文件和缓存。

例如:

讯享网~/.cache/dfinity/uninstall.sh复制 

如果您卸载是因为您想立即重新安装一个干净版本的dfx,您可以运行以下命令:

~/.cache/dfinity/uninstall.sh && sh -ci "$(curl -sSL https://sdk.dfinity.org/install.sh)"复制 

设计应用

当您想出应用程序的想法时,您将就如何构建和组织项目做出许多设计决策。这些设计决策中的大多数与您是在传统云服务上还是在 Internet 计算机上部署应用程序无关。但是,如果您打算在 Internet 计算机上进行部署,则在计划应用程序的实现时,您应该特别注意一些设计决策

此部分正在进行中且不完整。随着构建在 Internet 计算机上运行的应用程序的**实践和设计模式不断发展,此处包含的信息也将相应地发展和变化。

单个或多个容器架构

在设计应用程序时,您可能要考虑的第一个决定是它应该封装在单个容器中还是由多个容器组成。

例如,如果您正在编写一个没有前端的简单服务,您可能希望使用单个容器来简化项目管理和维护并专注于添加功能。如果您的应用程序同时具有前端资产和后端业务逻辑,则您的项目可能至少包含两个容器,一个容器用于管理用户界面组件,另一个容器用于应用程序提供的后端服务。

在规划时,您还可以考虑将一些常见的可重用服务放在他们自己的容器中,以便可以从其他更专业的容器中导入和调用它们,或者提供给其他开发人员使用。该LinkedUp示例应用程序说明这种方法通过拆分专业的服务应用程序分成两个容器。在 LinkedUp 示例中,建立社交联系的功能在connectd容器中定义,并与容器中定义的用于设置专业资料的功能分开linkedup。很容易想象使用第三个容器扩展应用程序,例如根据配置文件属性或共享连接安排事件。

将参与者和类型和实用程序分开

在为您的项目规划架构时,一种常见的做法是将主要角色的代码放在一个文件中,并带有单独的附加文件,用于定义您的程序使用的类型和不需要角色的实用功能。

例如,您可以将应用程序的后端逻辑设置为包含以下文件:

  • Main.mo或者main.rs使用需要参与者发送查询和更新调用的函数。
  • Util.moutil.rs带有可以导入供演员使用的辅助函数。
  • Types.motypes.rs与您的应用程序的所有数据类型定义。

使用查询调用

查询返回结果的速度比更新调用更快。因此,将函数显式标记为 aquery是提高应用程序性能的有效策略。在规划和设计阶段,您应该考虑如何最好地使用查询调用而不是可以执行查询或更新的函数。

这是一个很好的通用规则,可以广泛应用于大多数类别的应用程序。但是,您还应该考虑查询不通过共识的安全性和性能权衡。对于某些应用程序,这种权衡可能是合适的。例如,如果您正在开发一个博客平台,检索与标签匹配的文章的查询可能不保证通过共识以确保大多数节点对结果达成一致。但是,如果您的应用程序正在检索敏感信息(如财务数据),您可能需要比基本查询提供的结果更有保证。

作为基本查询的替代,互联网计算机还支持认证查询。经过认证的查询使您能够接收经过身份验证的可信任的响应。使用经过认证的查询是一种高级技术,教程或其他以开发人员为中心的文档中未涵盖,但您可以了解身份验证的工作原理以及配置程序以返回经过认证的数据以响应接口规范。

数据存储和检索

对于许多应用程序,数据库主要用于提供可以使用一个或多个关键字段有效检索的记录的长期存储。在 Internet 计算机上,此用例通常通过哈希表等数据结构来解决。Internet 计算机不是传统的数据库,而是使您能够使用稳定的内存来处理长期数据存储(通常称为正交持久性)并使用查询调用来检索数据。尽管这种方法适用于大多数应用程序和简单的键值数据库请求,但它并不能完全模拟关系数据库。

管理项目

您可以通过修改每个项目的dfx.json配置文件来修改单个项目的一些关键设置。您可以使用该dfx config命令以编程方式更改这些设置,也可以dfx.json直接手动编辑文件。

如何更改源目录

在使用该dfx build命令为项目编译源代码之前,您可能需要检查用于存储程序源代码的默认位置。默认情况下,您创建新项目使用的名称是一个数据智能合约容器(canister_name)和一个资产容器(canister_name_assets)的名称,并且程序源代码应该在该src/canister_name目录中。同样,前端源代码的默认位置在src/canister_name_assets/src目录中,前端输出位于dist/canister_name_assets目录中。

但是,根据应用程序的复杂性和体系结构,您可能希望修改程序源代码、前端源代码或前端输出的默认位置。

例如,对于一个简单的程序,您可能希望消除一个目录级别并将源代码放在该src目录中:

讯享网 "main": "src/main.mo", 

对于更复杂的应用程序,您可能希望使用多层目录结构:

"canisters": { "profiles": { "main": "src/profiles/utils/main.mo" }, "events": { "main": "src/events/calendar/main.mo" }, "media": { "main": "src/events/reports/main.mo" } } 

如何修改源代码目录的默认设置,请确保dfx.json配置文件中的设置与文件系统上的目录位置匹配

如何修改主程序文件名

在使用该dfx build命令为项目编译源代码之前,您应该验证用于程序源代码的位置和文件名。

例如,如果您要为程序构建智能合约容器并且factorial程序的源代码位于 中src/math/factorial.mo,则应确保为配置文件部分中的main设置指定了正确的路径canisters

例如:

讯享网"main": "src/math/factorial.mo", 

请记住,更改程序文件名的配置设置只会影响dfx build命令查找要编译的源代码的位置。在配置文件中进行更改不会重命名文件系统上的任何文件或目录。如果更改主程序文件的路径或文件本身的名称,请务必更改项目目录中的名称和位置。

如何修改服务应用程序前段的位置

您可以通过修改dfx.json配置文件中的本地网络设置来更改为应用程序前端提供服务的默认主机名和端口号。

例如,您可以通过修改bind设置来更改本地网络的 IP 地址:

"networks": { "local": { "bind": "192.168.47.1:8000", "type": "ephemeral" } } 

使用不同的语言进行开发

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

Rust

您可以通过使用 Cargo 并编译您的程序以使用 WebAssembly 作为目标输出来创建 Rust 项目以在 Internet 计算机上运行。

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

请注意,Rust 容器开发工具包 (Rust CDK)提供了一些快捷方式,可以更轻松地编写查询和更新调用函数,并包含几个示例来帮助您开始构建基于 Rust 的项目,但您也可以为 Internet 开发应用程序不使用 Rust CDK 的计算机。

创建项目

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

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

创建一个新的 Rust 项目:

  1. 如果您还没有打开,请在本地计算机上打开一个终端外壳。
  2. 通过运行以下命令验证您是否安装了 Cargo:
    讯享网cargo --version 
  3. 更改为用于 Internet 计算机或 Rust 示例项目的文件夹。
  4. 通过运行类似于以下的命令来创建一个新项目:
    cargo new my_rust_program 

    此命令创建一个my_rust_program带有默认Cargo.toml文件的新目录和一个带有默认文件的src目录main.rs

  5. 通过运行以下命令切换到您的项目目录:
    讯享网cd my_rust_program 

    如果您列出此目录的内容,您将看到它只包含Cargo.toml文件和src目录。要编译此项目以在 Internet 计算机上运行,您需要一些附加文件。

修改Cargo配置文件

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

要修改Cargo.toml文件:

  1. pwd如有必要,请通过运行命令检查您是否位于项目的根目录中。
  2. 通过运行以下命令将默认Cargo.toml文件复制到src目录:
    cp Cargo.toml src/Cargo.toml 

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

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

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

  4. 将该[package]部分替换为[workspace]类似于以下内容的部分:
    讯享网[workspace] members = [ "src/my_rust_program", ] 

    有关[workspace]部分和[workspace]键的信息,请参阅工作区。有关您可以在Cargo.toml文件中配置的其他部分和键的信息,请参阅清单格式。

  5. 删除该[dependencies]部分。
  6. 保存更改并关闭文件以继续。
  7. src/Cargo.toml在文本编辑器中打开文件。
  8. 添加一个[lib]包含主源代码路径的部分,类似于以下内容:
    [lib] path = "main.rs" 
  9. [dependencies]使用任何包依赖项更新该部分。
  10. 保存更改并关闭文件以继续。
添加容器配置文件

当您使用 DFINITY Canister SDK 创建新项目时,该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_program": { 
          "type": "custom", "candid": "src/my_rust_program.did", "wasm": "target/wasm32-unknown-unknown/debug/my_rust_program.wasm", "build": "cargo build --target wasm32-unknown-unknown --package my_rust_program" } } } 

    让我们仔细看看这些设置。

    • version设置用于标识用于创建项目的软件版本。
    • canisters部分指定项目容器的名称。在这种情况下,只有一个容器,名为my_rust_program
    • type键设置为custom,因为这容器是不是目前公认的(一个motokoassets)容器类型。
    • candid键指定名称和坦率的接口描述文件的位置用于此项目。
    • wasm键指定的路径,通过所产生的WebAssembly文件cargo build命令。
    • build键指定cargo命令用于编译的输出。

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

  5. 保存更改并关闭文件以继续。
创建 Candid 接口描述文件

除了dfx.json配置文件之外,您还需要有一个 Candid 接口描述文件——例如,my_rust_program.did——将程序的输入参数和返回值格式映射到它们在 Candid 中的与语言无关的表示。

添加 Candid 接口描述文件:

  1. pwd如有必要,请通过运行命令检查您是否仍在项目目录中。
  2. 创建一个新的偷拍接口描述文件,例如my_rust_program.did, -在src您的项目目录。
  3. 在文本编辑器中打开 Candid 接口描述文件,并为程序定义的每个函数添加描述。

    例如,如果my_rust_program是一个简单的程序,增量计数器使用incrementreadwrite功能,该my_rust_program.did文件可能是这样的:

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

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

修改模板源代码:

  1. src/main.rs在文本编辑器中打开模板文件并删除现有内容。
  2. 编写要在 Internet 计算机上部署的程序。

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

  3. 保存更改并关闭main.rs文件。
连接到网络并部署

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

  • 连接到 Internet 计算机网络,可以在您的开发环境中本地运行,也可以在您可以访问的子网上远程运行。
  • 为应用程序注册特定于网络的标识符
  • 使用 WebAssembly 的目标输出编译程序。

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

在本地构建和部署程序:

  1. pwd如有必要,请通过运行命令检查您是否仍在项目目录中。
  2. 在本地计算机上打开一个新的终端窗口或选项卡,然后导航到您的项目目录。

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

    • 单击Shell,然后选择New Tab在当前工作目录中打开一个新终端。
    • 单击Shell并选择New Windowcd ~/ic-projects/location_hello如果您的location_hello项目在ic-projects工作文件夹中,则在新终端中运行。

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

  3. 通过运行以下命令在本地计算机上启动 Internet 计算机网络:
    讯享网dfx start 

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

  4. 让显示网络操作的终端保持打开状态,并将焦点切换到您创建项目的原始终端。
  5. 通过运行以下命令为应用程序注册一个唯一的容器标识符:
    dfx canister create --all 
  6. 通过运行以下命令来构建程序:
    讯享网dfx build 
  7. 通过运行以下命令在本地网络上部署程序:
    dfx canister install --all 
  8. 从命令行或浏览器测试程序中的功能。

C

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

为了说明如何将用 C 编写的程序迁移到 Internet 计算机上运行,让我们看一下示例存储库中的简单reverse.c程序。该程序包含一个名为的函数,用于原地反转字符串。reverse.c``go

设置开发环境

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

讯享网clang --version 

如果clang已安装,该命令会显示类似以下信息:

叮当版 10.0.0 目标:x86_64-apple-darwin19.5.0 线程模型:posix 安装目录:/usr/local/opt/llvm/bin 

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

讯享网sudo apt-get install clang lld gcc-multilib 

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

brew install llvm 
将程序编译成WebAssembly

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

在 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程序二进制文件标识为一个可以安装在 Internet 计算机上的包和一个build目录,以便您可以使用dfx命令行界面将程序包作为容器安装和运行。

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

  1. dfx.json通过运行以下命令创建一个带有 canisters 键的文件:
    讯享网echo '{"canisters":{"reverse":{"main":"reverse"}}}' > dfx.json 
  2. build通过运行以下命令为程序创建一个目录:
    mkdir build 
  3. reverse通过运行以下命令为程序创建一个目录:
    讯享网mkdir build/reverse 
  4. build/reverse通过运行以下命令将 WebAssembly 模块复制到新目录:
    cp reverse.wasm build/reverse/ 
创建一个最小的接口描述文件

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

有关用于不同数据类型的语法的详细信息,请参阅Candid 指南和Candid 规范。

要为此程序创建 Candid 接口描述文件:

  1. build您为reverse.c程序源创建的目录中打开一个终端
  2. 创建一个名为reverse.did.
  3. 添加go函数的描述。

    例如:

    讯享网service : { "go": (text) -> (text); } 
  4. 保存更改并关闭文件以继续。
部署和测试程序

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

  • 连接到 Internet 计算机网络,可以在您的开发环境中本地运行,也可以在您可以访问的子网上远程运行。
  • 为应用程序注册特定于网络的标识符。

在本地部署和测试应用程序:

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

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

  2. 通过运行以下命令,在第二个终端中的本地计算机上启动 Internet 计算机网络:
    dfx start 
  3. reverse通过运行以下命令为应用程序注册一个唯一的容器标识符:
    讯享网dfx canister create --all 
  4. 通过运行以下命令在本地网络上部署默认程序:
    dfx canister install --all 
  5. go通过运行以下命令调用程序中的函数:
    讯享网dfx canister call reverse go reward ("drawer") 

您可以在示例存储库中找到 C 程序的其他示例。

构建前端

这些教程介绍了一些为您的项目构建前端用户界面的基本方法。例如,教程演示了:

  • 使用Candid作为基本接口来公开和测试容器中的功能。
  • 使用原始 HTML 和 JavaScript来显示一个简单的 HTML 入口页面。
  • 使用React 和编译后的 JavaScript将 HTML 属性和元素直接嵌入到页面中。
  • 使用React 和 TypeScript从外部文件导入 CSS 属性。

本节将详细介绍默认的前端模板、前端配置选项以及使用其他框架为您的项目构建用户界面。

如何使用默认模板

正如您在教程中可能已经注意到的那样,项目包括模板index.jswebpack.config.js文件。

默认情况下,该index.js文件显式实例化 HTTP 代理的实例。该代理为面向用户的前端和 Internet 计算机之间的交互提供了一个接口。创建代理后,该index.js文件会为项目dfx.json文件中定义的容器构造一个参与者。

如果您查看index.js文件中的代码,您会看到它使用以下代码块执行这些步骤:

import { 
    Actor, HttpAgent } from '@dfinity/agent'; import { 
    idlFactory as hello_idl, canisterId as hello_id } from 'dfx-generated/hello'; const agent = new HttpAgent(); const hello = Actor.createActor(hello_idl, { 
    agent, canisterId: hello_id }); 

在为项目创建代理和参与者之后,该index.js文件为用于与应用程序的文档对象模型 (DOM) 和 HTML 交互的 JavaScript 提供了一个占位符。

修改webpack配置

因为 webpack 是一个流行的、高度可配置的模块打包器,用于基于 JavaScript 的应用程序,新项目创建一个默认webpack.config.js文件,可以轻松添加特定的模块——例如reactmarkdown——你想要使用。

如果您查看模板webpack.config.js文件中的代码,您会看到它为项目dfx.json文件中定义的容器构造别名。然后,当前端作为模块导入时,别名可用于引用容器。

您可以在以下代码块中看到这些步骤:

讯享网// List of all aliases for canisters. This creates the module alias for // the `import ... from "dfx-generated/canisters/xyz"` where xyz is the name of a // canister. const aliases = Object.entries(dfxJson.canisters).reduce( (acc, [name, _value]) => { 
    // Get the network name, or `local` by default. const networkName = process.env["DFX_NETWORK"] || "local"; const outputRoot = path.join( __dirname, ".dfx", networkName, "canisters", name ); return { 
    ...acc, ["dfx-generated/" + name]: path.join(outputRoot, name + ".js"), }; }, { 
   } ); 
输入输出配置

创建容器别名后,模板webpack.config.js文件会为前端生成一个 webpack 配置,并将生成的文件添加到项目目录的输出目录中。

在很多情况下,您可以webpack.config.js按原样使用默认文件,无需任何修改,也可以添加插件、模块和其他自定义配置以满足您的需求。您对webpack.config.js配置所做的具体更改很大程度上取决于您要使用的其他工具和框架。

例如,如果您尝试过自定义前端或添加样式表前端教程,您可能已经修改了以下部分以使用 React

JavaScript:

 module: { 
    rules: [ { 
    test: /\.(ts|tsx|jsx)$/, loader: "ts-loader" }, { 
    test: /\.css$/, use: ['style-loader','css-loader'] } ] }, plugins: [ new HtmlWebpackPlugin({ 
    template: path.join(__dirname, info.frontend.entrypoint), filename: 'index.html', chunks: ['index'], }) ], }; } 
确保节点在项目中可用

因为项目依赖webpack为默认前端提供框架,所以你必须已经node.js安装在你的开发环境中并且可以在项目目录中访问。

  • 如果您想在不使用默认 webpack 配置和容器别名的情况下开发您的项目,您可以assetsdfx.json文件中删除容器或使用特定容器名称构建您的项目。例如,您可以通过运行以下命令来选择仅构建 hello 程序,而无需前端资产:
    讯享网dfx 构建你好 
  • 如果你使用默认的 webpack 配置并且运行dfx build失败,你应该尝试npm install在项目目录中运行然后重新运行dfx build.
  • 如果npm install在项目目录中运行不能解决问题,您应该检查webpack.config.js文件的配置是否存在语法错误。
在 React 框架中使用其他模块

示例存储库中的几个教程和示例项目说明了如何使用该npm install命令添加 React 模块。您可以使用这些模块来构建要在项目中使用的用户界面组件。例如,您可以运行以下命令来安装react-router模块:

npm install --save react react-router-dom 

然后,您可以使用该模块构建类似于以下内容的导航组件:

讯享网import React from 'react'; import { 
    NavLink } from 'react-router-dom'; const Navigation = () => { 
    return ( <nav className="main-nav"> <ul> <li><NavLink to="/myphotos">Remember</NavLink></li> <li><NavLink to="/myvids">Watch</NavLink></li> <li><NavLink to="/audio">Listen</NavLink></li> <li><NavLink to="/articles">Read</NavLink></li> <li><NavLink to="/contribute">Write</NavLink></li> </ul> </nav> ); } export default Navigation; 
使用 webpack-dev-server 更快地迭代

您可以使用一些简单的快捷方式在开发环境中加快迭代速度。例如,您可以选择仅构建和部署特定容器,而不是项目中的所有容器。

如果您的大部分更改都在应用程序的前端,则可以更快地进行迭代的最有效方法之一是安装和配置 webpack 开发服务器。webpack 开发服务器webpack-dev-server——提供对 webpack 资产的内存访问,使您能够进行更改并使用实时重新加载立即在浏览器中看到它们的反映。

安装和配置webpack-dev-server

  1. 创建一个新项目并切换到您的项目目录。
  2. webpack-dev-server通过运行以下命令将 安装在项目目录中:
    npm install webpack-dev-server 
  3. webpack.config.js在文本编辑器中打开项目文件。
  4. outputwebpack.config.js文件部分之后添加您的网络主机名和端口信息。

    例如,如果您使用默认主机和端口信息进行本地开发,则应将以下内容添加到webpack.config.js文件中:

    讯享网devServer: { 
          proxy: { 
          "/api": "http://localhost:8000", }, }, 
  5. 保存更改并关闭webpack.config.js文件以继续。
  6. package.json在文本编辑器中打开项目文件。
  7. "build": "webpack"在该scripts部分之后添加一个逗号。
  8. "start": "webpack serve"在该scripts部分中添加一个新行。

    例如:

    "start": "webpack serve" 
  9. 保存更改并关闭package.json文件以继续。
  10. 如有必要,在本地启动 Internet 计算机,然后像往常一样进行部署,例如,通过运行dfx deploy命令。
  11. 通过运行以下命令启动 webpack 开发服务器:
    讯享网npm start 
  12. 打开 Web 浏览器并使用端口 8080 导航到您的应用程序的资产容器。

    例如:

    http://localhost:8080/?canisterId=ryjl3-tyaaa-aaaaa-aaaba-cai 
  13. 打开一个新的终端窗口或选项卡并导航到您的项目目录。
  14. index.js在文本编辑器中打开项目文件并更改内容。

    例如,您可以使用 JavaScript 向页面添加一个元素:

    document.body.onload = addElement;

    讯享网document.body.onload = addElement; function addElement () { 
          // create a new div element const newDiv = document.createElement("div"); // and give it some content const newContent = document.createTextNode("Test live page reloading!"); // add the text node to the newly created div newDiv.appendChild(newContent); // add the newly created element and its content into the DOM const currentDiv = document.getElementById("div1"); document.body.insertBefore(newDiv, currentDiv); } 
  15. 保存对index.js文件的更改,但保持编辑器打开以继续进行更改。
  16. 刷新浏览器或等待它自行刷新以查看您的更改。

    当您完成项目的前端工作后,您可以按 Control-C 停止 webpack 开发服务器。

管理容器

如果您已经按照教程部分中的教程或通过从示例存储库中克隆示例来尝试使用 DFINITY 容器软件开发工具包 (SDK) ,那么您已经熟悉如何将程序构建和部署为容器。本节提供有关容器生命周期以及如何管理容器的其他信息。


讯享网

注册容器标识符

根据您的首选开发工作流程,您可以在准备好编译程序之前或之后注册唯一的容器标识符。例如,如果您想在编写任何代码之前在子网上为您的程序保留一个唯一标识符,您可以通过运行该dfx canister create命令来实现。此命令实际上会创建一个空的容器占位符,您可以稍后将代码安装到其中。

要为容器注册唯一标识符:

  1. 在本地计算机上打开一个新的终端窗口或选项卡。
  2. 通过运行类似于以下内容的命令,为您计划创建的容器创建一个新项目:
    dfx new YOUR-PROJECT-NAME 

    请注意,默认情况下,您用于项目的名称也用作容器名称。

  3. 切换到您的新项目目录。
  4. 打开dfx.json配置文件并为您要使用的 Internet 计算机网络提供商设置主机和端口。

    如果您使用本地主机作为 Internet 计算机网络提供商,则可以跳过此步骤。

    如果您想在编译代码之前为您认为需要的任何其他容器创建标识符,您还可以选择更改容器的名称或将容器设置添加到配置文件中。

  5. 如有必要,通过运行以下命令启动 Internet 计算机网络:
    讯享网dfx start --background 

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您正在注册容器以在远程网络上运行,您将包括--network命令行选项以在该网络上执行任务。

  6. dfx.json通过运行以下命令,为 中定义的容器注册唯一标识符:
    dfx canister create --all 

    该命令创建.dfx/local目录并将canister_ids.json文件添加到项目的该目录中。

使用本地标识符构建容器

为项目编写源代码后,需要将其编译为 WebAssembly 模块,然后再将其作为容器部署到网络中。

如果您只是为了本地调试而编译您的项目,您可以为您的项目生成一个本地定义的标识符。

生成本地定义的标识符:

  1. 使用配置设置和程序逻辑创建一个项目以满足您的需求。
  2. 如有必要,启动 Internet 计算机网络。

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您正在编译容器以在远程网络上运行,您将包含--network命令行选项以在该网络上执行任务。

  3. dfx.json通过运行以下命令,为 中定义的容器生成硬编码的本地标识符:
    讯享网dfx build --check 

    请注意,您必须先注册唯一的容器标识符来替换本地定义的标识符,然后才能在 Internet 计算机网络上部署项目。

在 Internet 计算机网络上部署容器

编译程序后,您可以将编译后的代码安装在您的开发中本地运行的 Internet 计算机网络或远程网络提供商上。

预先或在构建过程中创建的容器标识符决定了您的代码在部署过程中的安装位置。

首次部署在 Internet 计算机网络上:

  1. 打开一个新终端并导航到您的项目目录。
  2. 如有必要,启动 Internet 计算机网络。

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您在远程网络上安装容器,您将包括--network命令行选项以在该网络上执行任务。

  3. 验证您拥有要部署的所有容器的容器标识符。
  4. 通过运行以下命令部署所有容器:
    dfx canister install --all 
查找容器标识符

所有容器都有唯一的、特定于网络的标识符。您经常需要使用这些标识符来与容器交互。例如,如果要访问应用程序的前端容器或使用 Candid Web 界面与服务交互,则必须指定适当的容器标识符。

由于标识符是特定于网络的,用于存储信息的文件位于不同的目录中。例如,本地部署的容器的标识符位于项目.dfx/local/canister_ids.json文件中。

您可以通过运行该dfx canister id命令来查找任何特定容器的容器标识符。例如,要查找lookup部署在本地网络上的容器的容器标识符,您可以运行以下命令:

讯享网dfx canister id lookup 

要查找在ic别名指定的网络上部署的同一个容器的容器标识符,您将运行以下命令:

dfx canister --network=ic id lookup 
为现有的canister添加钱包

做本地开发的时候,新建项目会自动创建一个默认的钱包供你和那个项目中的容器子(canister)一起使用。 如果你想为之前创建的容器子的项目添加一个钱包,你可以强制dfx生成一个通过几个手动步骤。

添加钱包以与现有容器一起使用:

  1. 打开终端并导航到您的项目目录。
  2. 如有必要,通过运行以下命令停止本地 Internet 计算机网络:
    讯享网dfx stop 
  3. 删除.dfx目录。
  4. 通过运行以下命令从 Internet 计算机网络开始:
    dfx start --clean 
重新安装一个 canister

在开发周期中,您可能想要安装,然后在调试和改进程序时替换它。

在这种情况下,您可能希望保留已注册的容器标识符,但不保留任何容器代码或状态。例如,您的容器可能只有您不想保留的测试数据,或者您可能已决定完全更改程序但想要在用于安装以前程序的容器标识符下重新安装。

要在 Internet 计算机网络上重新安装:

  1. 打开一个新终端并导航到您的项目目录。
  2. 如有必要,启动 Internet 计算机网络。

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您在远程网络上重新安装容器,您将包括--network命令行选项以在该网络上执行任务。

  3. 验证您具有要重新部署的所有容器的容器标识符。
  4. 通过运行以下命令重新部署所有容器:
    讯享网dfx canister install --all --mode reinstall 

请注意,您可以使用该reinstall模式替换任何容器,无论容器是否具有与其关联的代码或状态。

设置身份以拥有 canister

在大多数情况下,default系统会在您第一次运行该dfx canister create命令时自动为您创建一个用户身份。此默认身份由为您的本地用户帐户生成的公钥和私钥对组成。通常,此default身份也是您创建的所有项目和您部署的所有容器的默认所有者。但是,您可以主动创建和使用您选择的default身份来避免使用用户身份。

例如,以下场景说明了创建一个registered_owner身份,然后使用该身份注册、构建、部署和调用pubs项目。

要为项目设置标识:

  1. 通过运行以下命令创建一个新项目:
    dfx new pubs 
  2. 通过运行以下命令切换到项目目录:
    讯享网cd pubs 
  3. 通过运行以下命令在后台本地启动 Internet 计算机网络:
    dfx start --background 
  4. registered_owner通过运行以下命令创建新身份:
    讯享网dfx identity new registered_owner 
  5. registered_owner通过运行以下命令将活动用户上下文设置为使用该身份:
    dfx identity use registered_owner 
  6. 通过运行以下命令为项目注册、构建和部署容器:
    讯享网dfx canister create --all dfx build --all dfx canister install --all 

    这些命令使用registered_owner身份运行,使该用户成为部署的容器的所有者。

  7. greet通过运行以下命令调用该函数以验证部署是否成功:
    dfx canister call pubs greet '("Sam")' 
管理容器的运行状态

在 Internet 计算机上部署容器后,它可以开始接收和处理来自用户和其他容器的请求。可用于发送请求和接收回复的容器被视为处于运行状态。

尽管默认情况下容器通常处于运行状态,但在某些情况下,您可能希望暂时或永久停止容器。例如,您可能希望在升级容器之前停止容器。停止容器有助于确保正确处理任何正在进行且需要运行完成或回滚的消息。作为删除容器的先决条件,您可能还希望停止容器以干净地清除其消息队列。

您可以通过运行dfx canister status命令来检查所有容器或指定容器的当前状态。例如,要查看在本地 Internet 计算机网络上运行的所有容器的状态,您可以运行以下命令:

讯享网dfx canister status --all 

如果容器当前正在运行,此命令将返回类似于以下内容的输出:

Canister status_check's status is Running. Canister status_check_assets's status is Running. 

您可以通过运行dfx canister stop命令来停止当前正在运行的容器。

讯享网dfx canister stop --all 

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

Stopping code for canister status_check, with canister_id 75hes-oqbaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q Stopping code for canister status_check_assets, with canister_id cxeji-wacaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q 

如果您要重新运行该dfx canister status命令,您可能会看到Stopped指示没有需要处理的挂起消息的状态或Stopping指示有需要处理的正在传输的消息的状态。

要重新启动容器(例如,在容器升级成功后),您可以运行该dfx canister start命令。例如,要重新启动在本地 Internet 计算机网络上运行的所有容器,您将运行以下命令:

讯享网dfx canister start --all 

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

Starting code for canister status_check, with canister_id 75hes-oqbaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q Starting code for canister status_check_assets, with canister_id cxeji-wacaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q 

升级一个canister

与保留容器标识符但不保留状态的容器替换不同,容器升级使您能够保留已部署容器的状态并更改代码。

例如,假设您有一个管理专业资料和社交关系的应用程序。如果要向应用程序添加新功能,则需要能够在不丢失任何先前存储的数据的情况下更新容器代码。容器升级使您能够使用程序更改更新现有容器标识符,而不会丢失程序状态。

要升级 Internet 计算机网络上的容器:

  1. 打开一个新终端并导航到您的项目目录。
  2. 如有必要,启动 Internet 计算机网络。

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您在远程网络上升级容器,您将包括--network命令行选项以在该网络上执行任务。

  3. 验证您拥有要升级的所有容器的容器标识符。

    请注意,您的程序必须通过stable在变量声明中使用关键字来标识要为其保持状态的变量。

    有关声明稳定变量的更多信息,请参阅Motoko 编程语言指南

  4. 通过运行以下命令升级所有容器:
    讯享网dfx canister install --all --mode upgrade 

删除容器

如果要永久删除给定 Internet 计算机网络上特定项目的一个特定容器或所有容器,可以通过运行该dfx canister delete命令来实现。

删除容器会从 Internet 计算机网络中删除容器标识符、代码和状态。但是,在删除容器之前,您必须先停止容器以清除任何挂起的消息请求或答复。

要删除在本地 Internet 计算机网络上运行的项目的所有容器:

  1. 打开一个新终端并导航到您的项目目录。
  2. 如有必要,启动 Internet 计算机网络。

    在大多数情况下,仅当您在本地运行 Internet 计算机网络时才需要执行此步骤。

    如果您要删除远程网络上的容器,您将包括--network命令行选项以在该网络上执行任务。

  3. 通过运行以下命令检查在本地 Internet 计算机网络上运行的项目容器的状态:
    dfx canister status --all 
  4. 通过运行以下命令停止所有项目容器:
    讯享网dfx canister stop --all 
  5. 通过运行以下命令删除所有项目容器:
    dfx canister delete --all 

使用默认的cycles钱包

正如令牌和周期中所讨论的,ICP 令牌可以转换为周期来为容器操作供电。周期提供了一个基本稳定的价值主张,代表了应用程序消耗的通信、计算和存储的运营成本。例如,周期反映了在 Internet 计算机上运行的应用程序所需的物理硬件、机架空间、能源、存储设备和网络带宽的实际成本。

与 ICP 代币不同,周期仅与容器相关联,而不与用户或开发人员主体相关联。因为只有容器需要和消耗周期——执行操作并为它们使用的资源付费——用户和开发人员通过一种称为周期钱包的特殊类型的容器来管理周期的分配和所有权。由于循环钱包保存执行操作(例如创建新容器)所需的周期,因此默认情况下使用循环钱包的容器标识符而不是您的用户主体来执行这些操作。

出于本地开发的目的,DFINITY Canister SDK 会在每个项目中自动为您创建一个默认的循环钱包,并且使用循环钱包执行的大部分操作都在幕后进行。例如,cycles 钱包代表您注册容器标识符并在本地网络上部署容器。

但是,在生产环境中,您通常需要明确注册周期并将其转移到新容器,指定可以充当保管人的委托人,并管理具有所有权的委托人。您可以使用在 Web 浏览器中运行的默认循环钱包应用程序来执行其中一些任务。根据您要采取的具体操作,您还可以通过dfx wallet在终端中运行命令或直接调用默认周期钱包容器中的方法来执行这些周期和容器管理任务。

但是,您应该记住,对cycles wallet canister 的调用是使用与当前选择的用户身份关联的cycles wallet 标识符来执行的。根据您当前选择的身份以及与该身份关联的委托人是否已添加为钱包的控制器或保管人,您可能会看到不同的结果或被拒绝访问特定方法。

要检查您当前使用的身份,请运行以下命令:

讯享网dfx identity whoami 

控制者和保管着角色

可以将用户主体或容器标识符分配给控制器保管人角色。

控制器是分配给控制器角色可以执行特权任务,包括以下最优越的作用和一个主体:

  • 添加和删除其他主体作为控制器。
  • 授权和取消授权其他委托人作为保管人。
  • 将条目添加到周期钱包地址簿。
  • 访问周期钱包余额和所有其他与钱包相关的信息。
  • 将周期发送到其他容器。
  • 从其他容器接收周期。
  • 在调用其他容器时充当“消息调用者”主体。
  • 创建容器和额外的周期钱包。
  • 重命名周期钱包。

分配给保管人角色的委托人只能执行周期钱包管理任务的子集,包括以下内容:

  • 访问周期钱包余额和所有其他与钱包相关的信息。
  • 将周期发送到其他容器。
  • 从其他容器接收周期。
  • 在调用其他容器时充当“消息调用者”主体。
  • 创建容器。

检查周期平衡

如果你是做当地的发展,当您使用注册一个新容器标识创建你的周期钱包dfx canister create或当你注册,构建和部署一个容器dfx deploy

如果您在 Internet 计算机上进行部署,您通常会通过将 ICP 代币转换为周期、将周期传输到新的容器标识符并使用默认周期钱包 WebAssembly 模块 (WASM) 更新容器来创建周期钱包。

在本地或远程网络上有一个cycles钱包后,您可以使用 dfx wallet balance命令或wallet_balance方法查看当前的cycle余额。

在本地开发时检查您的周期平衡

如果您正在进行本地开发,您可以使用该 dfx wallet balance命令逐个项目地检查当前周期平衡。

要检查本地项目中的周期平衡:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    dfx start --background 
  3. 通过运行以下命令,显示与当前选择的身份关联的周期钱包中的周期余额:
    讯享网dfx wallet balance 

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

    000 cycles. 
检查互联网计算机上的周期平衡

如果你在互联网电脑主网上部署了cycles钱包,可以使用该 dfx wallet balance命令查看当前网络的cycles余额。

要在 Internet 计算机上检查周期平衡:

  1. 打开终端并导航到包含dfx.json配置文件的目录。
  2. 通过运行以下命令检查与 Internet 计算机的连接:
    讯享网dfx ping ic 
  3. 通过运行以下命令,显示与当前选择的身份关联的循环钱包中的循环余额:
    dfx wallet --network ic balance 

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

    讯享网995 cycles. 
调用周期 wallet_balance 方法

您也可以wallet_balance直接调用cycles wallet canister中的方法来查看cycles余额。例如,如果您的委托人是h5aet-waaaa-aaaab-qaamq-cai周期钱包的控制器,您可以通过运行以下命令来检查当前周期余额:

dfx canister --network ic call h5aet-waaaa-aaaab-qaamq-cai wallet_balance 

该命令使用 Candid 格式返回余额作为带有金额字段(由哈希 3_573_748_184 表示)和 6,895,656,625,450 个周期的余额的记录,如下所示:

讯享网(record { 3_573_748_184 = 6_895_656_625_450 }) 

添加控制器

如果您是循环钱包的控制者,则可以向控制者角色添加其他主体或容器标识符。将委托人添加到控制器角色也会自动将委托人添加到保管人角色。

要将控制器添加到本地项目中的循环钱包:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    dfx start --backgrounddfx start --background 
  3. 通过运行类似于以下的命令,显示与当前选择的身份相关联的周期钱包中的周期余额:
    讯享网dfx wallet add-controller <controller-principal-identifier> 

    例如,您将运行以下命令将主体标识符 b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe 表示的用户添加为本地循环钱包的控制器:

    dfx wallet add-controller b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe 

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

    讯享网Added b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe as a controller. 

列出当前控制器

您可以使用 dfx wallet controllers命令或get_controllers方法列出对指定周期钱包容器具有完全控制权的委托人。

要列出本地项目中循环钱包的控制器:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    dfx start --background 
  3. 通过运行以下命令,列出对当前项目中的循环钱包具有完全控制权的主体标识符:
    讯享网dfx wallet controllers 

    该命令显示控制循环钱包的主体的文本表示,输出类似于以下内容:

    tsqwz-udeik-5migd-ehrev-pvoqv-szx2g-akh5s-fkyqc-zy6q7-snav6-uqe b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-4q6y4a6 

移除控制器

您可以使用 dfx wallet remove-controller命令或remove_controller方法删除主体作为控制器。

要在本地项目中删除循环钱包的控制器:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    讯享网dfx start --background 
  3. 通过运行类似于以下的命令,指定要从当前项目中的控制器角色中删除的主体标识符:
    dfx wallet remove-controller b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe 

    命令输出类似如下:

    讯享网Removed b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe as a controller. 

列出当前的托管人

您可以使用 dfx wallet custodians命令或get_custodians方法返回当前定义为周期钱包托管人的委托人列表。

列出本地项目中循环钱包的保管人:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    dfx start --background 
  3. 通过运行以下命令,列出当前项目中对循环钱包具有保管人角色的主体标识符:
    讯享网dfx wallet custodians 

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

    tsqwz-udeik-5migd-ehrev-pvoqv-szx2g-akh5s-fkyqc-zy6q7-snav6-uqe b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-4q6y4a6 

删除对托管人的授权

您可以使用dfx wallet deauthorize命令或deauthorize方法删除委托人作为周期钱包的托管人。取消先前作为控制器添加的主体的授权也会自动从控制器角色中删除主体。

要在本地项目中删除循环钱包的保管人:

  1. 打开终端并导航到项目的根目录。
  2. 通过运行以下命令在本地启动 Internet 计算机:
    讯享网dfx start --background 
  3. 通过运行类似于以下的命令,指定要从当前项目中的保管人角色中删除的主体标识符:
    dfx wallet deauthorize b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe 

    命令输出类似如下:

    讯享网Deauthorized b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe as a custodian. 

将周期发送到容器

您可以使用dfx wallet sendwallet_send方法的命令将特定数量的循环发送到特定容器。请记住,您指定的容器必须是周期钱包或具有wallet_receive接受周期的方法。

如果你已经在 Internet Computer 主网上部署了一个循环钱包,你可以使用该 dfx wallet send命令在网络上运行的容器之间发送循环。

要将循环发送到在 Internet 计算机上运行的另一个容器:

  1. 打开终端并导航到包含dfx.json配置文件的目录。
  2. 通过运行以下命令检查与 Internet 计算机的连接:
    dfx ping ic 
  3. 获取要接收周期的容器的容器标识符。

    例如,运行以下命令以显示与 Internet 计算机上的当前用户身份关联的循环钱包标识符:

    讯享网dfx identity --network ic get-wallet 

    该命令显示循环钱包容器标识符,输出类似于以下内容:

    gastn-uqaaa-aaaae-aaafq-cai 
  4. 通过运行类似于以下的命令将循环发送到容器标识符:
    讯享网dfx wallet --network ic send <destination> <amount> 

    例如:

    dfx wallet --network ic send gastn-uqaaa-aaaae-aaafq-cai  

    如果传输成功,该命令不会显示任何输出。

  5. 通过运行以下命令检查周期钱包余额以查看更新的可用周期数:
    讯享网dfx wallet --network ic balance 

    例如:

    090 cycles. 

列出地址簿条目

您可以使用dfx wallet addresses命令或list_addresses方法列出已为周期钱包配置的主体标识符和角色。

要查看在 Internet 计算机上运行的循环钱包的地址簿条目:

  1. 打开终端并导航到包含dfx.json配置文件的目录。
  2. 通过运行以下命令检查与 Internet 计算机的连接:
    讯享网dfx ping ic 
  3. 通过运行以下命令获取周期钱包的地址簿条目:
    dfx wallet --network ic addresses 

    该命令显示循环钱包的控制器和保管人,输出类似于以下内容:

    讯享网Id:tsqwz-udeik-5migd-ehrev-pvoqv-szx2g-akh5s-fkyqc-zy6q7-snav6-uqe,种类:未知,角色:控制器,名称:未设置名称。 Id:ejta3-neil3-qek6c-i7rdw-sxreh-lypfe-v6hjg-6so7x-5ugze-3iohr-2qe,种类:未知,角色:保管人,名称:未设置名称。 Id:b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe,种类:未知 

默认钱包中的其它方法

默认循环钱包容器包括未作为dfx wallet命令公开的附加方法。其他方法支持更高级的循环管理任务,例如创建新容器和管理事件。

创建一个新的循环钱包

使用该wallet_create_wallet方法创建一个具有初始周期余额的新周期钱包容器,并且可以选择将特定委托人作为其控制器。如果您未指定控制主体,则用于创建新钱包的循环钱包将是新钱包的控制器。

例如,您可以运行类似于以下的命令来创建一个新钱包并指定一个主体作为控制器:

dfx canister --network call f3yw6-7qaaa-aaaab-qaabq-cai wallet_create_wallet '(record { cycles = 00 : nat64; controller = principal "vpqee-nujda-46rtu-4noo7-qnxmb-zqs7g-5gvqf-4gy7t-vuprx-u2urx-gqe"})' 

该命令返回新钱包的委托人:

讯享网(record { 1_313_628_723 = principal "dcxxq-jqaaa-aaaab-qaavq-cai" }) 

注册新的容器标识符

使用该wallet_create_canister方法在 Internet 计算机上注册新的容器标识符。此方法创建一个新的“空”容器占位符,其中包含初始周期余额,并且可以选择将特定主体作为其控制器。注册容器标识符后,您可以作为一个单独的步骤为您的应用程序安装代码。

例如,您可以运行类似于以下的命令来创建一个新钱包并指定一个主体作为控制器:

dfx canister --network call f3yw6-7qaaa-aaaab-qaabq-cai wallet_create_canister '(record { cycles = 00 : nat64; controller = principal "vpqee-nujda-46rtu-4noo7-qnxmb-zqs7g-5gvqf-4gy7t-vuprx-u2urx-gqe"})' 

该命令返回您创建的新容器的主体:

讯享网(record { 1_313_628_723 = principal "dxqg5-iyaaa-aaaab-qaawa-cai" }) 

从容器接收周期

使用该wallet_receive方法作为端点来接收周期。

从钱包转接电话

使用该wallet_call方法使用循环钱包标识符转发呼叫。

管理地址

使用以下方法管理地址簿条目:

  • add_address:(地址:AddressEntry)→();
  • remove_address:(地址:委托人)→();

管理活动

使用以下方法检索事件和图表信息。

  • get_events:(opt record { from: opt nat32; to: opt nat32; }) → (vec Event) 查询;
  • get_chart: (opt record { count: opt nat32; precision: opt nat64; } ) → (vec record { nat64; nat64; }) query;

例如,您可以通过运行类似于以下的命令来使用该get_events方法返回canister_create和其他事件:

dfx canister call <cycles-wallet-identifier> get_events '(record {from = null; to = null})' 

如果cycles wallet ( gastn-uqaaa-aaaae-aaafq-cai) 部署在Internet Computer 主网络上,您可以运行如下命令来返回事件:

讯享网dfx canister --network ic call gastn-uqaaa-aaaae-aaafq-cai get_events '(record {from = null; to = null})' 

该命令的输出采用类似于以下内容的 Candid 格式:

( vec { record { 23_515 = 0; 1_191_829_844 = variant { 4_271_600_268 = record { 23_515 = principal "tsqwz-udeik-5migd-ehrev-pvoqv-szx2g-akh5s-fkyqc-zy6q7-snav6-uqe"; 1_224_700_491 = null; 1_269_754_742 = variant { 4_218_395_836 };} }; 2_781_795_542 = 1_621_456_688_636_513_683;}; record { 23_515 = 1; 1_191_829_844 = variant { 4_271_600_268 = record { 23_515 = principal "ejta3-neil3-qek6c-i7rdw-sxreh-lypfe-v6hjg-6so7x-5ugze-3iohr-2qe"; 1_224_700_491 = null; 1_269_754_742 = variant { 2_494_206_670 };} }; 2_781_795_542 = 1_621_461_468_638_569_551;}; record { 23_515 = 2; 1_191_829_844 = variant { 1_205_528_161 = record { 2_190_693_645 = 11_000_000_000_000; 2_631_180_839 = principal "gvvca-vyaaa-aaaae-aaaga-cai";} }; 2_781_795_542 = 1_621_462_573_993_647_258;}; record { 23_515 = 3; 1_191_829_844 = variant { 1_205_528_161 = record { 2_190_693_645 = 11_000_000_000_000; 2_631_180_839 = principal "gsueu-yaaaa-aaaae-aaagq-cai";} }; 2_781_795_542 = 1_621_462_579_193_578_440;}; record { 23_515 = 4; 1_191_829_844 = variant { 1_955_698_212 = record { 2_190_693_645 = 0; 2_374_371_241 = "install_code"; 2_631_180_839 = principal "aaaaa-aa";} }; 2_781_795_542 = 1_621_462_593_047_590_026;}; record { 23_515 = 5; 1_191_829_844 = variant { 1_955_698_212 = record { 2_190_693_645 = 0; 2_374_371_241 = "install_code"; 2_631_180_839 = principal "aaaaa-aa";} }; 2_781_795_542 = 1_621_462_605_779_157_885;}; record { 23_515 = 6; 1_191_829_844 = variant { 1_955_698_212 = record { 2_190_693_645 = 0; 2_374_371_241 = "authorize"; 2_631_180_839 = principal "gsueu-yaaaa-aaaae-aaagq-cai";} }; 2_781_795_542 = 1_621_462_609_036_146_536;}; record { 23_515 = 7; 1_191_829_844 = variant { 1_955_698_212 = record { 2_190_693_645 = 0; 2_374_371_241 = "greet"; 2_631_180_839 = principal "gvvca-vyaaa-aaaae-aaaga-cai";} }; 2_781_795_542 = 1_621_463_144_066_333_270;}; record { 23_515 = 8; 1_191_829_844 = variant { 4_271_600_268 = record { 23_515 = principal "ejta3-neil3-qek6c-i7rdw-sxreh-lypfe-v6hjg-6so7x-5ugze-3iohr-2qe"; 1_224_700_491 = null; 1_269_754_742 = variant { 2_494_206_670 };} }; 2_781_795_542 = 1_621_463_212_828_477_570;}; record { 23_515 = 9; 1_191_829_844 = variant { 1_955_698_212 = record { 2_190_693_645 = 0; 2_374_371_241 = "wallet_balance"; 2_631_180_839 = principal "gastn-uqaaa-aaaae-aaafq-cai";} }; 2_781_795_542 = 1_621_878_637_071_884_946;}; record { 23_515 = 10; 1_191_829_844 = variant { 4_271_600_268 = record { 23_515 = principal "b5quc-npdph-l6qp4-kur4u-oxljq-7uddl-vfdo6-x2uo5-6y4a6-4pt6v-7qe"; 1_224_700_491 = null; 1_269_754_742 = variant { 4_218_395_836 };} }; 2_781_795_542 = 1_621_879_473_916_547_313;}; record { 23_515 = 11; 1_191_829_844 = variant { 313_999_214 = record { 1_136_829_802 = principal "gastn-uqaaa-aaaae-aaafq-cai"; 3_573_748_184 = 10_000_000_000;} }; 2_781_795_542 = 1_621_977_470_023_492_664;}; record { 23_515 = 12; 1_191_829_844 = variant { 2_171_739_429 = record { 25_979 = principal "gastn-uqaaa-aaaae-aaafq-cai"; 3_573_748_184 = 10_000_000_000; 4_293_698_680 = 0;} }; 2_781_795_542 = 1_621_977_470_858_839_320;};}, ) 

在此示例中,有十二个事件记录。Role 字段(由 hash 表示1_269_754_742)指定主体是控制器(由 hash 表示4_218_395_836)还是保管人(由 hash 表示2_494_206_670)。此示例中的事件还说明了一个金额字段(由 hash 表示3_573_748_184),其中传输了 10,000,000,000 个周期。

讯享网 在此示例中,有十二个事件记录。Role 字段(由 hash 表示`1_269_754_742`)指定主体是控制器(由 hash 表示`4_218_395_836`)还是保管人(由 hash 表示`2_494_206_670`)。此示例中的事件还说明了一个金额字段(由 hash 表示`3_573_748_184`),其中传输了 10,000,000,000 个周期。 
小讯
上一篇 2025-04-08 11:43
下一篇 2025-03-13 10:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/61614.html