【Internet Computer】キャニスターまわりのIDと権限まとめ

Internet Computerでサンプルはローカル環境であろうと、ブロックチェーン上であろうと、
コマンドを実行していくだけで簡単に動かすことができます。

ただ、その過程でいろいろなIDやインスタンスがでてきます。

  • キャニスターとプリンシパルIDはどのような関係?
  • キャニスターとウォレットの関係は?
  • ウォレットの管理は?
  • アカウントIDって?

helloサンプルを動かし終わった方向けに、Internet Computerで開発するときに出てくる
プリンシパルIDやキャニスターの関係を整理しました。

まだ、ローカル環境で動かしたことがない方はこちらを参考ください。

 キャニスターとプリンシパルIDの関係

ローカル環境を構築した時にキャニスターとプリンシパル ID の関係はこのようなイメージです。

プリンシパル ID はウォレットの管理者であり、ウォレットはhelloキャニスターとhello_assetsキャニスターの管理者です。

実際に確認していきましょう。

自分のプリンシパルIDの確認

プリンシパルIDはInternet Computer上で一意に識別されるIDであり、
ユーザーIDまたは、開発者IDのようなものです。


例:tt7um-utkfc-3u7le-llkrl-xpodv-vujry-h4mjk-qiwmn-z2exz-km4cv-dae

ローカルでもブロックチェーン上でも同じIDが使われます。

ちなみにプリンシパルIDの秘密鍵はここにあります。

[dfxインストールディレクトリ]/.config/dfx/identity/default/identity.pem

ICの世界ではコントローラー=管理者

Internet Computerの世界では管理者はコントローラーと呼ばれます。

これから紹介するコマンドの内容にもコントローラーが含まれます。

キャニスターのコントローラーはウォレットキャニスター

プリンシパルIDがユーザーID・開発者IDなら、開発対象のhelloキャニスターとhello_assets キャニスターのコントローラーもプリンシパルIDになりそうなものですが、実際は違います。

ウォレットキャニスターがコントローラーになります。
ウォレットキャニスターは管理キャニスターとも言えるでしょう。

では、実際のコントローラーがウォレットになっているかを確認してみます。

ローカル環境の起動

ローカル実行環境を起動させます。
helloプロジェクトのdfx.jsonがあるディレクトリで


helloキャニスターの情報を確認

実行環境が起動したらキャニスターの情報を取得します。


「dfx canister status」で以下のような出力結果が得られます。

Canister status call result for hello.
Status: Running
Controllers: rwlgt-iiaaa-aaaaa-aaaaa-cai
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(367107)
Balance: 4_000_000_000_000 Cycles
Module hash: 0x17440789a822dffab93e7ea324682920ac34013a73d6bcae843a32c22de4dd55

お手元では、似たようなIDが出力されていると思います。

この出力例では「 Controllers: rwlgt-iiaaa-aaaaa-aaaaa-cai 」とあるので
「rwlgt-iiaaa-aaaaa-aaaaa-cai」 がhelloキャニスターのコントローラーですね。

hello_assetsキャニスターの情報を確認

つぎに、hello_assetsもみてみます。


Canister status call result for hello_assets.
Status: Running
Controllers: rwlgt-iiaaa-aaaaa-aaaaa-cai
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(4258516)
Balance: 4_000_000_000_000 Cycles
Module hash: 0xe0df779f65fe44893d8991bef0f9af442bff019b79ec756eface2b58beec236f

helloと同じくhello_assetsもコントローラーは同じIDになっているはずです。

ウォレットキャニスターの確認

冒頭のイメージでも紹介しましたが、helloキャニスターとhello_assetsキャニスターのコントローラーに設定されているのはウォレットキャニスターです。
そこで、コントローラーに指定されているIDがウォレットであることをコマンドで確認しましょう。


helloとhello_assetsのコントローラーと同じIDが確認できたのではないでしょうか。
つまり、helloとhello_assetsのコントローラー(管理者)はウォレットキャニスターだったことが確認できました。

ウォレットキャニスターのコントローラーはプリンシパルID

続いてウォレットキャニスターのコントローラーを確認していきましょう。


ポイントは–no-walletを付与すること。

Canister status call result for rwlgt-iiaaa-aaaaa-aaaaa-cai.
Status: Running
Controllers: tt7um-utkfc-3u7le-llkrl-xpodv-vujry-h4mjk-qiwmn-z2exz-km4cv-dae
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(5257479)
Balance: 92_000_000_000_000 Cycles
Module hash: 0x9183a38dd2eb1a4295f360990f87e67aa006f225910ab14880748e091248e086

「Controllers」の形式が変わりましたね。
ウォレットのキャニスターコントローラーはプリンシパルIDであることが確認できます。

プリンシパルIDとウォレットIDはセットで使う

プリンシパルIDはウォレットキャニスターのコントローラーであるため、親子関係ではあるものの
実際のところInternet ComputerではプリンシパルIDとウォレットIDはセットで使います。

dfx コマンドを使用するときは、「あるコマンドの時はプリンシパル ID で、また別のコマンドの時はウォレット ID」 と内部で切り替えています。

  • プリンシパル ID とウォレット ID を切り替えて使うコマンド例
  • プリンシパルIDとウォレット ID が使い分けられている理由

プリンシパル ID とウォレット ID を切り替えて使うコマンド dfx canister

キャニスターを管理するための「dfx canister コマンド」はプリンシパルIDで実行する方法と、
ウォレットキャニスターで実行する方法が用意されています。

先ほどでてきた「–no-wallet」がポイントでした。

  • デフォルト:ウォレットキャニスターIDで実行される
  • –no-wallet:プリンシパルIDで実行される

