以下の記事を参考にさせていただき、Dartを使ってブロックチェーン(のようなもの)を実装してみた。

動作の様子

以下がデモプログラムの動作時の動画になる。

ブロックチェーンは特にファイル等で永続的に残しているわけではない。Herokuはしばらくアクセスがないとアプリが停止するため、そのタイミングで情報がリセットされる。

ソースコードとローカルでのノードの立て方

ソースコードは以下に置いてある。設計部分は参考元サイトとほぼほぼ同じになっている。

ローカルPCでノードを立てる場合は、Dartの実行環境を整えた状態で、ソースコードをダウンロードし、以下のコマンドを実行すれば良い。

dart pub get
dart pub global activate webdev
webdev build --output web:public
dart bin/back.dart --port 6565

上記コマンドを実行後、ブラウザでhttp://localhost:6565/publicにアクセスすると、ノードの情報を確認できる。

bin/back.dartを実行する際、--peerオプションで、P2P通信を行うノードを指定できる。Heroku上のお試しノードを立ち上げた状態で、以下のようにbin/back.dartを実行すれば、Heroku上のノードとの取引を行うこともできる。

dart bin/back.dart --port 6565 --peer ws://dart-blockchain-test-app.herokuapp.com/ws

ローカルPC上のノードとHeroku上のノードはWebSocketでP2P通信を実現しており、簡単な構成図を書くと以下のようになる。

HerokuでDartアプリを動かす

今回Heroku上でDartアプリを実行できるようにした。Heroku上の設定周りは以下のリポジトリを利用させていただいた。

なお、上記リポジトリのREADME中にはheroku config:add BUILDPACK_URL=https://github.com/igrigorik/heroku-buildpack-dart.gitというコマンドでビルドパックを適用するよう書いてある。しかし、以下のプルリクエストにある通り、今はheroku buildpacks:set https://github.com/igrigorik/heroku-buildpack-dart.gitというコマンドでビルドパックを登録するのが正しいらしい。

とりあえず形にはなったが、まだまだ不明点がある

今回、ブロックチェーン(みたいなもの)を実装することで、ブロックチェーンへの理解が深まった。ただ、実装していく過程で、Bitcoinに対する疑問点が新たに出てきた。

  • マイナーへの報酬は普通のトランザクションと比べて特殊な形式になると思うが、どのような形式になっているか。
  • 大体のネット上の記事では"悪意のあるブロックチェーンを生成するには、善意のブロックチェーンよりも長いチェーンを生成する必要があるため困難"という説明がされている。difficultyを改竄できれば、計算能力が乏しくても、いくらでも長い悪意のあるブロックチェーンを生成できそうだが、そこら辺はどのように回避しているか。
  • P2P通信をどのように実現しているか。

アフィリエイト