
【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がでてきて面くらいますが、
この記事が参考になれば幸いです。
では。