Skip to content

Commit

Permalink
Merge pull request #137 from ic123-xyz/workflow-accout
Browse files Browse the repository at this point in the history
Add document for development workflow and developer account.
  • Loading branch information
zhangwei983 authored Mar 4, 2024
2 parents 0d6355e + f978f9c commit b76001b
Show file tree
Hide file tree
Showing 7 changed files with 211 additions and 0 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
146 changes: 146 additions & 0 deletions docusaurus/docs/getting-started/dev-account/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
---
title: 开发者账号
image: './img/account.png'
description: ''
keywords: [DFINITY, ICP, IC, 互联网计算机, developer, 开发者, account, 账号,主体,身份]
---

import TeamContact from '../../contact.md';

# 开发者账号

![img](./img/account.png)

## 概览 {#overview}

ICP 开发者[账号](https://ic123.xyz/docs/getting-started/ic-glossary/#account)、或者[身份](https://ic123.xyz/docs/getting-started/ic-glossary/#identity),使用公私钥对进行身份验证。账号由[主体](https://ic123.xyz/docs/getting-started/ic-glossary/#principal)来标识。主体则是一个通用的标识,用于表示用户、容器以及一些将来的其他概念。开发者账号的主体值是从账号对应的公钥中派生出来的。

ICP 开发者账号类似比特币或以太坊的钱包地址,其中一个主要的区别在于 ICP 账号没有初始余额。

## ICP 身份术语 {#icp-identity-terms}

与 ICP 身份相关的术语还包括:

- 账本账号标识符:与您的 ICP 账本账号相关联的标识符。

- 钱包:用于存储各种代币。开发者主要使用 cycles 钱包来管理开发智能合约所需的 cycles。

- 互联网身份 (Internet Identity) :ICP 的原生身份验证服务。互联网身份不使用用户名和密码、而是使用存储在本地设备硬件中的通行密钥 (passkey)。

### 账本与钱包的区别 {#ledger-wallet-difference}

在 ICP 上,账本是一个系统容器、用于存储账号及其交易。用户拥有一个账本账号标识符,账本账户用于持有 ICP 代币。要获取您的账本账户的信息,您需要查询账本系统容器。

ICP 上的钱包则用于存储 cycles,这些 cycles 可以发送给容器、以支付其消耗的资源。

在典型的开发者工作流程中,开发者会将 ICP 代币存入对应的账本账户,然后将这些代币转换为 cycles 存储在 cycles 钱包中。

## 创建账号 {#creat-account}

要创建一个新的开发者账户,请使用 [IC SDK](https://ic123.xyz/docs/getting-started/install-dfx/) 工具 `dfx`,命令如下所示:

```bash
dfx identity new <identity_name>
```

使用 `dfx` 创建的身份是全局的,并不限于某个特定项目。身份名称必须使用以下字符:`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_@0123456789`

### 存储账户密钥

当使用 `dfx` 创建新的身份时,私钥会存储在 `~/.config/dfx/identity/<identity_name>/identity.pem` 文件中。请务必将此文件备份到安全的地方。

另外您可以使用 `--storage-mode` 标志来创建受密码保护的 PEM 文件、或明文 PEM 文件。以下是一些示例:

```bash
dfx identity new <identity_name> --storage-mode password-protected
```

或者:

```bash
dfx identity new <identity_name> --storage-mode plaintext
```

更多关于创建账号的信息,请参考[该指南](https://ic123.xyz/docs/getting-started/use-dfx/#create-identity)

## 获取账号主体 {#get-principal}

您可以通过以下命令获取账号的主体标识符:

```bash
dfx identity use <identity_name>
dfx identity get-principal
```

主体标识符的格式类似于:

```
itk7v-ihlxk-ktdrh-fcnst-vkoou-orj77-52ogl-jqwj5-zpfdv-az3lr-xqe
```

您还可以通过运行以下命令来检查相应的私钥:

```bash
dfx identity export default
```

结果类似如下所示:

```
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIIGTvo7+8q+dRVoDWPVp1hBziKUEOffo1PDkY2Vn8sKMoAcGBSuBBAAK
oUQDQgAEXFFBa0oxGdamv537nusjtgVuzElEMtEbbj4dQ1xyu2WMa+PU9q9LIK26
Ar821EwGwp1Qc9Vv93FGPTvRb4HVXQ==
-----END EC PRIVATE KEY-----
```

## 导入账号 {#import-account}

您可以使用以下命令将现有的 PEM 文件导入成为您的身份:

```bash
dfx identity import <identity_name> pem_file-name
```

此命令也支持 `--storage-mode` 标志,允许导入受密码保护的 PEM 文件、或明文 PEM 文件。

## 如何充值 ICP {#top-up-icp}

当您拥有了开发者账号,您需要使用 ICP 来充值该账号。首先,您需要使用以下命令获取账户的账本账号标识符:

```bash
dfx identity use <identity_name>
dfx ledger account-id
```

该命令将返回对应账号在 ICP 账本上的账号编号:

```
e213184a548871a47fb526f3cba24e2ee2fbbc8129c4ab497ef2ce535130a0a4
```

接下来您需要将 ICP 代币发送到该账本账号标识符。您可以通过以下途径获取 ICP 代币:

- 直接通过交易所购买 ICP 代币,请查看[该页面](https://coinmarketcap.com/currencies/internet-computer/#markets)以了解可以购买 ICP 代币的交易所;

- 通过参与 [IC 治理](https://ic123.xyz/docs/ic-web3/stake-icp/)的奖励获得代币。;

- 通过 Internet Computer Association(ICA)或 DFINITY 基金会的 [grant 计划](https://ic123.xyz/docs/ecosystem-guide/dev-grants/)获得代币;

- 作为[节点提供者](https://ic123.xyz/docs/ecosystem-guide/node-provider-faq/)获得 ICP 代币,以作为提供算力的报酬。

当您的账号中收到了 ICP 代币,您可以使用以下命令查看余额:

```bash
dfx ledger balance --network ic
```

结果类似如下所示:

```
19.420000 ICP
```

更多关于 ICP 账本的命令,请参考[该指南](https://ic123.xyz/docs/getting-started/use-dfx/#ledger)

<TeamContact />
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
63 changes: 63 additions & 0 deletions docusaurus/docs/getting-started/dev-workflow/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
title: 开发流程
image: './img/workflow.jpg'
description: ''
keywords: [DFINITY, ICP, IC, 互联网计算机, developer, 开发者, workflow]
---

import TeamContact from '../../contact.md';

# 开发流程

![img](./img/workflow.jpg)

## 概览 {#overview}

ICP (Internet Computer Protocol) 接受并执行以 WebAssembly (Wasm) 二进制格式编写的智能合约。理论上,开发者可以直接在 Wasm 字节码中编写有效的智能合约。然而这样做过于繁琐且耗时,标准做法是使用更高级的编程语言(例如 JavaScript/TypeScript, Motoko, Python 或 Rust )编写智能合约代码,然后将其编译成 Wasm。

ICP 生态系统中的主要开发工具是 dfx。dfx 是一个命令行多功能工具,在整个开发过程中开发者都会用到它:从生成开发者密钥,到设置新项目,进而到编译、部署和管理智能合约。

![img](./img/developer-build.png)

默认情况下,dfx 生成的项目结构会包含两个智能合约:前端[容器](https://ic123.xyz/docs/getting-started/ic-glossary/#canister)和后端容器。

- 前端容器包含 Web 资产,如 JavaScript、HTML、CSS 和图像,这些资产会提供给浏览器;
- 后端容器则定义了智能合约的实际程序逻辑。

:::info

前端和后端容器的配置只是一种约定。实际上您可以编写一个单一的容器,它既包含了智能合约的程序逻辑、又托管了 Web 资产。

:::

由于智能合约可以使用不同的编程语言编写,因此它们都需要在接受参数和返回结果的二进制格式上达成一致。这种通用格式允许用户和智能合约调用其他智能合约,而不用关心它们是用哪种语言编写的。在传统编程中,这个概念被称为[应用程序二进制接口](https://en.wikipedia.org/wiki/Application_binary_interface)(ABI)。ICP 拥有自己的 ABI 语言,称之为 [Candid](https://ic123.xyz/docs/getting-started/ic-glossary/#candid),它类似于 JSON 或 Protobuf、但专为 ICP 而定制。

在开发过程中,dfx 使用后端的 ABI 自动生成前端的 JavaScript 样板代码。生成的样板代码在底层使用了一个名为 [agent-js](https://github.com/dfinity/agent-js/tree/main) 的库对 Candid 值进行编码,并从浏览器向后端容器发出 HTTP 请求。您可以认为 agent-js 类似于以太坊中的 web3.js。

[Wasm 标准](https://webassembly.org/)仅定义了 Wasm 虚拟机的指令和内存。至于 Wasm 程序如何与其他程序和用户交互则由托管虚拟机的宿主决定。ICP 作为 Wasm 的宿主,提供了一组函数供 Wasm 代码读取传入的参数、调用系统和其他智能合约、并返回结果,这些函数统称为**系统 API** 。开发者不应直接使用系统 API,因为过于底层且容易出错。相反,开发人员应使用特定语言的容器开发包 (CDK),这些库是对系统 API 的高级封装。

## 部署智能合约 {#deploying-smart-contracts}

开发者可以在本地测试网络或 ICP 主网上部署智能合约。本地测试网络内置于 dfx 中,可以通过 `dfx start` 命令运行。本地测试网络由单个节点(即本地计算机)组成。请注意,截至目前 ICP 没有官方的公共测试网络。

开发者需要 ICP 代币或 cycles 以在 ICP 主网上部署智能合约。使用 ICP 代币时,dfx 会自动将所需数量的代币转换为 cycles,这是因为所有与智能合约相关的操作都需要使用 cycles 进行支付。有关如何获取 cycles 的更多信息,请参阅[此指南](https://ic123.xyz/docs/getting-started/get-cycles/)

部署智能合约的命令是 `dfx deploy`,它会自动将源代码构建为 Wasm 二进制文件、并将其部署到目标网络。默认情况下该命令会针对本地测试网络,通过传递额外的 `–-network ic` 参数,可以指示该命令使用主网进行部署。这里无需指定要连接的节点的 URL,因为 dfx 已经预先配置了主网边界(RPC)节点的 URLs,但是您可以通过编辑 dfx 配置文件来更改 URL。

更多关于 dfx 开发相关的命令请参考[该指南](https://ic123.xyz/docs/getting-started/use-dfx/#development)

## 调用智能合约 {#calling-smart-contracts}

通常调用后端智能合约的方法有三种:

- 使用浏览器加载托管在前端智能合约中的网页,并使用网页的用户界面与后端智能合约进行交互。
在底层,用户界面使用 JavaScript 和 agent-js 向后端智能合约发送消息。这是普通用户与智能合约交互的标准方式。

- 使用 `dfx canister call` 命令,并将输入参数作为命令行参数传递。
在底层,dfx 使用名为 `ic-agent` 的 Rust 库向智能合约发送消息。

- 编写一个链下程序,并使用[代理库](https://internetcomputer.org/docs/current/developer-docs/developer-tools/off-chain/agents/overview)向后端智能合约发送消息。

![img](./img/developer-call.png)

<TeamContact />
2 changes: 2 additions & 0 deletions docusaurus/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ const sidebars = {
newbieSidebar: [
"getting-started/hello-world/index",
"getting-started/icp-overview/index",
"getting-started/dev-workflow/index",
"getting-started/install-dfx/index",
"getting-started/dev-account/index",
"getting-started/get-cycles/index",
"getting-started/ic-glossary/index",
"getting-started/use-dfx/index",
Expand Down

0 comments on commit b76001b

Please sign in to comment.