このハンズオンでは基本的なbitcoinjの使い方、コントラクトを書き方等を習得することができ、
ビットコイン初心者でもビットコインで遊ぶことができるようになります
ハンズオン用のプロジェクトをIntelliJ IDEA等のIDEで作成してください(Android Studioではありません)
このハンズオンでは、Kotlin, Gradle, IntelliJ IDEA、bitcoinj.cash(BCH)を用いますが、
Javaや他のIDE、bitcoinj(BTC)を用いても構いません
但し、簡略化のため差分の解説は行いません
bitcoinj.cashとはBitcoin ProtocolのJava実装ライブラリであるbitcoinj(BTC)のBCH対応版です
Maven Repositoryで配布されているbitcoinj.cashはバージョンが古いため、最新版をコンパイルしました
https://github.com/yenom/bitcoinj.cash-Sample-App/blob/master/app/libs/bitcoinj-core-0.14-SNAPSHOT-bundled.jar
プロジェクトルートのlibs
ディレクトリ直下(無ければ作ってください)にダウンロードしたjarファイルを置き、build.gradle
のdependencies
セクションに依存関係に追加します
また、bitcoinjのログを出力するためにslf4f-simple
も導入してください
プロジェクトルートのsrc/main/kotlin
内に.kt
のファイルを作成し、その中にmain関数を作成してください
このハンズオンではここにプログラムを記述していきます
kit.awaitRunning()
が終了した後に、Walletの各情報を取得することができるようになります
詳細なAPIに関しては以下のドキュメントを参照してください
cash.bitcoinj:bitcoinj-core:0.14.5.2 API Doc :: Javadoc.IO
次のセクションに進む前に、取得したアドレスにいくらかコインを送金しておきましょう
TestNetのコインはBitcoin DevelopersのSlackにて /faucet
コマンドを使って入手できます
プログラムが終了するのを防ぐには、もろもろの処理が終わった後に sleep
するのが良いでしょう
アドレスに送金しても残高が増えない場合は、しばらくプログラムを立ち上げた状態(sleep
)にして待ってみましょう
実際にコインを送金してみましょう
bitcoinjはSPVライブラリであるため、自身がBitcoin Networkの参加者になります
つまり、ブロードキャスト等にREST APIなどは用いてないため、送金速度は自身の接続状況等に依存することに注意してください
bitcoinjに於いて、トランザクションのブロードキャストには最大接続数の0.8倍のピアと接続している必要があり、それをなかなか満たさない場合があります
その場合は、デフォルトの最大接続数を以下のようにして減らしましょう
現在の接続状況については標準出力にログが出力されるためそちらを参照してみてください
先程の送金スクリプト(P2PKH)を自分で書いてみましょう
OP_RETURN
を用いると任意のデータをブロックチェーンに刻むことができます
bitcoinjにはそのようなスクリプトを生成するメソッドがあります
これを用いて先程のようトランザクションを作り、実際にブロードキャストしてみましょう
送金額は0で構いません(ただし、送信手数料は取られます)
エクスプローラを用いて書き込んだデータを確認することができます
BLOCKTRAIL | Bitcoin API and Block Explorer
https://www.blocktrail.com/tBCC/tx/${tx.hashAsString}
また、自分でスクリプトを書くこともできます
更に、OP_RETURN
のデータを取得する場合は、以下のようになります
但し、bitcoinjはSPVライブラリであるため自分のウォレットに関するトランザクション(自分が送信したor受信した)しか取得できません
任意のトランザクションのデータを処理したい場合は、https://rest.bitcoin.com/ などのREST APIを用いるのが良いでしょう
2つの秘密鍵による署名がないとコインが使えないというアドレス(2 of 2のMultisigアドレス)を作成して、実際に署名してみましょう
2 of 2のMultisigアドレスを作成してみましょう
もちろん作成には2つの公開鍵が必要です
2(TestNet)から始まるアドレスが作成されたはずです
ちなみにMainnetは3から始まります
このアドレス宛にいくらか送金してみましょう
Multisigアドレスに送られたコインを使用してみましょう
今回は2 of 2のMultisigアドレスを作成したため、2つの署名が必要です
このようにして、家族、会社などのメンバーで管理するアドレスを作ることができるようになります
OP_CHECKSIGVERIFY
を使うと、指定した日時を過ぎないと利用できないトランザクション(コイン)を作ることができます
アドレス(P2SH)を作成した時刻から24時間経過していないと、そのアドレス宛のコインを使うことができないというアドレスを作ってみましょう
一つ前の章で説明したことは省いています
この locktimeAddress
にいくらか送金してみましょう
このアドレスに送金したコインは指定した時刻を過ぎないと利用できません
では、この作成したLockTimeアドレスに送られたコインを利用してみましょう
どうでしょうか
このアドレスはアドレス作成時から1日経過していなければそのコインを利用することはできないため、broadcastに失敗したはずです
このようにP2SHを用いると、様々なスクリプトを書くことができるようになります
ここで解説したOP_CODEはほんの一部であるため(条件分岐もできる)、以下の資料等を参照してみてください
Script - Bitcoin Wiki
bitcoincash.org/may-2018-reenabled-opcodes.md at master · bitcoincashorg/bitcoincash.org · GitHub
Kotlinを用いたbitcoinj.cashのAndroidサンプルアプリを作りました!
GitHub - yenom/bitcoinj.cash-Sample-App: bitcoinj.cash Sample Android App
MITライセンスの範囲内でご自由にお使いください
bitcoinjをAndroidで使うために、build.gradle
のandroidセクションに以下の記述を追記する必要があります
これを追記しなければビルドに失敗してしまいます(罠)