Web3時代の到来とともにブロックチェーンを用いたアプリケーション開発が盛んに行われるようになってきました。その一方で、ブロックチェーン上でどのように取引が実施されているのかを理解する事は容易ではありません。
今回は『ブロックチェーン実践入門: ビットコインからイーサリアム、DApp開発まで』こちらの内容に基づいて、プログラムコードを使用したウォレットアドレス作成とビットコインの送金方法について解説したいと思います。
はじめに
Web3時代ではブロックチェーン技術を用いた様々なサービスが誕生しています。暗号資産取引やNFTトレードがその例ですが、これらの取引で発生するトランザクションは全てブロックチェーン上に記録されるようになっており、データの改ざんやデータ消失のリスクが限りなく小さくなっています。
それでは各トランザクションはブロックチェーン上でどのように管理されるのでしょうか。ブロックチェーン上での取引を理解するために、簡単なプログラムコードを動かしながら説明していこうと思います。
今回はブロックチェーンネットワーク上で取引を行うための第一歩として、プログラムコードを使用して、ビットコインを自身のウォレットアドレスへ送金する方法を解説します。本記事を読むことで、仮想通貨取引所やMetamask(メタマスク)などでウォレットプロバイダがどのようにウォレットアドレスを作成しているか理解できるはずです。
実験のために本物のビットコインを扱うことはせずに、同じ条件で動作する開発用のTestnetのビットコインを使用します。また、プログラム言語はJavascriptを用いておりますが、丁寧に説明していきますので安心してください。何をしているのかを理解することが重要ですので、コードの詳細部分は読み進めていただいても大丈夫です。
本記事を読んでできるようになること
- BitcoinJSライブラリのセットアップ
- ビットコインを受け取るためのウォレットアドレスの作成
- ビットコインをテストネットからウォレットアドレスへ送金
開発環境の準備
ビットコインを取得する前にビットコインを受け取るためのお財布(ウォレット)を作成します。ウォレットにはブロックチェーン上の住所を示すアドレス(ウォレットアドレス)が付与されており、ビットコインのウォレットアドレスは30文字前後のランダムな文字列の並びとなっています。ビットコインを送金する際はこのウォレットアドレスを指定することになります。
ビットコインのウォレットアドレスの作成方法はいくつかありますが、今回はオープンソースのライブラリ「BitcoinJS」を利用し、プログラムによってウォレットアドレスを作成します。BitcoinJSはビットコイン向けのJavascriptライブラリで、トランザクションの作成やブロックチェーンネットワークへの送信が簡単にできます。
それではウォレットアドレス作成のための開発環境を準備しましょう。
Node.jsのインストール
今回作成するプログラムはNode.jsを用いて動かします。開発環境が整っていない方は本手順に沿ってセットアップしてください。既にNode.jsが利用可能な方はBitcoinJSのセットアップまで読み進めていただいて大丈夫です。
私を含めて普段Pythonを使用している人は馴染みがないですが、Node.jsとはサーバーサイドのJavaScript実行環境です。
開発環境の設定はM1 MacにnvmでNode.jsをインストールする – Qiitaの記事を参考にしました。
検証環境
- 2022/08/20実施
- macOS Monterey 12.4
- MacBook Air(M2、2022)
nvmのインストール
nvm(Node Version Manager)とはNode.jsのバージョン管理ツールです。
以下のコマンドをターミナルで実行します。
% curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
% . ~/.nvm/nvm.sh
% nvm -v
0.39.1
Node.jsのインストール
Node.jsとはサーバーサイドのJavaScript実行環境です。
LTSバージョンのNode.jsをインストールします。最後にバージョンが表示されればインストール終了です。
% nvm install --lts
% node -v
v16.17.0
nvmのインストールと同時にnpmも使用可能になります。
npm(Node Package Manager)とはNode.jsのモジュール管理ツールです。
% npm -v
8.5.0
BitcoinJSのインストール
Node.jsの実行環境が準備できたら、Node.jsアプリケーションを初期化し必要なライブラリをインストールします。
Node.jsアプリケーションの初期化
任意の作業ディレクトリに移動しNode.jsアプリケーションを初期化します。
コマンドの説明はこちらで詳しく解説されていますので参考にしてください。
コマンド実行内容は以下です。いくつか入力を求められますがEnterで進めてOKです。
作業ディレクトリ内にpackage.jsonが作成されていることを確認できれば初期化は完了です。
% npm init
% package name: (tmp) sample
% version: (1.0.0)
% description:
% entry point: (index.js)
% test command:
% git repository:
% keywords:
% author:
% license: (ISC)
% About to write to package.json:
{
"name": "bitcoinjs-lib",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
各種ライブラリのインストール
今回のデモで使用するライブラリをインストールします。
% npm install --save bitcoinjs-lib bip39 bip32 tiny-secp256k1
以上で開発環境の作成とライブラリの準備は終了です。
ウォレットアドレスを作成する
ここからはビットコインを受け取るためのウォレットアドレスを作成します。
btc.jsファイルを任意のエディタで作成し以下のコードをコピペしてください。
// ①ライブラリをインポートする
const btc = require('bitcoinjs-lib');
const bip39 = require('bip39');
const ecc = require('tiny-secp256k1');
const {BIP32Factory} = require('bip32');
const bip32 = BIP32Factory(ecc);
// ②ビットコインのテストネットワークを指定する
var network = btc.networks.testnet;
var path = `m/49'/1'/0'/0`
// ③ランダムなニーモニックを生成しシードを取得する
const mnemonic = bip39.generateMnemonic();
const seed = bip39.mnemonicToSeedSync(mnemonic)
// ④ウォレットアドレス(鍵ペア)を作成する
const root = bip32.fromSeed(seed, network);
const node = root.derivePath(path);
const p2pkh = btc.payments.p2pkh({
pubkey: node.publicKey,
network: network,
});
// 作成した鍵ペアを表示する
console.log(`
Key:
Public = ${p2pkh.address}
Private = ${node.toWIF()}
`);
コードの説明は以下の通りです。
①使用するライブラリを初期化します。
②今回はビットコインのテストネットワークを使用します。
③ウォレットアドレス用のランダムな文字列(ニーモニック)からランダムシードを作成します。
④ランダムなシードをビットコインのテストネット用のウォレットアドレスに変換します。
作成したプログラムをNode.jsで実行します。
Publicに「mx2TR7DLFxJsLTyhdr1vFLitG3emFBvpxy」と表示されました。この文字列がウォレットアドレスです。
Privateに表示された文字列は秘密鍵であるため、他人に知られないようにしましょう。
% node btc.js
Key:
Public = mx2TR7DLFxJsLTyhdr1vFLitG3emFBvpxy
Private = [ここは秘密鍵のため非表示]
以上でウォレットアドレスの作成は終了です。
ビットコインを手に入れる
それでは先ほど作成したウォレットアドレスにビットコインを送金してみます。
今回はビットコインのテスト用のネットワークTestnetを使用します。Testnetとはビットコインの開発用のネットワークであり、価値を持たないコインであるため円やドルへの変換はできません。本物のビットコインが取引されるMainnetと同じ条件で動作しており、開発時の実験環境として使用できます。
Testnet用のコインを獲得する簡単な方法はFaucetと呼ばれるサービスを使用することです。ウェブで「Faucet」と検索すれば色々出てくるので、その時点で使用できるサービスを選んでください。Testnet用のコインの流通量が不安定なため、急にサービスが終了する場合があります。Bitcoin WikiにもいくつかのFaucetサービスが記述されているため参考にしてください。
事前に作成したウォレットアドレス「mx2TR7DLFxJsLTyhdr1vFLitG3emFBvpxy」を指定し、0.000123 coinの少量のビットコインを申請します。数秒後にトランザクションが完了したというメッセージが表示され、ビットコインが指定のウォレットアドレスに送金されたことがわかります。
試しに別のプロバイダから今回のトランザクションがTestnetに記録されているか確認してみます。BlockCypherから「mx2TR7DLFxJsLTyhdr1vFLitG3emFBvpxy」のウォレットアドレスを検索してみると、今回のトランザクションの詳細を確認できました。
「tb1qwq2n7ulcg04lujwp0946nqv9hme835rxqlum2m」から「mx2TR7DLFxJsLTyhdr1vFLitG3emFBvpxy」に送金されていることが確認できました。
まとめ
いかがだったでしょうか、今回はプログラムコードを使用してウォレットアドレスを作成し、ビットコインのテストネットから少量のビットコインを取得する流れを説明しました。
実際のウォレットアドレスの取得や暗号資産取引では専用のアプリケーションやサービスがあるため今回のような手順で実施することは少ないですが、プログラムを作成することで内部の動作を理解できたのではないでしょうか。
今後は取得したコインを別のアドレスに送金する方法などについて説明したいと思います。
その他トブロックチェーン分析の方法についての紹介なども行っていますので、併せてチェックしてみてください!
コメント