互联网计算机开发基础概念之 principal 和 identity

Internet Computer 开发基础概念之principal 和 identity

principalidentity 是 Dfinity 开发人员在开始与 Internet Computer 交互和构建去中心化应用程序时需要了解的基本概念。

本文以 principalidentity (互联网身份) 的定义启动 Internet Computer 基础系列,以管理部署在 Internet Computer 上的应用程序。本文将描述开发人员在开始与 Internet Computer交互和构建简单应用程序时需要了解的基本概念。

什么是 Internet Computer?

Internet Computer 是一个用于构建互联网应用程序的新平台,它结合了 AWS 等云提供商的功能与 Ethereum 或 Solana 等分布式区块链的功能。Internet Computer 非常适合三个场景:

  • 使 WEB或者移动应用程序更加透明、弹性和审查证明
  • 加速代币、NFT、DeFi 等区块链应用程序以网络速度运行,比以太坊等区块链快数百或数千倍且成本更低
  • 将这两种类型的应用程序组合到一个包中,使开发人员能够提供新型服务,如下一代 NFT 和开放治理

在实施层面, Internet Computer 是一个遍布全球的分布式数据中心(节点)网络,运行应用程序代码并存储数据。 Internet Computer 是一种协议,意味着节点的网络是开放的,因此任何人都可以加入以提供计算能力并赚取 Gas 费作为回报。

Internet Computer 应用程序由称为罐式(canister)智能合约的简单构建块组成。可以将容器视为类似于面向对象编程中的对象的,容器结合了代码和数据,可以与外部世界进行通信:用户、网络服务和其他容器。

什么是主体 principal

主体 principal 是可以与计算机系统交互并可以为此目的而被识别的身份, Internet Computer有两种类型的主体:

  • 用户:可以通过部署容器(canisters)、将 ICP 令牌从一个帐户转移到另一个帐户或调用容器(canisters)方法来与 Internet Computer 交互
  • 容器 canisters :可以以编程方式执行同一组操作的容器

通常情况下在谈论主体 principal 时,真正的意思是 principal id ,这是分配给主体 principal的唯一标识符,可用于例如指定用户或容器(canisters)可以访问的资源。在 Internet Computer 文档和工具中,将交替使用 principalprincipal id ,以下是 principal id 的文本表示示例:

dfx identity get-principal
nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe

主体 principal 类似于 SSH 的公钥,例如,将 SSH 的公钥添加到 GitHub 以便能够访问私有存储库。同样,需要将委托人注册到计划在未来与之交互的服务中。主体 principal (如 SSH 的公钥)不是机密的,可以在需要时与任何人共享它们。

principal 和 SSH 公钥的共性:

  • 不是秘密,可以公开
  • 需要注册需要访问的服务
  • 需要一个额外的密钥来进行身份验证

为什么需要主体 principal

作为开发人员,需要一个主体 principal 来向 Internet Computer 表明自己的身份,以执行以下功能:

  • 部署容器 canister (与部署 dapp 或智能合约相同)
  • 与已部署的容器 canister 交互,例如,通过调用容器方法。
  • 管理容器 canister,例如,停止或更改参数,并管理托管付款

容器canister使用主体 principal 来确保每个操作仅由授权用户执行。例如,用户需要将自己标识为特定委托人,以便能够使用更新的代码重新部署容器canister 或将容器 canister 余额转账到另一个钱包。

identity (互联网身份)在幕后也使用主体 principal 来向各种面向用户的 dapp 进行识别。但是,在这种情况下,很少会直接看到委托人。

如何获取当前主体 principal

大多数时候,将在 IC dapp 开发过程中与委托人互动。在开发机器上,可以通过在控制台中输入以下命令来获取当前主体 principal

dfx identity get-principal

将可以看到 principal id

tpxoo-urhj2-ypwlz-t7hjm-dtjyi-xbfna-kchfn-kyibd-hke4e-dkzym-gqe

什么是互联网身份 identity

由于用户主体 principal 是非对称加密密钥对的公钥的文本表示,因此每个主体 principal 都有一个关联的私钥。这两个密钥都存储为一个称为 identity (互联网身份)的对象,可以在机器上安装多个 identity (互联网身份),并且每个 identity (互联网身份)都可以有一个名称。

虽然名称相似,但像 identity (互联网身份)这样的命令与通过 identity (互联网身份)服务创建的 Web 身份不同。

identity (互联网身份)存储在 ~/.config/dfx/identity/<identity_name>/identity.pem 路径的用户目录中,命令行应用程序将使用该 .pem 文件向服务确认身份。此过程类似于访问 SSH 服务器,需要 SSH 私有密钥来证明身份并访问之前添加公钥的服务器。

如果丢失了身份 identity (互联网身份)文件(例如,丢失了计算机),将无法再将自己标识为该主体。identity (互联网身份) .pem 文件是高度机密的,永远不应该与任何人分享它们。

默认情况下,当 dfx 第一次在新机器上运行时会创建一个新身份。此身份称为“默认身份”,默认情况下将用于所有 IC 交互,除非手动选择其他身份。

如何将主体设置为容器控制器

部署容器 canister 时,需要确保将当前主体设置为容器 canister控制器。控制器是可以管理容器 canister的主体 principal ,例如:

  • 部署和更新容器 canister
  • 容器钱包中的 cycles 控制(用于支付计算和数据存储费用)

要显示其中一个容器 canister 的主体 principal ,可以运行 dfx canister status <canister_name>,如下:

dfx canister status hello

显示如下:

Canister status call result for hello.
Status: Running
Controllers: nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(363948)
Balance: 4_000_000_000_000 Cycles
Module hash: 0xfa16da03d37cffe89382b29db2077de1229841ea31b91b8c040b740317390cb7

要将其中一个身份设置为控制器,可以使用 dfx canister update-settings <canister_name> --controller <identity_name_or_principal_id>,如下:

dfx canister update-settings hello --controller old_identity

结果如下:

Set controller of "hello" to: old_identity

总结

主体 principal 是标识容器 canister 和用户的公钥的文本表示。每个委托人都是身份的一部分,一对公钥(委托人)和一个秘密密钥。身份信息存储在机器上的~/.config/dfx/identity 文件夹中。

管理身份需要了解指令:

  • dfx identity import 在机器之间复制身份并导入它们
  • dfx identity new 创造一个新的身份
  • dfx identity use 切换身份
  • dfx identity whoami 检查当前使用的身份