LIVAでカタパルトを動かしてみる

# はじめに

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

それがきっかけで、LIVAっていうミニPCを持っていたのを思い出した。

なので、これでカタパルトを動かしてみたいと思う。

# LIVA

![IMG_20190512_000942.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/adb9c2b4-7b0e-c54f-53e2-0f0c08c6791c.jpeg)


https://www.links.co.jp/item/liva-c0-2g-64g-w/

> CPU	Intel Bay Trail-M SoC Celeron N2807
> メモリ	2GB DDR3L
> ストレージ	eMMC 64GB

大きさは、スマホの箱くらいでしょうか。

価格は、２万円くらいだったと思います。

電源は5V/3Aで、端子がMicro USB形状なので、モバイルバッテリーでも動かした例があるらしい。

# OSインストール

Ubuntu Server 18.04.2 LTSのISOをダウンロード

https://www.ubuntu.com/download/server

Universal-USB-Installerを使ってUSBインストール

https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

# ビルド

以下の公式手順に従ってコマンドをコピペする。

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

半日以上かかったが、エラーなくビルドできた。

作業ディレクトリは`/home/liva`だったので、バイナリは`/home/liva/catapult-server/_build/bin`にできている。

```sh
liva@liva:~$ ls -l /home/liva/catapult-server/_build/bin/
total 374968
-rwxrwxr-x 1 liva liva   777832 May 11 09:17 bench.catapult.crypto.hashers
-rwxrwxr-x 1 liva liva   866408 May 11 09:17 bench.catapult.crypto.verify
drwxrwxr-x 2 liva liva     4096 May 11 09:15 boost
-rwxrwxr-x 1 liva liva  3324512 May 11 10:52 catapult.server
-rwxrwxr-x 1 liva liva  1045088 May 11 12:44 catapult.tools.address
-rwxrwxr-x 1 liva liva  1222352 May 11 12:44 catapult.tools.benchmark
-rwxrwxr-x 1 liva liva  2498432 May 11 12:44 catapult.tools.health
-rwxrwxr-x 1 liva liva  3106376 May 11 12:44 catapult.tools.nemgen
-rwxrwxr-x 1 liva liva  2306168 May 11 12:44 catapult.tools.network
-rwxrwxr-x 1 liva liva   752152 May 11 12:44 catapult.tools.statusgen
(省略)
```

# 設定

起動するためのファイル類を作っていく。

今回は、このマシンだけのプライベートチェーンで、Peerノードしか立てない。なのでトランザクションを投げる手段がないが、とりあえずやってみる。

```
catapult1
├── data
├── nemesis
│   └── block-properties-file.properties
├── nemgen.sh
├── start.sh
└── userconfig
    └── resources
        ├── config-database.properties
        ├── config-harvesting.properties
        ├── config-logging.properties
        ├── config-messaging.properties
        ├── config-networkheight.properties
        ├── config-network.properties
        ├── config-node.properties
        ├── config-pt.properties
        ├── config-task.properties
        ├── config-timesync.properties
        ├── config-user.properties
        ├── peers-api.json
        └── peers-p2p.json
```

特に変えたものを並べてみる

## nemgen

catapult-service-bootstrapを参考に組み立てる

https://github.com/tech-bureau/catapult-service-bootstrap/blob/v0.3.0/dockerfiles/nemgen/userconfig/nemgen.sh

```sh:nemgen.sh
#!/bin/bash

PATH=/home/liva/catapult1

/bin/mkdir -p ${PATH}/data/seed/mijin-test/00000
/bin/dd if=/dev/zero of=${PATH}/data/seed/mijin-test/00000/hashes.dat bs=1 count=64
/home/liva/catapult-server/_build/bin/catapult.tools.nemgen --nemesisProperties ${PATH}/nemesis/block-properties-file.properties --resources ${PATH}/userconfig/
/bin/cp -r ${PATH}/data/seed/mijin-test/* ${PATH}/data
```

ネメシスブロックの出力先を指定する

```:block-properties-file.properties
...
[output]

cppFile = 
binDirectory = /home/liva/catapult1/data/seed/mijin-test
...
```

## server

同様に

