Tech と Culture

テクノロジーとカルチャー

Bitcoinプログラミングの入り口

今回はBitcoin AdventCalendarの記事の一つとなります。

Bitcoin Advent Calendar 2014 - Qiita

 

注意:以下の実験を真似する場合は必ずtestnet環境で行ってください。本物のbitcoinネットワークで行った場合、何か間違いがあれば、最悪持っているbitcoinを全部失います。

この記事に従って損失が出た場合、筆者は一切責任を負いません。

 

BitcoinやBlockchainのアルゴリズムや応用が分かった所で、Blockchainを利用したプログラミングへ進んで行こうと思います。何事も作ってみないと本当には分からないというのが信条です。Ethereumのコードを読むということも考えましたが、まずは情報も一杯あってコードも枯れているBitcoinから初めてみることにします。

 

f:id:kurinkurin12:20140731231645p:plain

Bitcoinは上の図にあるように世界中に存在するマイニングノードがこれまでの全ての取引を記録したBlockchainと呼ばれるデータを保持しています。このマイニングを行うプログラムはWalletも兼ねており、Satoshi Nakamotoの論文を元に開発されました。

もちろんオープンソースGithubで公開されています。

https://github.com/bitcoin/bitcoin

bitcoin-qtという名前のソフトウェアです。bitcoindという名前のコマンドラインで起動するデーモンプログラムもあります。

 

また、bitcoinにはSPV(simplified payment verification)と呼ばれる、マイニングを行わないノードも存在します。 スマホ等でよく使用されているbitcoin walletはこちらのSPVノードです。

 SPVノードもオープンソース実装がたくさんあります。今回は以下のコードを使用します。

schildbach/bitcoin-wallet · GitHub

 

今回は、この二種類のノードをソースからコンパイルしてbitcoinのやりとりを行います。この環境が作れれば、後はソースコードを読んで、改造し、自分のbitcoinアプリケーションの開発ができるようになるはずです。

 

まずはbitcoin-qtをインストールしてみます。以下の作業は全て、Ubuntu14.04LTS上で行っています。

現在(2014.12.7)の最新バージョンはv0.9.3のようなので、そちらを使います。

まずは、Githubからclone !

git clone https://github.com/bitcoin/bitcoin.git

 

git branch -r でリモートのブランチをチェック

kurimoto@kurimoto-ubuntu:~/Develop/Bitcoin/bitcoin-qt/bitcoin$ git branch -r
origin/0.6.3
origin/0.7.2
origin/0.8.6
origin/0.9.3
origin/HEAD -> origin/master
origin/freenode-verf
origin/master

0.9.3をローカルに再現します。

git checkout -b My0.9.3 origin/0.9.3

doc/build-unixに従って、必要なライブラリをインストール

sudo apt-get install build-essential
sudo apt-get install libtool autotools-dev autoconf
sudo apt-get install libssl-dev

sudo apt-get install libboost-all-dev

sudo add-apt-repository ppa:bitcoin/bitcoin (libdb4.8インストールのため)
sudo apt-get update

sudo apt-get install libdb4.8-dev   
sudo apt-get install libdb4.8++-dev  

sudo apt-get install libminiupnpc-dev

sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler

sudo apt-get install libqrencode-dev

ライブラリを準備できたらビルド開始

./autogen.sh

./configure

make

コンパイルが始まります。

sudo make install

インストール終了

 

コンパイルが通って、起動させたいところですが、ここで以下の事項に対する知識が必要です。

bitcoin関連の開発において、以下の3つの実行環境でテストが行われます。

a. main or "production" network

b. test network(testnet)

c. regression test mode

aは所謂bitcoinネットワークです。実際に価値のあるbitcoinの送金等が行われているネットワークです。こちらはプログラムを完全に理解した人以外使用してはいけません。バグがあって、大きな額のbitcoinを知らない人に送金してしまったら、二度と戻ってきません。

bは上記のような開発時の難しさを避けるためにインターネット上に作られているtestnetです。ここでのbitcoinは価値を持ちません。通常はこちらを使いましょう。 -testnetで起動することでこちらに接続します。

cはインターネット上のマイニングネットワークには繋げずに、自分で起動したbitcoindとプライベートなネットワークを作って実験する方法です。今回の記事では使用しません。

 

コマンドライン実行時に -testnet とオプションをつければtestnetで動作させることができますが、ここではbitcoin.confというコンフィグレーションファイルを使って設定する方法を取ります。

以下のページにtestnet用のbitcoin.confサンプルがありますので、これを変更して、~/.bitcoin/のディレクトリに置きます。

insight-api/bitcoin-testnet.conf at master · bitpay/insight-api · GitHub

 この状態で起動すると、通常はオレンジのbitcoinロゴが緑のロゴとなって開始します。緑色はtestnetにつないでいることを示しています。

ブロックチェインの同期が始まります。結構な時間がかかります。ネット上にaddnode=blockexplorer.com を加えると書いてあったので、bitcoin.confに加えるとやや早くなりました。

 

マイニングするフルノードはソースからビルドして稼働することができました。次にAndroid上のSPVノードをソースからビルドして動作させます。

git clone https://github.com/schildbach/bitcoin-wallet.git

でソースをローカルに持ってきます。

mvn clean install でビルドが始まります。

無事にビルドが終わると wallet/target/wallet-4.08-test.apk

ができあがります。テストネット用のwalletです。

 

Android SDKをインストールすると使えるようになる、adbを使用してマニュアルインストールします(Androidは開発者オプションと身元不明のアプリのインストールの許可をオンにしておきます)。

adb install wallet-4.08-test.apk

これでUSBコードを通してAndroid端末にbitcoin SPV node walletがインストールされました。

 Testnet3と表示されているアプリケーションアイコンをタップすると起動します。

f:id:kurinkurin12:20141207190029p:plain

 

testnet上のbitcoinは実験用としてしか価値がありませんので、以下のtestnet faucetで簡単に手に入れることができます。

TP's TestNet Faucet

AndroidアプリのQRコードをタップした時に出てくるwallet のアドレスを上記HPで入力し、captchaの値を入力してsendボタンを押すと無事にAndroid walletにtestnet上のbitcoinが入金されました。

f:id:kurinkurin12:20141207190507p:plain

 bitcoin-qtの方に戻り、受信ボタンを押して、Request paymentボタンを押すと、受信用QRコードが出ます。

f:id:kurinkurin12:20141207212620p:plain

Androidアプリからこのコードをスキャンして送金してみます。

送金するとblockchain netowrk上にトランザクションが広がります。まだマイニングによって承認されていません。アプリ側で未承認状態にあることが確認できます。

暫く待つと一つ目の承認がblockchain network上で行われ、アプリ上の表示記号が変わります。

それと同時にBitcoin-Qtの方で受金します。

f:id:kurinkurin12:20141207213857p:plain

こんな感じで無事bitcoinを受け取ることができました。

 

以上で、マイニングフルノードとSPVモバイルwalletをソースからコンパイルしてbitcoinのやり取りに成功しました。

 

あとは、ソースコードを解読するなり改造するなりしてbitcoinアプリケーションの開発が可能になります。

 

Let's hack !!!