Visual Studio による Bitcoin プログラミング
-
Upload
keiichi-kobayashi -
Category
Technology
-
view
740 -
download
0
Transcript of Visual Studio による Bitcoin プログラミング
Visual Studio によるBitcoin プログラミング
kobake@ビットコインとか勉強会#7
メモ2017/05/16(火) 19:30 〜 21:30ビットコインとか勉強会 #7 - connpasshttps://cryptocurrency.connpass.com/event/55848/19:35-20:00 Visual Studio による Bitcoin プログラミング (25分)
当スライドのURL(あとで Twitter とか connpass コメントとかに書く )https://goo.gl/IcLunM
------------------------------------------
本日の発表スライドです。
「Visual Studio による Bitcoin プログラミング」
https://goo.gl/IcLunM
#暗号通貨読書会 #ccstudy
------------------------------------------
・Slack https://ccstudy-slack.herokuapp.com/
・CoinTip https://cointip.jp/・アンケート:参加者の Windows/VisualStudio率
自己紹介
@kobake_ (こばやん)
http://clock-up.jp/ clock-up.jphttp://blog.clock-up.jp/ clock-up-bloghttp://bitcoin.clock-up.jp/ Bitcoin ClockUpMemohttps://events.clock-up.jp/ clock-up-eventshttps://csugjp.connpass.com/ 日本C#ユーザ会
元ゲームプログラマ。
最近は C# / C++ / Bitcoin / ASP.NET MVC 等。
Visual Studio および ThinkPad 依存症。
今日のお話
・Bitcoin Core のソースコードをバリバリいじっていきたい
・できれば Visual Studio でコーディング&デバッグできたら最高だよね
→ 実現しました(紆余曲折あり)
今日のお話
・Bitcoin Core のソースコードをバリバリいじっていきたい
・できれば Visual Studio でコーディング&デバッグできたら最高だよね
→ 実現しました(紆余曲折あり)
☝今回はここの話が割と長いです。ご容赦。
Q. 何故 Bitcoin Core のソースコードをいじるのか
・バグ修正?
・機能追加?
・ハードフォーク??
Q. 何故 Bitcoin Core のソースコードをいじるのか
・バグ修正?
・機能追加?
・ハードフォーク??
↓NO (結果的にはコントリビュートにも繋がったが僕の本来の目的は違う)
Q. 何故 Bitcoin Core のソースコードをいじるのか
A. Bitcoin Core のロジックを深く理解するため。
Q. 何故 Bitcoin Core のソースコードをいじるのか
A. Bitcoin Core のロジックを深く理解するため。
Bitcoin Core の理解のステップ
・文献を読む (wiki および Mastering Bitcoin オススメ。あと論文もね。)
・普通に動かす
・設定をいじって動かす
・コードを読む
・コードを改造して動かす ← 今ココ
HostHostHost
Bitcoin のおおまかな仕組み
bitcoind(ノード本体)
bitcoin-cli(コマンドライン
ツール)
bitcoind(ノード本体)
bitcoind(ノード本体)
ノード構築
Host
bitcoind(ノード本体)
bitcoin-cli(コマンドライン
ツール)
regtest=1
server=1rpcuser=hogerpcpassword=xxxxx
~/.bitcoin/bitcoin.conf
※今回は実験ネットワークを構築するので regtest=1 とします
これらは実行バイナリをDLしてきて設置。またはビルドにより構築。
今回は実行バイナ
リをDLしてくるので
はなく、ビルドにより
バイナリを生成しま
す。
ビルドについて
・今回は Bitcoin の「デバッグ環境」を構築するので、当然「ビルド」が必要。
・各プラットフォームにおけるビルド手順は公開されている。
https://github.com/bitcoin/bitcoin/blob/master/doc/build-osx.mdhttps://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.mdhttps://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.mdhttps://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.md
Windowsビルドについて
https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。
一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。
Windowsビルドについて
https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。
一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、
Windowsビルドについて
https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。
一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、
→ 邪道では?
Windowsビルドについて
https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。
一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、
→ 邪道では?
→ msbuild させろ!
ところで MinGW gcc デバッグビルドに関する罠
本当のところを言うと、最初は MinGW の gcc ビルドしたやつのデバッグで良いかな、と
思ってました。ところで Bitcoin Core のビルド時には configure にデバッグビルドオプ
ションが付けられます。(これを付けると gcc に「-g3 -O0」オプションが付きます)
$ ./autogen.sh$ ./configure --enable-debug$ make…..
ところで MinGW gcc デバッグビルドに関する罠
本当のところを言うと、最初は MinGW の gcc ビルドしたやつのデバッグで良いかな、と
思ってました。ところで Bitcoin Core のビルド時には configure にデバッグビルドオプ
ションが付けられます。(これを付けると gcc に「-g3 -O0」オプションが付きます)
$ ./autogen.sh$ ./configure --enable-debug$ make…..Fatal error: can't close libbitcoin_server_a-validation.o: File too big→ bitcoind 関連モジュールがでかすぎてビルド失敗する…
MinGW gcc 通常ビルドで仕切り直し
--enable-debug オプションを外せばビルドは通るが…。
$ ./autogen.sh$ ./configure$ make$ ls -l ./src/bitcoind.exe-rwxr-xr-x 1 kobake kobake 194375094 Feb 10 21:04 ./src/bitcoind.exe
MinGW gdb の罠
$ gdb ./src/bitcoind.exe
(gdb) b mainBreakpoint 1 at 0x88a910: file bitcoind.cpp, line 190.(gdb) startTemporary breakpoint 2 at 0x88a910: file bitcoind.cpp, line 190.Starting program: C:\opensource\bitcoin-32bit\src\bitcoind.exe….This application has requested the Runtime to terminate it in an unusual way.Please contact the application's support team for more information.→ 何故か落ちる
MinGW gdb の罠:検証
・いろいろ手あたり次第試した結果ですが、プログラムのサイズが大きすぎると MinGW gdb がうまく動かないようです。(bitcoind を構成するコードを大きく削り落としたら gdb でもデバッグできるようになった。サイズまたはシンボル数の問題かと思われる)
・MSYS2 / MinGW-w64 等の環境でも試してみたが、やはり同様の問題に遭遇。(gdb でブレークポイントが張れなかったり異常終了したり)
・とにかく MinGW 系の環境だと、サイズの大きいプログラムのデバッグに難がある(根
本的な原因は不明)ようなので、今回は諦める。
というわけで
MinGW のことは一旦忘れる
というわけで
MinGW のことは一旦忘れる
↓結局 Linux バイナリが安定デバッグで
きるのでそっちに寄せよう
最も簡単な(?) Visual Studio による Bitcoin デバッグ
Linux
bitcoind bitcoin codeビルド
gdb
Windows
Visual StudioWinGDB
bitcoin code
dependencies・OpenSSL・livevent・boost・libzmq等、諸々
同期
dependencies
同期?
ssh tunnel
attach
最も簡単な(?) Visual Studio による Bitcoin デバッグ
Linux
bitcoind bitcoin codeビルド
gdb
Windows
Visual StudioWinGDB
bitcoin code
dependencies・OpenSSL・livevent・boost・libzmq等、諸々
同期
dependencies
同期?
ssh tunnel
attach
このへんの同期めんどい
最も簡単な(?) Visual Studio による Bitcoin デバッグ
Linux
bitcoind bitcoin codeビルド
gdb
Windows
Visual StudioWinGDB
dependencies・OpenSSL・livevent・boost・libzmq等、諸々
ssh tunnel
attach
sambasamba を介することで同期問題解消
最も簡単な(?) Visual Studio による Bitcoin デバッグ
Linux
bitcoind bitcoin codeビルド
gdb
Windows
Visual StudioWinGDB
dependencies・OpenSSL・livevent・boost・libzmq等、諸々
ssh tunnel
attach
samba
悪くないけど重い
samba を介することで同期問題解消
最も簡単な(?) Visual Studio による Bitcoin デバッグ
Linux
bitcoind bitcoin codeビルド
gdb
Windows
Visual StudioWinGDB
dependencies・OpenSSL・livevent・boost・libzmq等、諸々
ssh tunnel
attach
samba
悪くないけど重い
実はこっちも重い。辛い。
samba を介することで同期問題解消
一応 WinGDB によるデバッグ模様を共有
https://twitter.com/kobake_/status/815338953691664384
AWS EC2 インスタンス上の Amazon Linux で bitcoind を動かしてます。
それを手元の ThinkPad からリモートデバッ
グ。このために WinGDB を買った ($89)。
リッチではある。だが、重い。
WinGDB によるアタッチは悪くないが
・パフォーマンスが悪いので気持ちが辛くなってきた。
もう…msbuild対応するぞ
いっそ msbuild 対応するぞ
・理想を言うと Visual Studio で .sln ファイル開いて「ビルドメニュー」ポチッ1発で Bitcoin Core 起動したいんじゃ。
いっそ msbuild 対応するぞ
・理想を言うと Visual Studio で .sln ファイル開いて「ビルド」メニューをポチッ1発で Bitcoin Core 起動したいんじゃ。
↓実現しました。
https://github.com/kobake/bitcoin-msvc・Visual Studio 2015 ビルドに対応するまでに苦節71コミット。
・gcc と msvc の差異を吸収する対応、および、ライブラリ依存解決(後述)。
・途中で Visual Studio 2017 が登場したのでそちらにも後から対応。
(この時点で Visual Studio 2015 対応は切り捨てたのでご注意)
・現時点で187コミット。絶賛リファクタ中なので汚いところはご容赦。
Visual Studio 版 Bitcoin の依存解決
・msbuild でやる以上、automake とか yum とかの仕組みは使えない
・そもそもビルドするための環境準備を各人にやらせるのは不毛
・依存解決は全自動の方向
Visual Studio 版 Bitcoin の依存解決
・msbuild でやる以上、automake とか yum とかの仕組みは使えない
・そもそもビルドするための環境準備を各人にやらせるのは不毛
・依存解決は全自動の方向
→ NuGet Gallery を用いる。
NuGet Gallery について
・主に .NET 系のライブラリを登録するリポジトリだが、.NET 関係ない C++ 系ライブラリ
等も利用できる。
・Visual Studioプロジェクトの依存先として NuGet パッケージを指定しておくと、ビルド時
に必要なパッケージを自動的にダウンロードして依存解決してくれる。
・立ち位置としては Ruby でいうところの gem とか Python でいうところの pip みたいなも
の。
・Microsoft アカウントがあれば誰でもパッケージを登録できる。
・Boost C++ Libraries 等のメジャーなライブラリパッケージは既に存在しているのでそれ
を利用。
NuGet Gallery について
・大変便利なリポジトリではあるが、C++ 系のライブラリ登録数はそれほど多くない(やはり .NET 系、
つまり主に C# 用のものが多い)
・Bitcoin Core を Visual Studio 2015 でビルドするのに必要としたパッケージhttps://www.nuget.org/packages/boost/ (既存)
https://www.nuget.org/packages/libzmq-nightly/ (既存)
https://www.nuget.org/packages/openssl/ (既存)
https://www.nuget.org/packages/libevent2-vc140/ (新規)
https://www.nuget.org/packages/miniupnpc-vc140/ (新規)
https://www.nuget.org/packages/leveldb-vc140/ (新規)
https://www.nuget.org/packages/secp256k1_vc140/ (新規)
※(新規)と記載したパッケージは kobake が独自に NuGet パッケージ登録を行った。
NuGet Gallery について
・Bitcoin Core を Visual Studio 2017 でビルドするのに必要としたパッケージhttps://www.nuget.org/packages/boost/ (既存)
https://www.nuget.org/packages/libevent2-vc140/ (新規。2015用に作ったものを流用 )
https://www.nuget.org/packages/miniupnpc-vc140/ (新規。2015用に作ったものを流用 )
https://www.nuget.org/packages/leveldb-vc140/ (新規。2015用に作ったものを流用 )
https://www.nuget.org/packages/openssl-vc141/ (新規)
https://www.nuget.org/packages/libzmq-vc141/ (新規)
https://www.nuget.org/packages/secp256k1-vc141/ (新規)
※(新規)と記載したパッケージは kobake が独自に NuGet パッケージ登録を行った。
時々PR
github/kobake/bitcoin-msvc
bitcoin-msvc.sln
NuGet Gallery についてNuGet Repository
boost libevent2-vc140 miniupnpc-vc140
leveldb-vc140
openssl-vc141 libzmq-vc141secp256k1-vc141
github/bitcoin/bitcoin
_bitcoin_common.vcxproj
bitcoind.vcxproj
fork元
これだけ既存(それ以外は kobake がパッケージング)
sample.vcxproj
bitcoin-cli.vcxproj
NuGet Gallery の kobake 登録パッケージ現状
人様のライブラリを勝手に NuGet 化しまくった結果。
※怒られたら何かしら対応考えます。
※一応この中では BitflyerApi だけは自作ライブラリです(ぼそり)
さて早速デバッグ環境を活用しましょう
https://github.com/kobake/bitcoin-msvc
このリポジトリ上の .sln ファイルを Visual Studio 2017 で
開くだけでビルドできます。
さて早速デバッグ環境を活用しましょう
例:鍵データを作る単体実験を行ってみる(時間あればデモ)
https://github.com/kobake/bitcoin-msvc/blob/master/sample/sample.cppint main(){ ECC_Start();
CKey key; key.MakeNewKey(false);
CPubKey pubkey = key.GetPubKey(); uint256 hash = pubkey.GetPublicKeyHash(); // 256bits = 32bytes binary
// 64文字長HEX文字列 例: "65d5f35db59351506de1da46cfc33005d5d6e2325667ed70c42f5bcb8a944b8d" std::string hashStr = hash.ToHexString(); printf("PUBLIC HASH: %s (%d)\n", hashStr.c_str(), hashStr.length());
ECC_End();}
さて早速デバッグ環境を活用しましょう
例:bitcoind等も当然起動できる(時間あればデモ)
デバッグ環境構築による成果
・PRが1件マージされました (2017年3月4日)https://github.com/bitcoin/bitcoin/pull/9916
・プログラム上の問題を発見・レポートできました (2017年3月21日)https://github.com/bitcoin/bitcoin/issues/10041
眺める・動かす・改造する
・まずは動かす。これは基本です。
・次のステップとして設定をいじりまくってみる。
・さらに次のステップとしてプログラム本体の改造とかしてみる。
これが「本物の」理解への近道です。
みんなソースコードいじっていきましょう。
ついでにコントリビュートもしていきましょう。
宣伝
・2017年5月22日(月) 秋葉原 Web系もくもく会#2
https://general.connpass.com/event/57503/
・2017年6月予定(日程調整中) Webフレームワーク品評会:登壇者募集中
http://qiita.com/kobake@github/items/9394b66430de1951fbcc