https://github.com/tech-bureau/catapult-service-bootstrap/blob/v0.3.0/dockerfiles/catapult/userconfig/prepare.sh

```sh:start.sh
/home/liva/catapult-server/_build/bin/catapult.server /home/liva/catapult1/userconfig
```

データファイルの場所を指定する

```:config-user.properties
...
[storage]

dataDirectory = /home/liva/catapult1/data
pluginsDirectory = 
```

# 実行

## nemgen

うまくいった

```
2019-05-11 13:36:29.095706 0x00007f468b37c380: <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
```

## server

うまく読み込んだ

```
2019-05-11 13:37:28.029640 0x00007fd537d7b000: <info> (extensions::NemesisBlockLoader.cpp@54) 
      nemesis network id: Mijin_Test
      nemesis public key: 7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE
 nemesis generation hash: C6871CB9FA666FF20B93DCE6D7E25196EFBAFDFF3989AC00C76BD8E1DCEE9AEE 
2019-05-11 13:37:28.039450 0x00007fd537d7b000: <debug> (utils::StackLogger.h@35) pushing scope 'PosImportanceCalculator::recalculate' 
2019-05-11 13:37:28.039711 0x00007fd537d7b000: <debug> (observers::PosImportanceCalculator.cpp@67) recalculated importances (11 / 35 eligible) 
2019-05-11 13:37:28.039835 0x00007fd537d7b000: <debug> (utils::StackLogger.h@41) popping scope 'PosImportanceCalculator::recalculate' (0ms) 
2019-05-11 13:37:28.039997 0x00007fd537d7b000: <info> (extensions::NemesisBlockLoader.cpp@76) Nemesis Mosaics:
      C 119E15661E9B2758: 8999999998000000
      H 2AECBFD76AE7411B: 17000000 
2019-05-11 13:37:28.046273 0x00007fd537d7b000: <info> (extensions::NemesisBlockLoader.cpp@54) 
      nemesis network id: Mijin_Test
      nemesis public key: 7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE
 nemesis generation hash: C6871CB9FA666FF20B93DCE6D7E25196EFBAFDFF3989AC00C76BD8E1DCEE9AEE 
2019-05-11 13:37:28.050569 0x00007fd537d7b000: <debug> (utils::StackLogger.h@35) pushing scope 'PosImportanceCalculator::recalculate' 
2019-05-11 13:37:28.050714 0x00007fd537d7b000: <debug> (observers::PosImportanceCalculator.cpp@67) recalculated importances (11 / 35 eligible) 
2019-05-11 13:37:28.050776 0x00007fd537d7b000: <debug> (utils::StackLogger.h@41) popping scope 'PosImportanceCalculator::recalculate' (0ms) 
2019-05-11 13:37:28.050870 0x00007fd537d7b000: <info> (extensions::NemesisBlockLoader.cpp@76) Nemesis Mosaics:
      C 119E15661E9B2758: 8999999998000000
      H 2AECBFD76AE7411B: 17000000 
```

祝、ブロック生成

```
2019-05-11 13:37:58.303949 0x00007fd5117fa700: <debug> (consumers::BlockChainProcessor.cpp@49) cache state hash (7 components) at height 2
4EAD940B032801AA7ACA4AD6E42955BB696C1F7582E0E5F624DFA23A5FDF2F7D
 + 54B46FB6BD08EA549C78CCFF1893B1B6CD060690522FC95D0B37320F39C41433
 + 7EA827EB9A862C95EED988E3D5757C7B0F23BC99757FF6925F6FCC4447C6B864
 + 1CA8F8AB2C2513B1ADFE050AB85C91D648837A52B82A19A69A9DBFCC78405B51
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000 
2019-05-11 13:37:58.378151 0x00007fd510ff9700: <debug> (consumers::NewBlockConsumer.cpp@53) forwarding a new block with height 2 
2019-05-11 13:37:58.378641 0x00007fd510ff9700: <info> (disruptor::ConsumerDispatcher.cpp@43) completing processing of element 1 (1 blocks (heights 2 - 2) [4D699175] empty from Local), last consumer is 0 elements behind 
```

# おわりに

普通にできた。

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