台帳のローカルセットアップ
ローカル開発環境、パブリックの Internet Computer ではなくローカルのレプリカで作業している場合、ICP 台帳にアクセスすることはできません。ICP 台帳と統合するアプリケーションをローカルでテストするには、ローカル台帳 Canister をデプロイする必要があります。ただし、このローカル台帳 Canister には、ライブの ICP 台帳の履歴と残高がありません。 以下の手順に従って、台帳 Canister のコピーをローカル・レプリカにデプロイしてください。
ビルド済みの台帳 Canister モジュールと Candid インターフェースファイルを入手します。
export IC_VERSION=dd3a710b03bd3ae10368a91b255571d012d1ec2f
curl -o ledger.wasm.gz https://download.dfinity.systems/ic/${IC_VERSION}/canisters/ledger-canister_notify-method.wasm.gz
gunzip ledger.wasm.gz
curl -o ledger.private.did https://raw.githubusercontent.com/dfinity/ic/${IC_VERSION}/rs/rosetta-api/ledger.did
curl -o ledger.public.did https://raw.githubusercontent.com/dfinity/ic/${IC_VERSION}/rs/rosetta-api/ledger_canister/ledger.didnoteIC_VERSION
変数は、http://github.com/dfinity/ic リポジトリからのコミットハッシュです。DFX の最新版を使用していることを確認してください。DFX がインストールされていない場合は、SDK のインストール の手順に従ってインストールを行ってください。
DFX プロジェクトがまだない場合は、以下の手順で新規に DFX プロジェクトを作成してください:dfx-new
最初のステップで取得したファイル(
ledger.wasm
,ledger.private.did
,ledger.public.did
)を、プロジェクトのルートにコピーしてください。プロジェクトの
dfx.json
ファイルに、以下の Canister 定義を追加します:{
"canisters": {
"ledger": {
"type": "custom",
"wasm": "ledger.wasm",
"candid": "ledger.private.did"
}
}
}レプリカが
System
サブネットで動作するように設定します。dfx.json
を修正し、インクルードします:{
"defaults":{
"replica": {
"subnet_type":"system"
}
}
}ローカルレプリカを開始します。
dfx start --background
ミントする機能のある新しいアカウントとして Identity を作成します:
dfx identity new minter
dfx identity use minter
export MINT_ACC=$(dfx ledger account-id)ミントするアカウントから振り込むと、
Mint
というトランザクションが作成されます。ミントのアカウントに送金すると、Burn
というトランザクションが作成されます。デフォルトの Identity に切り替え、台帳のアカウント識別子を記録します。
dfx identity use default
export LEDGER_ACC=$(dfx ledger account-id)台帳 Canister をネットワークにデプロイします。
dfx deploy ledger --argument '(record {minting_account = "'${MINT_ACC}'"; initial_values = vec { record { "'${LEDGER_ACC}'"; record { e8s=100_000_000_000 } }; }; send_whitelist = vec {}})'
プロダクト環境と同じように台帳をセットアップしたい場合は、アーカイブを有効にしてデプロイする必要があります。この設定では、台帳 Canister は古いブロックを保存するために新しい Canister を動的に作成します。ブロックを取得するためにインターフェイスを使用する場合は、このセットアップを使用することをお勧めします。
開発用に使用する Identity の Principal を取得します。このPrincipal は、アーカイブのコントローラーとなります。
dfx identity use default
export ARCHIVE_CONTROLLER=$(dfx identity get-principal)アーカイブオプションで台帳 Canister をデプロイします:
dfx deploy ledger --argument '(record {minting_account = "'${MINT_ACC}'"; initial_values = vec { record { "'${LEDGER_ACC}'"; record { e8s=100_000_000_000 } }; }; send_whitelist = vec {}; archive_options = opt record { trigger_threshold = 2000; num_blocks_to_archive = 1000; controller_id = principal "'${ARCHIVE_CONTROLLER}'" }})'
trigger_threshold
とnum_blocks_to_archive
オプションを低い値 (たとえば 10 と 5) に設定して、数ブロック後にアーカイブを起動するようにするとよいでしょう。dfx.json
ファイルのCanisterの定義を更新して、public Candid インターフェイスを使用するようにします:{
"canisters": {
"ledger": {
"type": "custom",
"wasm": "ledger.wasm",
- "candid": "ledger.private.did"
+ "candid": "ledger.public.did"
}
}
}dfx.json
ファイルの Canister 定義を更新して、台帳に remote id を指定します。これにより、プロジェクトを Internet Computer にデプロイすることになった場合に、dfx が自分の台帳をデプロイするのを防ぐことができます:"ledger": {
"type": "custom",
"candid": "ledger.public.did",
"wasm": "ledger.wasm",
"remote": {
"candid": "ledger.public.did",
"id": {
"ic": "ryjl3-tyaaa-aaaaa-aaaba-cai"
}
}
}台帳 Canister が健全であることを確認します。以下のコマンドを実行します:
dfx canister call ledger account_balance '(record { account = '$(python3 -c 'print("vec{" + ";".join([str(b) for b in bytes.fromhex("'$LEDGER_ACC'")]) + "}")')' })'
以下のような出力になるはずです:
(record { e8s = 100_000_000_000 : nat64 })
ローカルの ICP 台帳 Canister が起動しました。これで、台帳 Canister と通信する必要のある他の Canister をデプロイすることができます。