Visual Studio による Bitcoin プログラミング

46
Visual Studio による Bitcoin プログラミング kobake@ビットコインとか勉強会#7

Transcript of Visual Studio による Bitcoin プログラミング

Page 1: Visual Studio による Bitcoin プログラミング

Visual Studio によるBitcoin プログラミング

kobake@ビットコインとか勉強会#7

Page 2: Visual Studio による Bitcoin プログラミング

メモ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率

Page 3: Visual Studio による Bitcoin プログラミング

自己紹介

@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 依存症。

Page 4: Visual Studio による Bitcoin プログラミング

今日のお話

・Bitcoin Core のソースコードをバリバリいじっていきたい

・できれば Visual Studio でコーディング&デバッグできたら最高だよね

 → 実現しました(紆余曲折あり)

Page 5: Visual Studio による Bitcoin プログラミング

今日のお話

・Bitcoin Core のソースコードをバリバリいじっていきたい

・できれば Visual Studio でコーディング&デバッグできたら最高だよね

 → 実現しました(紆余曲折あり)

☝今回はここの話が割と長いです。ご容赦。

Page 6: Visual Studio による Bitcoin プログラミング

Q. 何故 Bitcoin Core のソースコードをいじるのか

・バグ修正?

・機能追加?

・ハードフォーク??

Page 7: Visual Studio による Bitcoin プログラミング

Q. 何故 Bitcoin Core のソースコードをいじるのか

・バグ修正?

・機能追加?

・ハードフォーク??

↓NO (結果的にはコントリビュートにも繋がったが僕の本来の目的は違う)

Page 8: Visual Studio による Bitcoin プログラミング

Q. 何故 Bitcoin Core のソースコードをいじるのか

A. Bitcoin Core のロジックを深く理解するため。

Page 9: Visual Studio による Bitcoin プログラミング

Q. 何故 Bitcoin Core のソースコードをいじるのか

A. Bitcoin Core のロジックを深く理解するため。

Bitcoin Core の理解のステップ

・文献を読む (wiki および Mastering Bitcoin オススメ。あと論文もね。)

・普通に動かす

・設定をいじって動かす

・コードを読む

・コードを改造して動かす ← 今ココ

Page 10: Visual Studio による Bitcoin プログラミング

HostHostHost

Bitcoin のおおまかな仕組み

bitcoind(ノード本体)

bitcoin-cli(コマンドライン

ツール)

bitcoind(ノード本体)

bitcoind(ノード本体)

Page 11: Visual Studio による Bitcoin プログラミング

ノード構築

Host

bitcoind(ノード本体)

bitcoin-cli(コマンドライン

ツール)

regtest=1

server=1rpcuser=hogerpcpassword=xxxxx

~/.bitcoin/bitcoin.conf

※今回は実験ネットワークを構築するので regtest=1 とします

これらは実行バイナリをDLしてきて設置。またはビルドにより構築。

今回は実行バイナ

リをDLしてくるので

はなく、ビルドにより

バイナリを生成しま

す。

Page 12: Visual Studio による Bitcoin プログラミング

ビルドについて

・今回は 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

Page 13: Visual Studio による Bitcoin プログラミング

Windowsビルドについて

https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。

一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。

Page 14: Visual Studio による Bitcoin プログラミング

Windowsビルドについて

https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。

一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、

Page 15: Visual Studio による Bitcoin プログラミング

Windowsビルドについて

https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。

一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、

→ 邪道では?

Page 16: Visual Studio による Bitcoin プログラミング

Windowsビルドについて

https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.mdこれ、Windows ビルドと言いながら実は Ubuntu on Windows を使ってます。

一応 MinGW を通す形になるので .exe 形式の実行ファイルができます。が、

→ 邪道では?

→ msbuild させろ!

Page 17: Visual Studio による Bitcoin プログラミング

ところで MinGW gcc デバッグビルドに関する罠

本当のところを言うと、最初は MinGW の gcc ビルドしたやつのデバッグで良いかな、と

思ってました。ところで Bitcoin Core のビルド時には configure にデバッグビルドオプ

