Raspberry Pi 3 Model B+でカタパルトを動かす

# はじめに

## カタパルトとは

ブロックチェーン／暗号資産／暗号通貨／仮想通貨である[NEM](https://nem.io/)の次期バージョンである。

現行をNEM1やNIS1やv1、次期をNEM2やNIS2やv2やカタパルトと呼んだり書いたりする。

NIS = NEM Infrastructure Server

## きっかけ

nem2のSlackで、ラズパイでカタパルトノードが動くかみたいな話があった。たしか、結論として、難しいみたいな話だったと思う。

まぁでも、たぶん安いからやってみようかなと思った。

情報を探してみると、Ubuntuがインストールできるやつがあるみたい的なことがわかった。

なのでやってみた。

# 買う

## Raspberry Pi 3 B+

ここで買いました

https://raspberry-pi.ksyic.com/main/index/pdp.id/463/pdp.open/463

## microSD

64GBを買いました

https://www.amazon.co.jp/gp/product/B06XSWLYLF/

# セットアップ

## イメージのダウンロード

Ubuntu 18.04.02 では、ラズパイのインストールが簡単になったようです。

こちらをダウンロードします。

http://ubuntutym2.u-toyama.ac.jp/ubuntu-dvd/18.04.2/release/ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz

Hard-Floatではなくて、64-bit ARMのほうです。

rufusでmicroSDにイメージを書き込みます。

https://rufus.ie/

## RasPi起動

電源をさします。

SSHが使えるので、リモートから入ります。IDもパスワードも`ubuntu`です。ログインするとパスワードの変更を求められます。

## カタパルトのビルド

基本的にはこちらの手順に従います。

https://github.com/nemtech/catapult-server/blob/v0.3.0.2/BUILDING.md

少しずつ変えたところがあるので、各項目ごとに説明します。

### Prerequisites

手順通り

### Boost

最後から２番目のコマンドのみ変更しました。スペックが低いので、１多重で動かします。

```bash
./b2 --prefix=${HOME}/boost-build-1.69.0 -j 1 stage release
```

### Gtest

手順通り

### Google benchmark

手順通り

### Mongo

mongocxxのインストール中に、メモリ不足になります。

```bash
...
[ 79%] Building CXX object src/mongocxx/test/CMakeFiles/test_driver.dir/collection.cpp.o

cc1plus: out of memory allocating 28380688 bytes after a total of 391139328 bytes
src/mongocxx/test/CMakeFiles/test_driver.dir/build.make:206: recipe for target 'src/mongocxx/test/CMakeFiles/test_driver.dir/collection.cpp.o' failed
make[2]: *** [src/mongocxx/test/CMakeFiles/test_driver.dir/collection.cpp.o] Error 1
CMakeFiles/Makefile2:942: recipe for target 'src/mongocxx/test/CMakeFiles/test_driver.dir/all' failed
make[1]: *** [src/mongocxx/test/CMakeFiles/test_driver.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
```

swapを作成します。

```bash
sudo su -
dd if=/dev/zero of=tmpswap bs=1024 count=1M
mkswap tmpswap
swapon tmpswap
```

`free`コマンドで`Swap`が出てきたら成功です。

```bash
$ free
              total        used        free      shared  buff/cache   available
Mem:         933944      105236      406924        4400      421784      809076
Swap:       1048572           0     1048572
```

そのあと、手順通り

### ZMQ

手順通り

### Rocks

手順通り

### CATAPULT

最後のコマンドのみ変更しました。スペックが低いので、１多重で動かします。

```bash
ninja -j1
```

### コツ

とても時間がかかります。24時間くらいかかると思います。

Boostのビルドとcatapult-serverのビルドが長いです。

あらかじめスワップを作成しておき、そのあと全コマンドを羅列したシェルスクリプトを作って、`nohup`で走らせておくのがよいと思います。

```bash
nohup ./build.sh &
```

`nohup.out`に標準出力が出るので、好きな時に`tail -f nohup.out`するとのぞけます。

24時間くらいたつと、ビルドできていると思います。

```bash
ubuntu@ubuntu:~$ ls -l catapult-server/_build/bin/
uotal 378152
urwxrwxr-x 1 ubuntu ubuntu   741312 May 29 02:05 bench.catapult.crypto.hashers
urwxrwxr-x 1 ubuntu ubuntu   823496 May 29 02:05 bench.catapult.crypto.verify
urwxrwxr-x 2 ubuntu ubuntu     4096 May 29 01:55 boost
urwxrwxr-x 1 ubuntu ubuntu  3337768 May 29 08:21 catapult.server
urwxrwxr-x 1 ubuntu ubuntu  1047512 May 29 15:17 catapult.tools.address
urwxrwxr-x 1 ubuntu ubuntu  1239680 May 29 15:17 catapult.tools.benchmark
urwxrwxr-x 1 ubuntu ubuntu  2479736 May 29 15:17 catapult.tools.health
urwxrwxr-x 1 ubuntu ubuntu  3141312 May 29 15:17 catapult.tools.nemgen
urwxrwxr-x 1 ubuntu ubuntu  2290848 May 29 15:17 catapult.tools.network
urwxrwxr-x 1 ubuntu ubuntu   795592 May 29 15:17 catapult.tools.statusgen
...
```

# 起動

起動方法は以下のと同じです。

https://qiita.com/planethouki/items/6ab68010cd7d5654b8f7

```bash
2019-05-29 23:56:29.992477 0x0000ffffa9714440: <info> (nemgen::main.cpp@87) *** Nemesis Summary ***
           Height: 1
  Generation Hash: C6871CB9FA666FF20B93DCE6D7E25196EFBAFDFF3989AC00C76BD8E1DCEE9AEE
Transactions Hash: 814C8164E99927A30BD6D06212EB10D1A5C3F6A4458045B40E0AD7FDF702117F
    Receipts Hash: 6419DD8BAA202763D1B5946F877C9B728F344D7A5365FBC3622CB049EB7B88A5
       State Hash: E20FE3D20B709572558E21C13A99BF7CFE66D3BED9C4BF082AAE0E6FC1A95612
--- Components (7) ---
 + 13067B2FEB08F5C99547B4A5C30D9581D1D8E22F817A542AEF8E02684CADA2DC
 + 7EA827EB9A862C95EED988E3D5757C7B0F23BC99757FF6925F6FCC4447C6B864
 + 1CA8F8AB2C2513B1ADFE050AB85C91D648837A52B82A19A69A9DBFCC78405B51
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
```

```bash
2019-05-29 23:57:52.309073 0x0000ffff8b60a010: <info> (extensions::NemesisBlockLoader.cpp@54) 
      nemesis network id: Mijin_Test
      nemesis public key: 7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE
 nemesis generation hash: C6871CB9FA666FF20B93DCE6D7E25196EFBAFDFF3989AC00C76BD8E1DCEE9AEE
2019-05-29 23:57:52.325668 0x0000ffff8b60a010: <debug> (utils::StackLogger.h@35) pushing scope 'PosImportanceCalculator::recalculate'
2019-05-29 23:57:52.326198 0x0000ffff8b60a010: <debug> (observers::PosImportanceCalculator.cpp@67) recalculated importances (11 / 35 eligible)
2019-05-29 23:57:52.326373 0x0000ffff8b60a010: <debug> (utils::StackLogger.h@41) popping scope 'PosImportanceCalculator::recalculate' (0ms)
2019-05-29 23:57:52.326691 0x0000ffff8b60a010: <info> (extensions::NemesisBlockLoader.cpp@76) Nemesis Mosaics:
      C 119E15661E9B2758: 8999999998000000
      H 2AECBFD76AE7411B: 17000000
2019-05-29 23:57:52.337125 0x0000ffff8b60a010: <info> (extensions::NemesisBlockLoader.cpp@54) 
      nemesis network id: Mijin_Test
      nemesis public key: 7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE
 nemesis generation hash: C6871CB9FA666FF20B93DCE6D7E25196EFBAFDFF3989AC00C76BD8E1DCEE9AEE
2019-05-29 23:57:52.341646 0x0000ffff8b60a010: <debug> (utils::StackLogger.h@35) pushing scope 'PosImportanceCalculator::recalculate'
2019-05-29 23:57:52.341932 0x0000ffff8b60a010: <debug> (observers::PosImportanceCalculator.cpp@67) recalculated importances (11 / 35 eligible)
2019-05-29 23:57:52.342057 0x0000ffff8b60a010: <debug> (utils::StackLogger.h@41) popping scope 'PosImportanceCalculator::recalculate' (0ms)
2019-05-29 23:57:52.342179 0x0000ffff8b60a010: <info> (extensions::NemesisBlockLoader.cpp@76) Nemesis Mosaics:
      C 119E15661E9B2758: 8999999998000000
      H 2AECBFD76AE7411B: 17000000
```

```bash
2019-05-29 23:58:35.836514 0x0000ffff83ffeee0: <debug> (utils::StackLogger.h@35) pushing scope 'generating candidate block'
2019-05-29 23:58:35.839656 0x0000ffff83ffeee0: <debug> (utils::StackLogger.h@41) popping scope 'generating candidate block' (3ms)
2019-05-29 23:58:35.840067 0x0000ffff83ffeee0: <info> (src::ScheduledHarvesterTask.cpp@35) successfully harvested block at 3 with signer 392378EA2BD2829CAEFE6955600EDD8E4CA86DA690A202BE03A017F805BFD8F3
2019-05-29 23:58:35.840290 0x0000ffff83ffeee0: <debug> (disruptor::Disruptor.cpp@42) disruptor queuing element 2 (1 blocks (heights 3 - 3) [946E50E9] from Local)
2019-05-29 23:58:35.883109 0x0000ffff4affcee0: <debug> (consumers::BlockChainProcessor.cpp@49) cache state hash (7 components) at height 2
4EAD940B032801AA7ACA4AD6E42955BB696C1F7582E0E5F624DFA23A5FDF2F7D
 + 54B46FB6BD08EA549C78CCFF1893B1B6CD060690522FC95D0B37320F39C41433
 + 7EA827EB9A862C95EED988E3D5757C7B0F23BC99757FF6925F6FCC4447C6B864
 + 1CA8F8AB2C2513B1ADFE050AB85C91D648837A52B82A19A69A9DBFCC78405B51
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
2019-05-29 23:58:35.884942 0x0000ffff4affcee0: <debug> (consumers::BlockChainProcessor.cpp@49) cache state hash (7 components) at height 3
4EAD940B032801AA7ACA4AD6E42955BB696C1F7582E0E5F624DFA23A5FDF2F7D
 + 54B46FB6BD08EA549C78CCFF1893B1B6CD060690522FC95D0B37320F39C41433
 + 7EA827EB9A862C95EED988E3D5757C7B0F23BC99757FF6925F6FCC4447C6B864
 + 1CA8F8AB2C2513B1ADFE050AB85C91D648837A52B82A19A69A9DBFCC78405B51
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
2019-05-29 23:58:36.063642 0x0000ffff4a7fbee0: <debug> (consumers::NewBlockConsumer.cpp@53) forwarding a new block with height 3
2019-05-29 23:58:36.064072 0x0000ffff4a7fbee0: <info> (disruptor::ConsumerDispatcher.cpp@43) completing processing of element 2 (1 blocks (heights 3 - 3) [EAAF6E7C] empty from Local), last consumer is 0 elements behind
```

普通にできました。

# おわりに

普通にできた。

次があれば、100万ブロックくらいの同期だったらどうなるか、APIノードにしたらどうなるか、とかを試してみたい。