search
LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

bitcoindの構築からgetrawtransactionするまで

はじめに

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 よりコピー
スクリーンショット 2018-12-16 17.54.33.png

・Your testnet3 address 欄にペースト、reCAPTCHAにチェックをして"Get bitcoins!"
スクリーンショット 2018-12-16 17.59.23.png

・送付額と送付元アドレス、TXIDが表示される
スクリーンショット 2018-12-16 18.05.50.png

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1