はじめてのビットコイン Dapp をデプロイする
このチュートリアルでは、ビットコインを送受信する Canister を Internet Computer にデプロイする方法を説明します。
ここでは、Internet Computer の ECDSA API と ビットコイン API を内部的に活用している examples リポジトリ の "Basic Bitcoin" の例を参考にします。
デプロイ
examples
リポをクローンします。git clone https://github.com/dfinity/examples
好きな言語の
basic_bitcoin
サンプルに移動します。# Motoko の場合
cd examples/motoko/basic_bitcoin
# Rust の場合
cd examples/rust/basic_bitcoingit サブモジュールを初期化します。
git submodule update --init --recursive
Internet Computer にサンプルをデプロイします。Canister を
variant { Testnet }
で初期化し、Canister が ビットコインのテストネットに接続できるようにします。dfx deploy --network=ic basic_bitcoin --argument '(variant { Testnet })'
tipInternet Computer にデプロイするには
Cycles
が必要です。Cycles については ここ で詳しく説明されています。また、Cycles フォーセット から無料の Cycle を入手することもできます。成功すると、次のような出力が表示されます。
Deploying: basic_bitcoin
Building canisters...
...
Deployed canisters.
URLs:
Candid:
basic_bitcoin: https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.ic0.app/?id=<YOUR-CANISTER-ID>Canister が稼動し、使用できるようになりました!コマンドライン、または上のアウトプットのリンク先である Candid UI を使用して、Canister と対話することができます。
ビットコインアドレスを生成する
ビットコインには様々なタイプのアドレスがあります(例:P2PKH、P2SH)。 これらのアドレスのうちほとんどは、ECDSA 公開鍵から生成することができます。 サンプルコードでは、ecdsa_public_key API を使用して P2PKH アドレスを生成する方法を紹介します。
Canister の Candid UI で、get_p2pkh_address
の下にある "Call" ボタンをクリックすると P2PKH のビットコインアドレスが生成されます。
あるいは、コマンドラインで実行する場合は以下になります。
dfx canister --network=ic call basic_bitcoin get_p2pkh_address
Canister が取得する ECDSA 公開鍵はユニークなものであるため、実際に表示されるビットコインアドレスは上記の画像のものとは異なります。
ここではビットコインのテストネットのアドレスを生成しており、テストネット上でのみ送受信が可能です。
ビットコインの受け取り
Canister がデプロイされ、ビットコインアドレスが得られたので、いよいよテストネットのビットコインを受け取ります。 こちら などのビットコインフォーセット(蛇口)からビットコインを受け取ることができます。
アドレスを入力し、"Send testnet bitcoins" をクリックしてください。 以下の例では、Canister は 0.0001 テスト BTC を受け取ることになります。
トランザクションが少なくとも 1 回承認されると(数分かかります)、Canister の残高で確認することができます。
ビットコインの残高を確認する
ビットコインアドレスの残高は、Canister の get_balance
エンドポイントを使って確認することができます。
Candid UI に Canister のアドレスを貼り付けて、"Call" をクリックしてください。
または、コマンドラインで以下のようにコールしてください。
dfx canister --network=ic call basic_bitcoin get_balance '("mheyfRsAQ1XrjtzjfU1cCH2B6G1KmNarNL")'
ビットコインアドレスの残高確認は、bitcoin_get_balance API を使用しています。
ビットコインを送る
Canister の send
エンドポイントを使用して ビットコインを送信することができます。
Candid UI で、送信先アドレスと送信金額を追加します。 以下の例では、4,321 Satoshi (0.00004321 BTC) をテストネットのフォーセットに送り返します。
コマンドラインでは以下のようになります。
dfx canister --network=ic call basic_bitcoin send '(record { destination_address = "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt"; amount_in_satoshi = 4321; })'
send
エンドポイントでは、以下の手順で ビットコインが送信されます。
- bitcoin_get_current_fee_percentiles API を使用して、ビットコインネットワーク上の直近の手数料のパーセンタイルを取得する。
- bitcoin_get_utxos API を使用して、アドレスの未使用のトランザクション出力(UTXO)を取得する。
- ステップ 2 の UTXO の一部を入力とし、送信先アドレスと送信金額を出力として、トランザクションを構築する。 ステップ 1 で得られた手数料のパーセンタイルを用いて、適切な手数料を設定する。
- sign_with_ecdsa API を使用してトランザクションの入力に署名する。
- bitcoin_send_transaction API を使用して、署名されたトランザクションをビットコインネットワークに送信する。
send
エンドポイントはネットワークに送信したトランザクションの ID を返します。
ブロックエクスプローラーを使って、このトランザクションの状態を追跡することができます。
トランザクションがに少なくとも 1 回承認されると、現在の残高に反映されているのが確認できるはずです。