symbol-sdk(2系)でのトランザクションの検知とエラーハンドリング

タグ
公開日

みなさんはsymbol-sdkでトランザクションを検知する場合どのような実装にしているでしょうか? 承認済みトランザクションであればSDKが準備した以下のようなメソッドがあります。

import {
  TransactionService,
  RepositoryFactoryHttp,
} from 'symbol-sdk';

~~ 略 ~~

const node = 'https://sym-test-03.opening-line.jp:3001';
const repoFactory = new RepositoryFactoryHttp(node);
const transactionHttp = repoFactory.createTransactionRepository();
const receiptHttp = repoFactory.createReceiptRepository();
const transactionService = new TransactionService(transactionHttp, receiptHttp);
const listener = repoFactory.createListener();

~~ 略 ~~

listener.open().then(() => {
  transactionService.announce(signedTransaction, listener).subscribe({
    next: (x) => {
      console.log(x);
    },
    error: (err) => {
      console.error(err);
      listener.close();
    },
    complete: () => {
      listener.close();
    },
  });
});

これでアナウンスと、承認済みトランザクションを検知を行う事ができます。

nextの処理で承認済みトランザクションを検知した処理

errorの処理でトランザクションが失敗した時の処理

completeの処理で上記処理の完了後に行う処理を書く事ができます。

このメソッドの難点は、未承認や署名が揃っていないのトランザクションの検知ができない事です。

また、指定したトランザクション手数料がノードの最低手数料に満たない場合は、このどれにも該当せずに検知できないという事象もあるため、エラーハンドリングも少し足りていないと思います。

トランザクション検知のベストプラクティス

そのため、未承認、承認済み署名が揃っていないのトランザクションの検知が出来き、エラーハンドリングもできる、シンプルな書き方がないか検討してみました。