ションが付けられます。(これを付けると gcc に「-g3 -O0」オプションが付きます)

$ ./autogen.sh$ ./configure --enable-debug$ make…..

Page 18: Visual Studio による Bitcoin プログラミング

ところで 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 関連モジュールがでかすぎてビルド失敗する…

Page 19: Visual Studio による Bitcoin プログラミング

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

Page 20: Visual Studio による Bitcoin プログラミング

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.→ 何故か落ちる

Page 21: Visual Studio による Bitcoin プログラミング

MinGW gdb の罠:検証

・いろいろ手あたり次第試した結果ですが、プログラムのサイズが大きすぎると MinGW gdb がうまく動かないようです。(bitcoind を構成するコードを大きく削り落としたら gdb でもデバッグできるようになった。サイズまたはシンボル数の問題かと思われる)

・MSYS2 / MinGW-w64 等の環境でも試してみたが、やはり同様の問題に遭遇。(gdb でブレークポイントが張れなかったり異常終了したり)

・とにかく MinGW 系の環境だと、サイズの大きいプログラムのデバッグに難がある(根

本的な原因は不明)ようなので、今回は諦める。

Page 22: Visual Studio による Bitcoin プログラミング

というわけで

MinGW のことは一旦忘れる

Page 23: Visual Studio による Bitcoin プログラミング

というわけで

MinGW のことは一旦忘れる

↓結局 Linux バイナリが安定デバッグで

きるのでそっちに寄せよう

Page 24: Visual Studio による Bitcoin プログラミング

最も簡単な(?) Visual Studio による Bitcoin デバッグ

Linux

bitcoind bitcoin codeビルド

gdb

Windows

Visual StudioWinGDB

bitcoin code

dependencies・OpenSSL・livevent・boost・libzmq等、諸々

同期

dependencies

同期?

ssh tunnel

attach

Page 25: Visual Studio による Bitcoin プログラミング

最も簡単な(?) Visual Studio による Bitcoin デバッグ

Linux

bitcoind bitcoin codeビルド

gdb

Windows

Visual StudioWinGDB

bitcoin code

dependencies・OpenSSL・livevent・boost・libzmq等、諸々

同期

dependencies

同期?

ssh tunnel

attach

このへんの同期めんどい

Page 26: Visual Studio による Bitcoin プログラミング

最も簡単な(?) Visual Studio による Bitcoin デバッグ

Linux

bitcoind bitcoin codeビルド

gdb

Windows

Visual StudioWinGDB

dependencies・OpenSSL・livevent・boost・libzmq等、諸々

ssh tunnel

attach

sambasamba を介することで同期問題解消

Page 27: Visual Studio による Bitcoin プログラミング

最も簡単な(?) Visual Studio による Bitcoin デバッグ

Linux

bitcoind bitcoin codeビルド

gdb

Windows

Visual StudioWinGDB

dependencies・OpenSSL・livevent・boost・libzmq等、諸々

ssh tunnel

attach

samba

悪くないけど重い

samba を介することで同期問題解消

Page 28: Visual Studio による Bitcoin プログラミング

最も簡単な(?) Visual Studio による Bitcoin デバッグ

Linux

bitcoind bitcoin codeビルド

gdb

Windows

Visual StudioWinGDB

dependencies・OpenSSL・livevent・boost・libzmq等、諸々

ssh tunnel

attach

samba

悪くないけど重い

実はこっちも重い。辛い。

samba を介することで同期問題解消

Page 29: Visual Studio による Bitcoin プログラミング

一応 WinGDB によるデバッグ模様を共有

https://twitter.com/kobake_/status/815338953691664384

AWS EC2 インスタンス上の Amazon Linux で bitcoind を動かしてます。

それを手元の ThinkPad からリモートデバッ

グ。このために WinGDB を買った ($89)。

リッチではある。だが、重い。

Page 30: Visual Studio による Bitcoin プログラミング

WinGDB によるアタッチは悪くないが

・パフォーマンスが悪いので気持ちが辛くなってきた。

