Internet Computerの基礎 — パート1:principal と identity(日本語訳)
Medium の DFINITY 公式の記事 Internet Computer Basics — Part 1: Principals and Identities (2022/4/26)の日本語訳です。
開発者が Internet Computer とやりとりを始め、簡単なアプリケーションを構築するために知っておくべき必須の概念です。
この記事では、Internet Computer にデプロイされたアプリを管理するための「principal」と「identity」の定義から、Internet Computer の基礎シリーズを始めます。
このシリーズについて
このシリーズでは、開発者が Internet Computer とやりとりを始め、簡単なアプリを構築するために知っておくべき必須の概念を説明します。
ウェブアプリケーションを構築した経験があり、少なくとも1つのプログラミング言語を知っていて、コマンドラインを通じてコンピュータとやりとりすることに慣れている人であれば、例はより理解しやすいでしょう。
第1回目の記事では、Internet Computer へデプロイされたアプリを管理するための principal と identity のコンセプトに慣れることから始めます。
Internet Computer とは?
Internet Computer は、AWS のようなクラウドプロバイダーの機能と、Ethereum または Solana のような分散型ブロックチェーンを組み合わせた、インターネットアプリを構築するための新しいプラットフォームです。Internet Computer は、3つのユースケースにマッチしています。
- ウェブ/モバイルアプリの透明性、耐障害性、検閲耐性を高めます。
- トークン、NFT、DeFi のようなブロックチェーンアプリを、Ethereum のようなブロックチェーンより数百倍または数千倍の速度で、そしてより安く、Webスピードで実行できるように高速化します。
- 両タイプのアプリを1つのパッケージにまとめることで、開発者は次世代 NFT やオープンガバナンスのような新しいタイプのサービスを提供できるようになります。
実装レベルでは、Internet Computer は、アプリケーションのコードを実行し、データを保存する、世界中に分散したデータセンター(ノード)のネットワークです。Internet Computer はプロトコルであり、ノードのネットワークはオープンなので、誰でも参加して計算能力を提供し、その見返りとしてガス料金を得ることができます。
Internet Computer のアプリは、キャニスタースマートコントラクト と呼ばれる単純な構成要素から構成されています。キャニスターは、オブジェクト指向プログラミングのオブジェクトに似たものだと考えることができます。キャニスターはコードとデータの両方を兼ね備え、ユーザー、ネットワークサービス、その他のキャニスターなど、外部の世界と通信できます。
“principal” とは何ですか?
principal とは、コンピュータシステムとやりとりすることができ、この目的のために識別される誰かです。Internet Computer には、2種類の principal があります。
- キャニスターをデプロイしたり、ICP トークンをアカウント間で移動させたり、キャニスターのメソッドを呼び出したりすることで、Internet Computer とやりとりすることができるユーザー
- プログラム的に同じアクションを行うことができるキャニスター
ほとんどの場合、principal について話すとき、実際には “principal id” を意味します。“principal id” とは、principal に割り当てられる一意の識別子であり、例えば、ユーザーまたはキャニスターがアクセスできるリソースを特定するために使用されます。Internet Computer のドキュメントとツールでは、“principal” と “principal id” を同じ意味で使います。以下は、principal id のテキスト表現の例です。
% dfx identity get-principal
nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
principal は、SSH 公開鍵と似ています。例えば、あなたは GitHub に SSH 公開鍵を追加することでプライベートリポジトリにアクセスできるようになります。同様に、今後やりとりする予定のサービスに principal を追加する必要があります。principal は(SSH 公開鍵のように)秘密ではないので、必要なときに誰とでも共有できます。
principal とSSH 公開鍵の代表的な特性は下記です。
- 秘密ではありません
- アクセスするサービスに登録する必要があります
- 認証には別途秘密鍵が必要です(心配しないでください。すでに自動的に作成されています!)
なぜ principal が必要なのか?
以下の機能を実行するには、開発者としてあなたは Internet Computer に自分自身を識別させる principal が必要です。
- キャニスターのデプロイ(Dapps またはスマートコントラクトのデプロイと同じ)。
- 例えば、キャニスターメソッドを呼び出すことで、すでにデプロイされているキャニスターとやりとりする。
- キャニスターの管理、例えば、停止、パラメータの変更、ホスティングの支払い管理(サイクルウォレットについては、後述の記事を参照)
キャニスターは principal を使用して、各操作が許可されたユーザによってのみ実行されることを保証します。例えば、アップデートしたコードでキャニスターを再デプロイしたり、キャニスターの支払残高を別のウォレットに移動するには、ユーザが特定の principal であることを識別する必要があります。
principal は、Internet Identity の裏側で、様々なユーザー向けの Dapps にあなたを識別させるためにも使われます。しかし、この場合、あなたが自分の principal を直接目にすることはほとんどありません。
現在の principal を取得するには?
IC Dapps の開発では、ほとんどの場合、principal を使用することになります。あなたの開発マシンで、コンソールにこのコマンドを入力することで現在の principal を取得できます。
% dfx identity get-principal
nfxu4-cn7qt-x7r3c-5dhnk-dcrct-gmgoz-67gcg-5glvc-2krhv-gcmsr-qqe
あなたの principal を確認するには、dfx
コマンドをインストールし、実行する必要があることに注意してください。
“identity” とは何か?
ユーザー principal は非対称暗号鍵ペアの公開鍵のテキスト表現であるため、各 principal には関連する秘密鍵があります。どちらの鍵も、”identity” と呼ばれるオブジェクトとして保存されます。あなたのマシンには複数の identity をインストールすることができ、各 identity には名前がついています。
名前は似ていますが、identity は、Internet Identity サービスを介して作成された web identityとは異なります。
identity はユーザーディレクトリの ~/.config/dfx/identity/<identity_name>/identity.pem
というパスに保存されます。コマンドラインアプリは .pem ファイルを使用して、サービスに対するあなたの identity を確認します。このプロセスは、SSH サーバーにアクセスするのと似ていて、あなたの identity を証明するには SSH 秘密鍵が必要であり、あらかじめ公開鍵を追加しておいたサーバーにアクセスできます。
identity ファイルを紛失した場合(例えばパソコンを紛失)、この principal であることを識別できなくなります。
identity の .pem
ファイルは非常に機密性の高いファイルです。決して他の人と共有しないでください。
デフォルトでは、新しいマシンで初めて dfx
を実行すると、新しい identity が作成されます。この identity は “デフォルト identity” と呼ばれ、手動で別の identity を選択しない限り、デフォルトですべての IC のやり取りで使用されます。
また、SSH キーをコピーするように、identity を作成した古いパソコンからコピーすることも可能です。
複数の identity を管理するには?
同じマシンに複数の identity をインストールできます。新しい identity を作成するには、 dfx identity new <identity_name>
を実行します。例えば、この以下のコマンドを実行すると、新しい identity 名 “new_identity” が作成されます。
% dfx identity new new_identity
Creating identity: "new_identity".
Created identity: "new_identity".
identity を切り替えるには、dfx identity use <identity_name>
を使用します。
% dfx identity use new_identity
Using identity: "new_identity".
今どの principal が使われているかを知るには、dfx identity whoami
を使います。
% dfx identity whoami
new_identity
すべての identity のリストを取得するには、dfx identity list
コマンドを使用します。
% dfx identity list
anonymous
default
new_identity *
マシン間で identity をコピーする方法は?
前に述べたように、マシン間で identity をコピーすることで、サービスに複数の principal を登録するのを避けることができます。このプロセスは、コンピュータ間で SSH キーをコピーするのと似ています。
開始するには、identity の .pem
ファイルを作成した元のコンピュータからコピーする必要があります。各 identity の .pem
ファイルは ~/.config/dfx/identity/<identity_name>/identity.pem
に保存されています。
例えば、古いコンピュータのidentity.pem
ファイルを新しいマシンの~/import/identity.pem
にコピーしたとしましょう。そして、このコマンドを実行してこのファイルをインポートすれば、このコンピュータの identity の 1 つとして認識されるようになります。
% dfx identity import old_identity ~/import/identity.pem
Creating identity: "old_identity".
Created identity: "old_identity".
そして、インポートした identity を呼び出すことでアクティベートできます。
% dfx identity use old_identity
Using identity: "old_identity".
principal をキャニスターコントローラーに設定するには?
キャニスターをデプロイする際、あなたの現在の principal がキャニスターコントローラとして設定されていることを確認する必要があります。コントローラとは、キャニスターを管理できる principal のことであり、例えば下記です。
- キャニスターのデプロイとアップデート
- キャニスターのウォレットのサイクルを制御(計算とデータストレージの支払い)
あるキャニスターの 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
いずれかの identity をコントローラとして設定するには、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 は、キャニスターとユーザーを識別する公開鍵のテキスト表現です。各 principal は、identity、公開鍵(principal)のペアと秘密鍵の一部です。
identity は、あなたのマシンの ~/.config/dfx/identity
フォルダに保存されます。
identity を管理するために、知る必要のあるコマンドはいくつかあります。下記です。
dfx identity import
-マシン間で identity をコピーし、インポートdfx identity new
-新しい identity を作成dfx identity use
- identity の切り替えdfx identity whoami
- 現在どの identity が使用されているのかを確認
このシリーズの次の記事では、サイクルウォレットと、ICP でキャニスターをホスティングするための支払い方法について説明します。
____
smartcontracts.org で構築を開始し、forum.dfinity.org で開発者コミュニティに参加しましょう。