実行されているIDを確認してみよう

キャニスター情報へのアクセスは、コントローラーでないIDではアクセスが拒否されます。

これを利用してhelloキャニスターへプリンシパルIDで、
ウォレットキャニスターにウォレットキャニスターIDで問い合わせてみましょう。

プリンシパルID→hello

The replica returned an HTTP Error: Http Error: status 403 Forbidden, content type "", content: Requested canister rejected the message

helloへのプリンシパルIDでのアクセスは拒否されました。
helloキャニスターの管理者はウォレットキャニスターだからです。

ウォレットキャニスターID→ウォレットキャニスター

続いて、ウォレットキャニスターにウォレットキャニスターIDでアクセスします。
さきほどウォレットキャニスターの状態を確認するのに使ったコマンドの–no-walletを外して実行すればOK。


The invocation to the wallet call forward method failed with the error: An error happened during the call: 5: Only the controllers of the canister rwlgt-iiaaa-aaaaa-aaaaa-cai can control it.
Canister's controllers: tt7um-utkfc-3u7le-llkrl-xpodv-vujry-h4mjk-qiwmn-z2exz-km4cv-dae
Sender's ID: rwlgt-iiaaa-aaaaa-aaaaa-cai

こちらも予定通り失敗しました。

Canister’s controllers: 「プリンシパルID」で管理者であるIDを教えてくれます。

注目すべきは最後のSender’s ID: [ウォレットキャニスターID]の部分。
ウォレットキャニスターIDで問い合わせていることがわかります。

こちらのエラーメッセージだと自分が使っているIDが確認できてわかりやすいですね。

プリンシパルIDとウォレット ID が使い分けられている理由

なぜ、ウォレットキャニスターのコントローラーはプリンシパルIDで、
開発しているキャニスターhelo,hello_assetsのコントローラーはウォレットキャニスターIDが使われているのでしょうか。

IDで分けれ使われている理由のひとつは、プリンシパルIDではサイクル・トークンを保持できないためです。

サイクルはキャニスターを動かすための燃料のようなトークンです。

サイクルはプリペイド式で先にキャニスターにチャージしておくことになるので、
サイクルを保持する仕組みを、どんなキャニスターでももってます。

しかし、プリンシパルIDを利用するのにサイクルはいらないためか、サイクルを保存できません。

そこでサイクルウォレットキャニスターの出番。

プリンシパルIDにサイクルウォレットキャニスターを紐づけることでサイクルを管理する機能を補完しているのです。

ウォレットキャニスターのウォレット「機能」の管理者

ウォレット機能をここで掘り下げます。

ここまでで、ウォレットキャニスターのコントローラーはプリンシパルIDになっていることを説明しました。

ですが、それとは別にウォレットキャニスターのウォレット「機能」にもコントローラー(管理者)が存在します。

コントローラーとカストディアン

ウォレット機能を管理するのは二つの管理権限、
カストディアンとコントローラーがあります。

コントローラー

コントローラーは管理者で、特権をもっているIDです。

キャニスターときと同じです。

コントローラーに属するIDは次の操作が行えます。

  • ウォレット情報の表示
  • サイクルの送受信
  • キャニスターの作成
  • コントローラー権限の管理
  • カストディアン権限の管理
  • ウォレットの名称変更

カストディアン(custodians)

こちらも管理者という意味ではあるのですけれども、金融の世界では「預かって、あるいは代理で管理する人・会社」とういうニュアンスかなと。

要するに、コントローラーに代わってサイクルを管理できる権限です。

カストディアンは代理ゆえか権限は弱めです。

  • ウォレット情報の表示
  • サイクルの送受信
  • キャニスター作成

コントローラーの混同に注意

ウォレットの機能のコントローラーに追加したからと言って、
ウォレットキャニスターのコントローラーにはなりません。

また逆も然り。

間違えるといつまでも、権限が付与されません。

ウォレットキャニスターだけで起きる勘違いなので注意したいところです。

アカウントIDは口座IDの意味

最後に、アカウントIDを紹介します。

ローカル環境を構築する上では登場しないIDなのですけども、ブロックチェーン上にプログラムをアップするときに使うIDです。

アカウントと言われるとユーザーアカウントを思い浮かべる人も多いのではないでしょうか。私もそのうちの一人です。

ただ、internet computerで開発をしているときアカウントIDと言われるときは注意。

というのもアカウントIDは「ICPの口座ID」を指すからです。

アカウントIDの確認方法

プリンシパルIDにつき一つ以上のアカウントIDがあります。

なお、アカウントIDの確認は次のコマンドでできます。


例:2dea4d1c79af7c548ec683892602d6cab939e0e604547e4d9a18ad8eceb2a3a6

キャニスターIDやプリンシパルIDとはまた異なるフォーマットで出力されるのでわかりやすいですね。

サイクルを持っていないときはICPからチャージ

ローカル開発でキャニスターを動かしているときは、アカウントIDは使いません。

ローカル環境では使えるサイクルが事前に作られるためです。

ブロックチェーン上にプログラムを上げるときにはサイクルが必要になります。

サイクルがない場合はICPをつかってサイクルトークンをチャージしキャニスターを作成します。
このときアカウントIDが利用されます。

まとめ

まとめです。

  • キャニスターの管理者はウォレットキャニスター
  • ウォレットキャニスターの管理者はプリンシパルID
  • プリンシパルIDとウォレットキャニスターはセットで使う
  • ウォレット機能の管理者はコントローラーとカストディアンがある
  • アカウントIDはICP口座IDのこと

サンプルであるhelloプロジェクトを動かすとたくさんのIDがでてきて面くらいますが、
この記事が参考になれば幸いです。

では。