はじめに
VALU Advent Calendar 2018 の16日目です。
弊社はVALUという、ブロックチェーンを活用したfintech・SNSサービスを運営しております。
私はPM業務に従事している非エンジニア属性の人間ですので、暖かい目でご査収いただければ幸いです。
記事のスコープ
macOS Mojave ver10.14.1
環境で、
bitcoindをローカルで稼働させてtestnetのTXIDをgetrawtransaction
するまで
bitcoindを稼働させる
・フルノードをローカル環境で稼働させて、分散型台帳に加わってみよう
事前準備
$ brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python3 qt libevent
bitcoindをクローン, ビルド, インストール
$ git clone https://github.com/bitcoin/bitcoin
$ cd bitcoin
$ ./autogen.sh
$ ./configure
$ make
$ make install
インストールできたか確認する
$ which bitcoind
$ which bitcoin-cli
それぞれインストールされたディレクトリの場所が却ってくればOK
bidoindを設定する
bitcoin.confを作成する
$ cd Library/Application\ Support/
※ubuntu, windowsだと作成するディレクトリが異なる
$ mkdir Bitcoin
$ vim bitcoin.conf
confの内容(例)
testnet=3
server=1
txindex=1
rpcuser=hoge
rpcpassword=fuga
rpcport=18332
当記事のスコープはとりあえず動かしてみようなので、とりあえずこんな感じでOK
参照:https://bitcoin.clock-up.jp/contents/admin/setting
bidoindを起動する
$ ./bitcoind
つらつらlogが出るので、最新のブロックに追いつくまで半日〜1日くらい待つ
トランザクションを作ってみる
ウォレットを作る
・electrumで進めてみる
https://electrum.org/
※bitcoinのtestnetで動けばなんでもOK
testnet modeでopen
$ open -n /Applications/Electrum.app --args --testnet
以降、ガイドの通り進める。復旧の際に必要となるので、リカバリ用の単語はきちんと控える
ウォレットに入金する(=トランザクションを作る)
testnetでは有志の方がfaucet(蛇口)サイトを運営しており、
「通貨名 + testnet + faucet」で検索すると色々出ます。
例として下記のこちらのページで流れを説明します。
https://coinfaucet.eu/en/btc-testnet/
アドレスをコピー&ペースト
・electrum > Receive > Receiving address よりコピー
・Your testnet3 address 欄にペースト、reCAPTCHAにチェックをして"Get bitcoins!"
TXIDを分解する
bitcoin-cliとは
下記URLの通り、Bitcoinのクライアントです。
参照:https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list
rawtransactionとは
トランザクションの構造通りに全てのデータが連続したバイトデータとして並んでいるものであり、
これをhash256したものがTXIDです。
rawtransactionを取得する
・faucetからの送金TXIDで取得してみる
bitcoin-cli -testnet getrawtransaction b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4
・レスポンスがこちら
02000000000101f3a425f63e0c2ba8abd8869d5ad2fa2ea78daa5e8ec3b69b3bdb04309b649ce9010000001716001484b8b548135090a117843d208dee503a758f6cf8feffffff0288ee2501000000001976a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac654394cd1500000017a914af714eea294544789f1dd8cf987f0c7f60d5c94187024730440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a012103c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae3647181600
暴力的なHex・・
優しくしてほしいので
・末尾に" -1"を足す
$ bitcoin-cli -testnet getrawtransaction b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4 -1
レスポンスがこちら
{
"txid": "b3952cdb584cd698baff78136189228b43089373701c7029b820cef35fa252e4",
"hash": "858e68df8a07a6beaf6be2875e07ed2356a794e4f20b101eed44657ff00323bf",
"version": 2,
"size": 249,
"vsize": 168,
"weight": 669,
"locktime": 1448007,
"vin": [
{
"txid": "e99c649b3004db3b9bb6c38e5eaa8da72efad25a9d86d8aba82b0c3ef625a4f3",
"vout": 1,
"scriptSig": {
"asm": "001484b8b548135090a117843d208dee503a758f6cf8",
"hex": "16001484b8b548135090a117843d208dee503a758f6cf8"
},
"txinwitness": [
"30440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a01",
"03c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae36"
],
"sequence": 4294967294
}
],
"vout": [
{
"value": 0.19263112,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 30e9b9eb407ab13f664971ab983ee95b644b1dd8 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mjyair2gtTWx5Ro6Pc8oh42vrUtscT1rE6"
]
}
},
{
"value": 936.43359077,
"n": 1,
"scriptPubKey": {
"asm": "OP_HASH160 af714eea294544789f1dd8cf987f0c7f60d5c941 OP_EQUAL",
"hex": "a914af714eea294544789f1dd8cf987f0c7f60d5c94187",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"2N9EsyefeUFRG56nbxumQopc1tP8pUpoWui"
]
}
}
],
"hex": "02000000000101f3a425f63e0c2ba8abd8869d5ad2fa2ea78daa5e8ec3b69b3bdb04309b649ce9010000001716001484b8b548135090a117843d208dee503a758f6cf8feffffff0288ee2501000000001976a91430e9b9eb407ab13f664971ab983ee95b644b1dd888ac654394cd1500000017a914af714eea294544789f1dd8cf987f0c7f60d5c94187024730440220125e106c6df33957bc45ad197c102fb637f2553ad10c7338e81754d5ce849b4d0220772e9d7499107e226f5a172231826ae4b7e5a34efe25ac463ecefa204f6f895a012103c4cff008377e4d11c34806fd31fec8e3bf7e3d53c16d2d91fa1ae1713808ae3647181600",
"blockhash": "00000000000000a11a2aa57f3999aaa81069c4f1e705e0298671d687081b0296",
"confirmations": 1,
"time": 1544951423,
"blocktime": 1544951423
}
形成されました
内容についてざっくり
"vin"
トランザクションのinput
ここに表示されるtxidをgetrawtransactionすると、さらにprevious transactionの情報を参照することが出来ます。
"vout"
トランザクションのoutput
outputが二つにわかれているのは、それぞれ送金とお釣り(change)目的のoutputになっている為です。
上記のトランザクションでは、
n:0が送金、
n:1がお釣りのoutputです。
"asm"
スクリプト領域
トランザクションがmultisigによりブロードキャストされたかなど、様々な情報が詰まっています。
間違えたところ
私ははじめconfの設定をしくじりtxindexの記載を忘れたことから、
古いTXIDをgetrawtransactionするとこんなエラーが却ってきました。
No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.
その場合confを書き換えるか、
bitcoindを
$ bitcoind -reindex -txindex
で再起動することによって情報を再取得し、
古い(mempoolに存在しない)TXIDの情報も返却してくれます。
最後に
クライアントツールはweb上でも多く公開されているのでわざわざ手間をかける必要もないですが、
個人的には一度ノードを立ててみることは勉強になりました。
2018年末カオス極まりない状況となっている仮想通貨と、
それを支えるブロックチェーンというエコシステムの発展を祈念して記事を終わりにします。
弊社は人を募集しています
「評価経済社会」という未来を一緒に作りませんか?
エンジニア出身の代表の元、
イキイキと働いてもらえる環境が揃っておりますので、
ご連絡をお待ちしております。
参考
https://en.bitcoin.it/wiki/Transaction
https://en.bitcoin.it/wiki/Script