RaspberryPi でブロックチェーンノードを構築する方法


この記事ではRaspberryPi4でブロックチェーンノードを構築して運用する方法を紹介します。

機器
===

| 機種  | 備考  |
|:-:|:-:|
| Raspberry Pi 4B | Raspberry Pi 4 [Amazon](https://amzn.to/3xpPqKc)または[RSオンライン](https://jp.rs-online.com/web/) で購入|
| SDカード  | できるだけ大容量なもの（2022.07現在で約80Gほど使用しています） |

※手元の環境では、１TBのSSDをUSBブートで起動して使っています。

手順
===

まず、ラズパイOSのイメージの準備から行います。
ライズパイのイメージの準備はいいよって方は「OSの初期設定」まで飛ばして下さい。

# SDカードに起動イメージを焼く

OSはUbuntu20.04.4LTSを使用します。（恐らく22.04でも動くと思いますが確証はありません）

```bash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

Raspberry Piに公式のイメージ書き込みツール「Raspberry Pi Imager」を使ってOSイメージを書き込みます。
[公式ページ](https://www.raspberrypi.com/software/)より「Raspberry Pi Imager」をダウンロードします。

起動するとこんな感じの画面が表示されます（バージョンはダウンロードタイミングによって変わります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/fc07cd63-898d-cd7e-8f0c-da3fa6777116.png)

「OSを選ぶ」を押すと下記のようなリストが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/bd315e06-03fe-799c-4b05-ef45b719bd41.png)

３番めの「Other general-purpose OS」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/3eb563c6-d9ef-9a2c-bff1-95944f9635b9.png)

「Ubuntu」を選択。
リストが表示されたら少し下の方へスクロールすると「Ubuntu Server 20.04.4 LTS(RPi 3/4/400」というのがあるのでそれをクリックします。（**64bit版**を選択してください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/8703ea04-6070-b6bb-2067-4ca9e6c0e2e3.png)

OSのイメージを選択すると最初の画面に戻ります。
OSのところが「UBUNTU SERVER ２０．０４．４LTS(RPI 3/4/400）」となっていることを確認して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/c871b0ae-7edd-8a01-47f4-e1b9438d83a7.png)

「ストレージを選ぶ」をクリックします。
SDカードをPCに接続していると下記のような状態になると思うので、書き込むストレージを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/80d95be2-7b3f-fe33-5e06-011324301596.png)

ストレージを選択すると最初の画面に戻ります。
選択したOSとストレージが正しいことを確認したら「書き込む」をクリックしてOSのイメージを書き込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/3248c75c-abd2-c52b-68b8-92adace98764.png)

# OSの初期設定

OSの初期設定を行います。
細かなことは下記の記事がとても参考になるのでそちらを参照下さい。全て設定する必要はないと思いますので自身に必要な部分のみ設定して下さい。
（※今回は**パッケージ自動アップデート**は切っておいたほうが良いです）

https://qiita.com/kotarella1110/items/f638822d64a43824dfa4

上記以外の設定（パッケージのインストール等）を下記で行います。

## Dockerインストール

まずはDockerをインストールします。
現在Dockerはarm64環境でも動作するのでUbuntu標準のパッケージから導入してみました。

```bash
$ sudo apt install --yes docker.io
```

インストールが完了したらバージョンを確認します。

```bash
$ sudo docker version
```

上記コマンドを打ってバージョン情報が表示されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/e8f6d1d6-9b9b-875a-640a-909e20906c9c.png)

## DcokerをUbuntuユーザー（root以外）で使用できる様にする

Dockerをインストールした状態ではRootユーザーでDockerを実行する必要があるので下記のコマンドを実行してUbuntuユーザーでも使用出来るようにします。

```bash
$ sudo usermod -aG docker ${USER}
```

一旦、コンソールからログアウトするか下記のコマンドで新しいグループメンバーシップを適用します。

```bash
$ su - ${USER}
```

## dcoker-composeのインストール

```bash
$ sudo apt install docker-compose
```

## Nodejsとnpmをインストールする

Symbolノードを構築する上でnpmが必要になるのでNodejsとnpmをインストールします。

```bash
$ sudo apt install nodejs npm
```

## Symbol-bootstrapをインストールする

Symbol-bootstrapはSymbolノードを構築するためのツールです。

```bash
$ npm install -g symbol-bootstrap
```

# ブロックチェーンノードの構築

さて、事前準備が全て整ったのでこれよりブロックチェーンノード（Symbolノード）を構築していきます。

ただ、ここで１つ注意点があります。
先程インストールしたSymbol-bootstrapはlinux/amd64しかサポートしていません。
ラズパイのCPUアーキテクチャはarm64です。
ですのでこのままではノードの起動に失敗してしまうので、symbol-bootstrapの設定ファイルを修正します。

2022/09/19追記
**Symbol-bootstrapで参照するDockerイメージの修正**についての作業は不要ということが判明しました。



## Symbol-bootstrapで参照するDockerイメージの修正（※この作業は不要です）

~~まず、npmのグローバルインストール先を調べます。~~

```bash
$ npm list -g | head -1
```

~~私の場合は下記のように表示されます。~~

```bash
$ /usr/local/lib
```

~~下記のファイルを修正します。（ファイルのパスは上記で確認したインストール先を指定して下さい）~~

```bash
$ sudo vi /usr/local/lib/node_modules/symbol-bootstrap/presets/shared.yml 
```

~~symbolServerImageとsymbolRestImageを変更します。
（ishidad2/symbol-server:gcc-10-1.0.3.3とishidad2/symbol-rest:2.4.0は私のDockerHubのリポジトリです）
参考：[こちらの記事](https://qiita.com/ishidad2/items/365a0b4e35a3976e8425#symbol-bootstrap%E3%81%A7%E3%81%AE%E8%B5%B7%E5%8B%95)で作成したイメージです。~~

```diff
-symbolServerImage: symbolplatform/symbol-server:gcc-10-1.0.3.3
+symbolServerImage: ishidad2/symbol-server:gcc-10-1.0.3.3
-symbolRestImage: symbolplatform/symbol-rest:2.4.0
+symbolRestImage: ishidad2/symbol-rest:2.4.0
```
~~67行目から70行目にかけて修正。~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/63b8b504-6bd7-fb85-ad25-249a4f6b09a6.png)

~~修正は以上です。~~

## ノードを起動する

これ以降は通常のSymbol-bootstrapでのノード構築と同じになります。

https://docs.symbol.dev/ja/guides/network/using-symbol-bootstrap.html

### コンフィグの作成

コンフィグを作成する際のカスタムプリセットに以下の記述をします。（その他必要がある設定は各自してください）

```yaml

nodes:
    -
        host: ****.localhost
        friendlyName: **********
        mainPrivateKey: *****************
        vrfPrivateKey: ****************
        remotePrivateKey: ****************
        transportPrivateKey: ****************

# httpsProxiesは必要に応じて有効化してください
# httpsProxies:
#            - excludeDockerService: false

maxChainBytesPerSyncAttempt: 50MB
messageSynchronizationMaxResponseSize: 10MB
blockDisruptorMaxMemorySize: 1000MB

# 以下でコンテナイメージを置き換えます
symbolRestImage: ishidad2/symbol-rest:2.4.2
symbolServerImage: ishidad2/symbol-server:gcc-1.0.3.5

```

※「******」の部分はご自身の環境に合わせて設定してください。

例）
```bash
$ symbol-bootstrap config -p <preset> -a <assembly> -c <custom_parameters_file.yml>
```

実際には下記のような感じになります。

```bash
$ symbol-bootstrap config -p mainnet -a dual -c custom_parameters.yml
```

詳しい情報は[こちら](https://drive.google.com/file/d/1as0jVOkCDoN0WVMp1dKPnbzo11BTGzUY/view)（PDF）を参考にしてください。特にcustom_parameters.ymlはリンク先の「2. ノード設定ファイルの生成」を参考に作成して下さい。（重要なファイルですが作成しなくても起動はできます）


### 必要な Docker ファイルを準備

```bash
$symbol-bootstrap compose
```

一応イメージを確認。
ここまでエラーなく実行できていれば、targetというフォルダが作成されているはずです。

```bash
$ cat target/docker/docker-compose.yml
```

```yml
...

 node:
        user: '1000:1000'
        container_name: node
        image: ishidad2/symbol-server:gcc-10-1.0.3.3
        command: /bin/bash /symbol-commands/start.sh /usr/catapult ./data server broker node NORMAL true
        stop_signal: SIGINT
...

 rest-gateway:
        container_name: rest-gateway
        user: '1000:1000'
        image: ishidad2/symbol-rest:2.4.0
        command: npm start --prefix /app/catapult-rest/rest /symbol-workdir/rest.json
        stop_signal: SIGINT
...
```

nodeとrest-gatewayのimage名が指定したイメージとなっていればOKです。


確認が取れたら起動します。

```bash
$ symbol-bootstrap run -d
```

色々とログが流れノードが起動します。途中パスワードを入力する画面になると思うので、適当なパスワードを設定して下さい（起動の度必要になるので忘れないで下さい）
正常に起動したかどうかのチェックは下記のコマンドを実行します。

```bash
$ symbol-bootstrap healthCheck
```

下記のようにヘルスチェックでエラーがでなければ成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/8192f0ed-2599-b998-513d-a0cf8b3691fd.png)

その他の確認の仕方として、自身のサーバーへアクセスして確認することもできます。

```
http://IPアドレス（またはFQDN）:3000/node/info
```

ノードにアクセスして情報が表示されればOKです。


以上、RaspberryPi でブロックチェーンノードを構築する方法を終わります。

# 補足

ラズパイ用のイメージはこちらで公開しています。

https://hub.docker.com/search?q=ishidad2