とにかく新しいソースでCatapultをcatapult-service-bootstrapで動かす

次期nemネットワークを担う、絶賛開発中のcatapultはオープンソースなので動作の保証はともかく、
gitリポジトリから最新のコードを手に入れて動かしてみることはできます。

しかし、実際に動作確認をするには結構手間です。
(ノードにそれぞれ役割があるので、１つのネットワークを自分で立てるには諸々手間がかかるという意味です)

そんなcatapultネットワークを`docker-compose up`で立ち上げ、
数分後にはアクセスできるようにしてくれるのが、[tech\-bureau/catapult\-service\-bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap) です。

しかし、このセットアップはある程度安定したバージョンがリリースされないとdockerイメージを更新したものがリリースされません。

今現在リリースされているのはコードネーム`Bison`版ですが、続いて`Cow`版、`Dragon`版、`E<禁則事項>`版、
そして`<禁則事項>`版がそれぞれの段階でリリースされてからの公開になるでしょう。

この記事は、セットアップが簡単な`catapult-service-bootstrap`を利用しつつ、最新のソースでネットワークを動かす試みです。


# 大まかな方針

単純ですが、`docker-compose.yml`で指定されているイメージを、
自前でビルドしたものと置き換えて、実行します。
とはいえ、いくつかのアプリケーションが組み合わさって動くものなので、
組み合わせによってはまともに動かないかもしれません。
無駄に興味がある人向けです。


## catapult-server

[luxtagofficial/catapult\-server: Dockerfiles to build catapult](https://github.com/luxtagofficial/catapult-server)

LUXTAG公式にCatapultサーバのDockerイメージ化リポジトリがありました。
超便利なのでこれで行きましょう。


## catapult-rest

catapult-rest の Dockerfile を書きました。
catapult-service-bootstrap で使われているイメージと中身はちょっと違うかもしれませんが、
同じように動作するようにセットアップしてます。

[44uk/catapult\-rest at dockerfile](https://github.com/44uk/catapult-rest/tree/dockerfile)

もしかしたらこのブランチが最新のソースに追いついていないということがあるかもしれないので、
その場合はDockerfileをパクるなりしてください。


## catapult-block-explorer

エクスプローラのソースも公開されたっぽいので、これを使います。
Dockerfileがあるのでビルドします。

[AnthonyLaw/catapult\-block\-explorer: Catapult Blockchain Explorer](https://github.com/AnthonyLaw/catapult-block-explorer)


# イメージをビルド

もうここから先はDockerの話になりますが、それぞれのイメージをビルドします。
タグ名は`my-*`にしましたが、これは各々お好みでどうぞ。

## luxtagofficial/catapult-server

このビルドは結構時間がかかります。
マシンスペックにもよりますが、大体2時間くらいでしょうか。

```console
$ cd server
$ docker build -t my-catapult-server .
```

https://github.com/luxtagofficial/catapult-server/blob/master/server/Dockerfile#L15

ちなみにこの行でcloneしてくるブランチを指定していたので、任意のコミットの`catapult-server`が欲しかったら書き換えるとよさそうです。


## 44uk/catapult-rest

```console
$ docker build -t my-catapult-rest-server .
```

＊ 追記
`luxtagofficial/catapult-server` にも `catapult-rest` が含まれていました。
こちらをつかってみてもいいかもしれません。


## AnthonyLaw/catapult-block-explorer

```console
$ docker build -t my-catapult-block-explorer .
```


# 指定イメージの書き換え

イメージがビルドできたら、`catapult-service-bootstrap`の`docker-compose.yml`で指定しているイメージを置き換えていきましょう。

```yml:dockerfile.yml

rest-gateway:
  # image: techbureau/catapult-rest-server:1.0.8
  image: my-catapult-rest-server

block-explorer:
  # image: techbureau/catapult-block-explorer
  image: my-catapult-block-explorer

```

こちらはDockerfileで指定されているファイルを直接変更してください。

```dockerfiles/catapult/Dockerfile
# FROM  techbureau/catapult-server:gcc-0.2.0.2
FROM my-catapult-server
```

```dockerfiles/nemgen/Dockerfile
# FROM  techbureau/catapult-tools:gcc-0.2.0.2
FROM my-catapult-server
```


# bootstrapを起動

イメージとコンテナを再作成させつつ立ち上げます。

```console
$ docker-compose up --build --force-recreate
```

もしかするとバージョンによってはブロックへの仕様変更で動作しなくなるかもしれないので、
起動する前に `./clean-data` を実行してチェーンを削除したほうが良いと思います。
(`./clean/all` は生成した設定やnemesis等も削除します。こっちを実行しないとダメなケースがあるかもしれません)


## 設定ファイルの修正

設定テンプレートの修正が必要になる場合があるかもしれません。

`ruby/catapult-templates`以下に起動時に生成されるファイルの元になるものがあるので、
必要に応じて修正します。
(何をどう修正すればいいかは、catapultやrest-serverの変更を見ないとわかりませんが…)

たとえば、執筆時点では、どうやら`catapult-rest`の`namespace`プラグインが`namespace`と`mosaic`プラグインに分離されたようなので、
`catapult-service-bootstrap/ruby/catapult-templates/rest_gateway/rest.json.mt`に
`mosaic`プラグインの読み込みを書き加えてあげないといけない、なんてことがありました。


# ＊

この方法で一応ブロックが生成されていくところまでは確認しました。
が、細かいところまでは確認していないので、動作不良があるかもしれません。
(上記の方法はなにか問題があるようであれば加筆修正していきます)

とりあえず今やってみたところ、見事に仕様が変わってて`catapult-rest`がエラーを起こして、
レスポンスが得られなかったりしました…。

なんにせよ`server`と`rest`で機能の実装・公開のタイミングが揃ってなかったりするので、正式リリースを待つほうが懸命です。

エクスプローラなんかは割と新しめでも動くので差し替えてみると面白いかもしれません。

今回はすべてを`master`ブランチでビルドしていますが、
Dockerfileだけ利用すれば特定のソースを取得してビルドするということもできますね。

`catapult-service-bootstrap`は便利ですが、イメージの更新が遅いので
(安定版のイメージでリリースされるっぽい)、
軽微なバグが取りこまれたサーバで動かしたい場合には良いかと思います。

特にcatapult-restの方はブロック情報の取得やトランザクションの送信で
直接やり取りをするサーバなので新しいものに差し替えてみると、
早そうで早くない少し早い実装に触れられるかもしれません。

ぶっちゃけ、手探りせざる負えないのでおとなしく正式リリース待ったほうが良さそうですけどね。

「そんなもんじゃ、憧れは止められねえんだ！」

なんてね。