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入っている事が確認できます。