Skip to main content

台帳のローカルセットアップ

ローカル開発環境、パブリックの Internet Computer ではなくローカルのレプリカで作業している場合、ICP 台帳にアクセスすることはできません。ICP 台帳と統合するアプリケーションをローカルでテストするには、ローカル台帳 Canister をデプロイする必要があります。ただし、このローカル台帳 Canister には、ライブの ICP 台帳の履歴と残高がありません。 以下の手順に従って、台帳 Canister のコピーをローカル・レプリカにデプロイしてください。

  1. ビルド済みの台帳 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.did
    note

    IC_VERSION 変数は、http://github.com/dfinity/ic リポジトリからのコミットハッシュです。

  2. DFX の最新版を使用していることを確認してください。DFX がインストールされていない場合は、SDK のインストール の手順に従ってインストールを行ってください。

  3. DFX プロジェクトがまだない場合は、以下の手順で新規に DFX プロジェクトを作成してください:dfx-new

  4. 最初のステップで取得したファイル(ledger.wasm, ledger.private.did, ledger.public.did )を、プロジェクトのルートにコピーしてください。

  5. プロジェクトの dfx.json ファイルに、以下の Canister 定義を追加します:

    {
    "canisters": {
    "ledger": {
    "type": "custom",
    "wasm": "ledger.wasm",
    "candid": "ledger.private.did"
    }
    }
    }
  6. レプリカが System サブネットで動作するように設定します。dfx.json を修正し、インクルードします:

    {
    "defaults":{
    "replica": {
    "subnet_type":"system"
    }
    }
    }
  7. ローカルレプリカを開始します。

    dfx start --background
  8. ミントする機能のある新しいアカウントとして Identity を作成します:

    dfx identity new minter
    dfx identity use minter
    export MINT_ACC=$(dfx ledger account-id)

    ミントするアカウントから振り込むと、Mint というトランザクションが作成されます。ミントのアカウントに送金すると、Burn というトランザクションが作成されます。

  9. デフォルトの Identity に切り替え、台帳のアカウント識別子を記録します。

    dfx identity use default
    export LEDGER_ACC=$(dfx ledger account-id)
  10. 台帳 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_thresholdnum_blocks_to_archive オプションを低い値 (たとえば 10 と 5) に設定して、数ブロック後にアーカイブを起動するようにするとよいでしょう。

  11. dfx.jsonファイルのCanisterの定義を更新して、public Candid インターフェイスを使用するようにします:

     {
    "canisters": {
    "ledger": {
    "type": "custom",
    "wasm": "ledger.wasm",
    - "candid": "ledger.private.did"
    + "candid": "ledger.public.did"
    }
    }
    }
  12. 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"
    }
    }
    }
  13. 台帳 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 をデプロイすることができます。