Symbol from NEM で実装されるアグリゲートトランザクションによって、ブロックチェーンは信用と信用の途切れ目を無くし、さらに複雑な用途に使用できるようになります。
ただ、一つのトランザクションの内部に複数のトランザクションを詰め込むこという設計のため、そのトランザクションを解析するには注意が必要です。
今回は、アグリゲートトランザクションを他の一般のトランザクションと同列に解析する方法を説明します。
事前準備
まず、いつものようにChromeのコンソールをF12で開いてスクリプトを読み込みます。
NODE = 'https://sym-test.opening-line.jp:3001';
GENERATION_HASH = '6C1B92391CCB41C96478471C2634C111D9E989DECD66130C0430B5B8D20117CD';
(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-0.21.0.js';
document.getElementsByTagName('head')[0].appendChild(script);
必要なライブラリのインポート
nem = require("/node_modules/symbol-sdk");
rxjs = require("/node_modules/rxjs");
txHttp  = new nem.TransactionHttp(NODE);
解析function
これが今回の要となる解析用の関数です。
function parseTxs(txs){
    for(tx of txs){
        //アグリゲートトランザクション判定
        if(tx.type === nem.TransactionType.AGGREGATE_COMPLETE 
        || tx.type === nem.TransactionType.AGGREGATE_BONDED){
            //アグリゲートの場合、内部トランザクションを再取得
            txHttp.getTransaction(
                tx.transactionInfo.hash,
                nem.TransactionGroup.Confirmed
            ).subscribe(tx =>{
                console.log("== aggregateTx ==")
                //この関数を再帰的に呼び出し
                parseTxs(tx.innerTransactions);  //再帰呼び出し
                console.log("-----------------")
            });
        }else {
            //ここに解析する処理を記述します。
            console.log(tx);
        }
    }
}
解析ファンクションはトランザクションを配列で受け取ります。
for ループで1件ずつトランザクションを取り出し、処理していきます。
TransactionTypeがアグリゲートトランザクションでなければそのままコンソール出力して次の処理へうつります。
アグリゲートトランザクションだった場合はinnerTransactionsの中をさらに再帰的に同じ関数で処理させます。
ここで注意点としては、REST APIでトランザクションをリストで取得した場合、innerTransactionsの情報が入っていません。なので、リストで一つずつ取り出したトランザクションがアグリゲートトランザクションだった場合は、そのHASH値をキーにinnerTransactions情報も含む全情報を取り直す必要があります。innerTransactionsが取れればその関数の内部から同じ関数を呼び出せば再帰的に処理していくことができます。
呼び出しプログラム
上記解析関数を呼び出すプログラム例です。
txHttp.search({
//  type:[
//      nem.TransactionType.AGGREGATE_COMPLETE,
//      nem.TransactionType.AGGREGATE_BONDED
//  ],
    order:nem.Order.Desc,
    group:nem.TransactionGroup.Confirmed
})
.subscribe(
    page => parseTxs(page.data)
)
最新の承認済みトランザクションを新しいもの順に抽出します。
コメントアウトしている部分は検索条件としてアグリゲートトランザクションだけに絞り込みます。
検索結果はページングされているので、parseTxs関数へは内部のdata部分のみを渡します。
これで以下のように、普通のトランザクションとアグリゲートトランザクションを同列に解析することができるようになりました。
ぜひ、お試しください。