Page 31: Visual Studio による Bitcoin プログラミング

もう…msbuild対応するぞ

Page 32: Visual Studio による Bitcoin プログラミング

いっそ msbuild 対応するぞ

・理想を言うと Visual Studio で .sln ファイル開いて「ビルドメニュー」ポチッ1発で Bitcoin Core 起動したいんじゃ。

Page 33: Visual Studio による Bitcoin プログラミング

いっそ 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コミット。絶賛リファクタ中なので汚いところはご容赦。

Page 34: Visual Studio による Bitcoin プログラミング

Visual Studio 版 Bitcoin の依存解決

・msbuild でやる以上、automake とか yum とかの仕組みは使えない

・そもそもビルドするための環境準備を各人にやらせるのは不毛

・依存解決は全自動の方向

Page 35: Visual Studio による Bitcoin プログラミング

Visual Studio 版 Bitcoin の依存解決

・msbuild でやる以上、automake とか yum とかの仕組みは使えない

・そもそもビルドするための環境準備を各人にやらせるのは不毛

・依存解決は全自動の方向

 → NuGet Gallery を用いる。

Page 36: Visual Studio による Bitcoin プログラミング

NuGet Gallery について

・主に .NET 系のライブラリを登録するリポジトリだが、.NET 関係ない C++ 系ライブラリ

等も利用できる。

・Visual Studioプロジェクトの依存先として NuGet パッケージを指定しておくと、ビルド時

に必要なパッケージを自動的にダウンロードして依存解決してくれる。

・立ち位置としては Ruby でいうところの gem とか Python でいうところの pip みたいなも

の。

・Microsoft アカウントがあれば誰でもパッケージを登録できる。

・Boost C++ Libraries 等のメジャーなライブラリパッケージは既に存在しているのでそれ

を利用。

Page 37: Visual Studio による Bitcoin プログラミング

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 パッケージ登録を行った。

Page 38: Visual Studio による Bitcoin プログラミング

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 パッケージ登録を行った。

Page 39: Visual Studio による Bitcoin プログラミング

時々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

Page 40: Visual Studio による Bitcoin プログラミング

NuGet Gallery の kobake 登録パッケージ現状

人様のライブラリを勝手に NuGet 化しまくった結果。

※怒られたら何かしら対応考えます。

※一応この中では BitflyerApi だけは自作ライブラリです(ぼそり)

Page 41: Visual Studio による Bitcoin プログラミング

さて早速デバッグ環境を活用しましょう

https://github.com/kobake/bitcoin-msvc

このリポジトリ上の .sln ファイルを Visual Studio 2017 で

開くだけでビルドできます。

Page 42: Visual Studio による Bitcoin プログラミング

さて早速デバッグ環境を活用しましょう

例:鍵データを作る単体実験を行ってみる(時間あればデモ)

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();}

Page 43: Visual Studio による Bitcoin プログラミング

さて早速デバッグ環境を活用しましょう

例:bitcoind等も当然起動できる(時間あればデモ)

Page 44: Visual Studio による Bitcoin プログラミング

デバッグ環境構築による成果

・PRが1件マージされました (2017年3月4日)https://github.com/bitcoin/bitcoin/pull/9916

・プログラム上の問題を発見・レポートできました (2017年3月21日)https://github.com/bitcoin/bitcoin/issues/10041

Page 45: Visual Studio による Bitcoin プログラミング

眺める・動かす・改造する

・まずは動かす。これは基本です。

・次のステップとして設定をいじりまくってみる。

・さらに次のステップとしてプログラム本体の改造とかしてみる。

これが「本物の」理解への近道です。

みんなソースコードいじっていきましょう。

ついでにコントリビュートもしていきましょう。

Page 46: Visual Studio による Bitcoin プログラミング

宣伝

・2017年5月22日(月) 秋葉原 Web系もくもく会#2

https://general.connpass.com/event/57503/

・2017年6月予定(日程調整中) Webフレームワーク品評会:登壇者募集中

http://qiita.com/kobake@github/items/9394b66430de1951fbcc