Bitcoinのコマンド操作(生成、送信)
bitcoindとbitcoin-cliの準備が出来ました。
まずは、bitcoin-cliの簡単な説明をし、その後
実際に、regtest環境で、Bitcoin(以下、BTC)を作成し、アドレスに送ってみましょう。
0.準備
ターミナルを開きます、それからbitcoindをregtest環境で起動します。
cd # git clone dir
cd bitcoin/src
./bitcoind -regtest -printtoconsole
別のターミナルを開きます。
まずは、以下の手順でコマンドの一覧を見てみましょう。
cd # git clone dir
cd bitcoin/src
./bitcoin-cli -regtest help
沢山のコマンドが出てきたと思います。
また、ある程度グループ毎に区切られていると思います。
| グループ名 | 概要 |
|---|---|
| Blockchain | blockの情報やmempoolの情報を取得するコマンド群 |
| Control | 停止コマンドなどのコマンド群 |
| Generating | block生成などのコマンド群 |
| Mining | マイニングの情報を取得するコマンド群 |
| Network | P2Pネットワークの状態を取得するコマンド群 |
| Rawtransactions | rawデータのtransactionを操作するコマンド群 |
| Util | ユーティリティ系のコマンド群 |
| Wallet | ウォレット関連のコマンド群 |
※:account関連のコマンドは一部バグがあるので、利用は避けたほうが無難です。
1.BTCの作成
regtestの環境で、BTCを生成します。
bitcoinではBTCはどこで発生するのか?
答えは、blockを生成した人(システム)が報酬としてBTCを取得する事ができます。
ではBTCを取得する為に、1つ目のblockを生成してみましょう。
blockの生成には、generateというコマンドを使います。
最初のパラメータは数値型でいくつblockを作成するかを指定します。
実際に実行してみましょう、生成されたblockのhash値が出力されると思います。
※:mainnetでも同じようにblockを生成を実行する事はできますが、block生成の難しさが非常に高いため、生成する事は不可能に近いです。
./bitcoin-cli -regtest generate 1
[
<hash>
]
※:実行例(私の環境なので、hash値は異なるはずです。)
./bitcoin-cli -regtest generate 1
[
"54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738"
]
このブロックを見てみましょう。
getblockというコマンドを使います、最初のパラメータはblockのhash値となります。
先程の結果でhash値が出ているはずなので、それを使います。
./bitcoin-cli -regtest getblock <hash>
<data>
※:実行例
./bitcoin-cli -regtest getblock 54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738
{
"hash": "54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738",
"confirmations": 1,
"strippedsize": 226,
"size": 226,
"weight": 904,
"height": 1,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
"tx": [
"7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1"
],
"time": 1494301560,
"mediantime": 1494301560,
"nonce": 0,
"bits": "207fffff",
"difficulty": 4.656542373906925e-10,
"chainwork": "0000000000000000000000000000000000000000000000000000000000000004",
"previousblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
}
blockの情報が出てくると思います。
出力値の細かい説明はしませんが、ここではtxに注目してみます。
txは、TransactionでBTCの取引時に使われるデータです。
txに1つだけ、値が設定されていると思います。これはtxidというものです。
実行例では7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1
このTransactionを見てみましょう。
Transactionを見るのに、getrawtransactionというメソッドを使います。
最初のパラメータは、getblockで取得したtxの値txidを設定します。
2番目のパラメータに、1を設定します、これはTransactionを詳しく(verbose)表示する為のものです。
./bitcoin-cli -regtest getrawtransaction <txid> 1
※:実行例
./bitcoin-cli -regtest getrawtransaction 7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1 1
{
"hex": "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a01000000232103c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
"txid": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
"hash": "7e92f582577dfc368687c8bb8a2c6a74df50d5ad71713cecd876d78b918c9ce1",
"size": 145,
"vsize": 145,
"version": 2,
"locktime": 0,
"vin": [
{
"coinbase": "510101",
"sequence": 4294967295
}
],
"vout": [
{
"value": 50.00000000,
"n": 0,
"scriptPubKey": {
"asm": "03c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7 OP_CHECKSIG",
"hex": "2103c9a24f26f1c331328944201b414f1ef5971e641b54770e416cb0fa148d0c8ae7ac",
"reqSigs": 1,
"type": "pubkey",
"addresses": [
"muEwEJq77tG8PboTyUmzw9fmpEBmiNykBq"
]
}
},
{
"value": 0.00000000,
"n": 1,
"scriptPubKey": {
"asm": "OP_RETURN aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9",
"hex": "6a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9",
"type": "nulldata"
}
}
],
"blockhash": "54146f9adfc874f294d58d998a28201a2c145824b6d1f4dca57ba6b722a73738",
"confirmations": 1,
"time": 1494301560,
"blocktime": 1494301560
}
coinbaseとして、50BTCを取得してそれを自身のアドレスに送信している、Transactionが確認できると思います。
実際に、現在保持しているBTCを確かめてみましょう。
ここでは、getbalanceというコマンドを利用します。
このコマンドは、自身のウォレットに入っているBTCをすべて合算した値を出力してくれます。
./bitcoin-cli -regtest getbalance
0.00000000
0になっていると思います。
これは、coinbaseの場合、coinbaseが入っているブロックから100以上ブロックが生成されないと使えない為です。(フォークなどの恐れがある為)
では、あと100個ブロック作ってみましょう。
generateコマンドの最初のパラメータに100を設定する事で、
100個のblockを生成する事ができます。
./bitcoin-cli -regtest generate 100
[
# 略
]
先程と同じように、現在保持しているBTCを確かめてみましょう。
./bitcoin-cli -regtest getbalance
50.00000000
50BTC取得している事がわかります。
2.BTCの送信
まずは、送信先のアドレスを取得します。
getnewaddressというコマンドを使います。
ここでは、regtest環境なので、mから始まる文字列が返ってくると思います。
mainnetでは、1から始まる文字列が返ってきます。
このアドレスについては別で説明するため、詳細は割愛します。
./bitcoin-cli -regtest getnewaddress
<address>
※:実行例
./bitcoin-cli -regtest getnewaddress
mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
ここに、BTCを送信してみます。
sendtoaddressというコマンドを使います。
最初のパラメータにアドレスを、2番目のパラメータのBTC(送信額)を設定します。
./bitcoin-cli -regtest sendtoaddress <address> <amount>
<txid>
※:実行例
./bitcoin-cli -regtest sendtoaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf 1
08865f69df32a084cc03d4029b98bf2112abbd7a7150412ebbe7bcc45afb1038
では、アドレスが受け取ったBTCを見てみましょう。
getbalanceはウォレットが管理している全ての値を表示する為、
ここではアドレス指定でBTCを確認します。
その為、getreceivedbyaddressコマンドを使います。
./bitcoin-cli -regtest getreceivedbyaddress <address>
<amount>
※実行例
./bitcoin-cli -regtest getreceivedbyaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
0.00000000
0BTCになっていると思います。
これは、このTransactionがまだblockになっていない為、まだそのアドレスが保持されていることが承認されていない状態だからです。
では、このTransactionはどこで管理されているのでしょうか?
このTransactionはmempoolの中で管理されblockが生成されるのを待っています。
確認してみましょう。
getrawmempoolというコマンドを使ってみましょう。
先程のtxidが入っていると思います。
※:実行例(実際は、自身がsendtoaddressコマンド実行で出力されたtxidが表示されていると思います。)
./bitcoin-cli -regtest getrawmempool
[
"08865f69df32a084cc03d4029b98bf2112abbd7a7150412ebbe7bcc45afb1038"
]
では、blockを作成してみましょう。
generateコマンドを使います。
※:実行例
./bitcoin-cli -regtest generate 1
[
"7417237dd741f911197941285837579b01d407490fd8fa43a69c53055092e590"
]
blockが生成できたので、getreceivedbyaddressコマンドを使って
現在のBTCを取得してみます。
./bitcoin-cli -regtest getreceivedbyaddress <address>
<amount>
※実行例
./bitcoin-cli -regtest getreceivedbyaddress mnBVKyu8W1T72Tr1QW65Pm6GiiJgXRfPDf
1.00000000
1BTC入っている事が確認できます。