互联网计算机开发基础概念之 principal 和 identity
principal
和identity
是 Dfinity 开发人员在开始与 Internet Computer 交互和构建去中心化应用程序时需要了解的基本概念。
本文以 principal
和 identity
(互联网身份) 的定义启动 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
文档和工具中,将交替使用 principal
和 principal 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
检查当前使用的身份