はじめに
カタパルトとは
ブロックチェーン/暗号資産/暗号通貨/仮想通貨であるNEMの次期バージョンである。
現行をNEM1やNIS1やv1、次期をNEM2やNIS2やv2やカタパルトと呼んだり書いたりする。
NIS = NEM Infrastructure Server
きっかけ
nem2のSlackで、ラズパイでカタパルトノードが動くかみたいな話があった。たしか、結論として、難しいみたいな話だったと思う。
まぁでも、たぶん安いからやってみようかなと思った。
情報を探してみると、Ubuntuがインストールできるやつがあるみたい的なことがわかった。
なのでやってみた。
買う
Raspberry Pi 3 B+
ここで買いました
microSD
64GBを買いました
セットアップ
イメージのダウンロード
Ubuntu 18.04.02 では、ラズパイのインストールが簡単になったようです。
こちらをダウンロードします。
Hard-Floatではなくて、64-bit ARMのほうです。
rufusでmicroSDにイメージを書き込みます。
RasPi起動
電源をさします。
SSHが使えるので、リモートから入ります。IDもパスワードもubuntu
です。ログインするとパスワードの変更を求められます。
カタパルトのビルド
基本的にはこちらの手順に従います。
少しずつ変えたところがあるので、各項目ごとに説明します。
Prerequisites
手順通り
Boost
最後から2番目のコマンドのみ変更しました。スペックが低いので、1多重で動かします。
./b2 --prefix=${HOME}/boost-build-1.69.0 -j 1 stage release
Gtest
手順通り
Google benchmark
手順通り
Mongo
mongocxxのインストール中に、メモリ不足になります。
...
[ 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を作成します。
sudo su -
dd if=/dev/zero of=tmpswap bs=1024 count=1M
mkswap tmpswap
swapon tmpswap
free
コマンドでSwap
が出てきたら成功です。
$ free
total used free shared buff/cache available
Mem: 933944 105236 406924 4400 421784 809076
Swap: 1048572 0 1048572
そのあと、手順通り
ZMQ
手順通り
Rocks
手順通り
CATAPULT
最後のコマンドのみ変更しました。スペックが低いので、1多重で動かします。
ninja -j1
コツ
とても時間がかかります。24時間くらいかかると思います。
Boostのビルドとcatapult-serverのビルドが長いです。
あらかじめスワップを作成しておき、そのあと全コマンドを羅列したシェルスクリプトを作って、nohup
で走らせておくのがよいと思います。
nohup ./build.sh &
nohup.out
に標準出力が出るので、好きな時にtail -f nohup.out
するとのぞけます。
24時間くらいたつと、ビルドできていると思います。
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
...
起動
起動方法は以下のと同じです。
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
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
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ノードにしたらどうなるか、とかを試してみたい。