XEM(NEM)ハーベストの停止をServerlessに自動検知&通知する


はじめに

本記事は、XEM(NEM)のデリゲートハーベスティング(委任)をしている際、リモートノード(Super Node)の状態変化によってハーベスティングが停止してしまっていることを検知・通知するためのServerlessアプリケーションを紹介するものです。

Super Nodeによっては、結構、切断が発生してしまうのですが、確認するためにはNano Walletを開いて確認しなければならず、気が付かない間はハーベストが完全に止まってしまいます。ですので、久しぶりに開いて悲しい思いをすることになります・・・。それをナルハヤで気がつけるようにしよう!という試みです。

いわゆるガチホする方で条件を満たす方は、できるだけハーベストの機会を逃したくないですよね!

利用の前提

  • XEMのデリゲート(委任)ハーベスティングを行っていること
  • AWSアカウントがあること

アーキテクチャ&動作概要

  1. CloudWatch Eventsのスケジュール(cron)で定期的にLambda Functionをトリガー。
  2. デリゲートハーベスティング委任先のリモートノード(Super Node)へリモートアカウントのステータスを確認。有効でない場合、SNS TopicへPublish。
  3. SNSから利用者へE-mailを送信。

実装

以下を利用しています。
- デプロイ ⇒ Serverless Framework
- ステータス確認 ⇒ NEM NIS API

以下の用にリモートノードへリクエストを送ると
const URL = 'http://' + IpAddress + ':7890/account/status?address=' + RemoteWalletAddress;

次のようなJSONオブジェクトがresponseとして返ります。このオブジェクトのstatusがUNLOCKED以外の場合は、ハーベストが有効になっていない状態となり、これをチェックしています。

{
    "cosignatories": [ ],
    "cosignatoryOf": [ ],
    "status": "LOCKED",
    "remoteStatus": "ACTIVE"
}

コーディングのレベルが低すぎて恥ずかしいのですが、GitHubに置いています。

使い方

Serverless.ymlのcustomセクションの項目をセットし、デプロイ(serverless deploy)します。

  • emailAddress
    • 通知先のメールアドレスを設定
  • accountId:
    • AWS Account ID(12桁の数値)
  • IpAddress
    • リモートノードのIPアドレス or ホスト名
  • RemoteWalletAddress
    • 委任ハーベスト用のリモートアカウント
    • nano Walletでサービス⇒デリゲートアカウント管理⇒デリゲートアカウントの有効化/無効化で確認。

リモートノードと接続が切れた場合は、上記をLambdaの環境変数にしていますので、IpAddressを新しいリモートノードへ更新すればOKです。

おわりに

XEMのAPIは他にもたくさんあり、結構ドキュメントも揃っていますし、拡張も控えていますので、これからどんどん盛り上がりそうですね!いろいろ作ったり、こういった機能もサービス化してみたいところです。

XEMほしい・・・(ノ∀`)