RESTゲートウェイに任意のJSON拡張情報をもたせるnodeMetadata設定

実は結構前に、ノード（RESTゲートウェイ）に自由なメッセージ領域をもたせられないか、という打診をしてみたところ、実装してくれていたのでした。

- [\[rest\]: add /node/metadata to allow node personalization · symbol/symbol@c3d5c0f](https://github.com/symbol/symbol/commit/c3d5c0f2fff38a7a77942970d906382cd6f47304)

いままでは`friendlyName`領域がユーザーとして比較的自由な文字列でカスタムできる領域でしたが、この`nodeMetadata`によって、完全に自由な領域を設定することができます。

せっかく実装されたのに、RESTゲートウェイのDockerイメージがなかなか更新されなかったので、すっかり忘れていました。

今はもうリリースされているので、利用可能です。

どのRESTゲートウェイのバージョンから有効なのか、までは調べてませんが、
まぁノードを建てるような皆さんなら常に最新の状態にアップデートしてるから、大丈夫でしょう。

ちなみにこの記事ではRestのバージョンは`2.4.2`でした。
最新でない場合は、一応安全のためにも、早めにアップデートをしてくださいね。


# どんなの？

例えば、こんな感じの設定をすると…。

```json
"nodeMetadata": {
  "greeting": "こんにちは",
  "message": "テストメッセージだよ",
  "foo": {
    "bar": "ばー",
    "baz": {
      "greeting": "Hello!",
      "array": [
        1,
        2,
        3
      ]
    }
  }
}
```

http://localhost:3000/node/metadata

![スクリーンショット 2022-12-14 6.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353/42223bdd-7d26-3da5-c79c-88de35d74d62.png)

その値がそのまま反映されます。

なお、未設定の場合は何も返ってきません。


# 設定方法

`symbol-bootstrap`によって、構成ファイルを用意している場合は、`target/gateways/rest-gateway/rest.json`にファイルがあると思いますので、これを開きます。
（今後のバージョンアップや構成によっては異なる可能性があります。同じような内容または名前のファイルを探してください）

![スクリーンショット 2022-12-14 6.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353/8b6de38e-eaa5-11dd-85bb-c1dd13eccf79.png)

位置はどこでもいいので、`"nodeMetadata"`というキーで、お好きにオブジェクトを書いてください。

書いたら、RESTサーバを再起動するだけです。

なお、JSONの形式ミスがあると、RESTサーバが立ち上がらなくなるので、気をつけてください。
ミスったら一旦止めて、記述を見直して、再起動すれば大丈夫です。

現状では、手動で設定する方法しか無いと思います。
`Symbol-Bootstrap`を使用している場合、アップデートコマンドによって吹き飛ぶと思います。
そのあたりは環境整備に期待してください。


# 人柱

試しに設定してもらったノードを掲載させてもらいます。

- [80\.209\.229\.160:3000/node/metadata](http://80.209.229.160:3000/node/metadata)
![スクリーンショット 2022-12-15 23.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353/927bdb81-717a-3750-3a37-e678da6064c0.png)


- [pasomi\.dusan\.gq:3000/node/metadata](http://pasomi.dusan.gq:3000/node/metadata)
![スクリーンショット 2022-12-16 1.08.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353/9803616b-9567-5b7d-85ac-6ce887eddd1b.png)


＊内容はノードの持ち主によって変更されている場合があります。


# コード

ルーティングはここで設定されています。

- [symbol/nodeRoutes\.js at c9eaf7d2bf78fe20b6cb1dd8c2d42f63e8b2b886 · symbol/symbol](https://github.com/symbol/symbol/blob/c9eaf7d2bf78fe20b6cb1dd8c2d42f63e8b2b886/client/rest/src/routes/nodeRoutes.js#L189)

なお、RESTサーバのルーティングはこのファイルに集約されていると思われるので、ココを覗くと、アンドキュメンテッドなパスが見つかるかも。

`nodeMetadata`の設定サンプル。

- [symbol/rest\.json at b555910e107127a378291df13baf9b8627ec86f8 · symbol/symbol](https://github.com/symbol/symbol/blob/b555910e107127a378291df13baf9b8627ec86f8/client/rest/resources/rest.json#L101)

```js
"nodeMetadata": {
    "_info": "replace the body of this object with custom fields and objects to personalize your node"
}
```

テストコードを覗いてみると、オブジェクトのネストも考慮していることがわかります。

- [symbol/nodeRoutes\_spec\.js at c9eaf7d2bf78fe20b6cb1dd8c2d42f63e8b2b886 · symbol/symbol](https://github.com/symbol/symbol/blob/c9eaf7d2bf78fe20b6cb1dd8c2d42f63e8b2b886/client/rest/test/routes/nodeRoutes_spec.js#L474)

```js
expect(mockServer.send.firstCall.args[0]).to.deep.equal({
    foo: 1234,
    bar: 'lorem ipsum',
    baz: { abc: 41, xyz: 82 }
});
```

# 用途

自由に`json`オブジェクトを公開できるので、使い方は自分たちで決めなければなりません。

例えば、第一階層でサービス名などの名前空間を区切り、第二階層で具体的な値を公開してみる、とか…。

```json
"jp.sugoi-web-service": {
  "name": "ノード太郎",
  "twitter": "@node_tarou",
  "message": "維持がんばるぞい！"
}
```

と書いておくと、すごいウェブサービスのシステムがこの値をみて、何らかに利用するとか。

まぁ、いろいろと考えてみて、何かに利用してください（ぶん投げ

ブロックチェーンの話ではありませんが、ノード運用を楽しく、ノードに関するサービスの可能性が広がる話でした。