catapultのmongoDBからすべてのunconfirmed transactionを取得する

# はじめに

APIで取得できるトランザクションリストは、アカウントでフィルターされたものしかありません。

例えばブロックチェーンエクスプローラーとかだと、全部欲しいわけです。

mongoDB直接見たら、きっとできると思いました。

# 設定

[tech-bureau/catapult-service-bootstrap](https://github.com/tech-bureau/catapult-service-bootstrap)でカタパルトを起動するとします。

`docker-compose.yml`のdbサービスのところで、27017ポートを接続します。

```yaml:docker-compose.yml
  db:
    image: mongo
    command: bash -c "mongod --dbpath=/dbdata --bind_ip=db"
    stop_signal: SIGINT
    ports:
    - "27017:27017"
    volumes:
    - ./data/mongo:/dbdata:rw
    - ./bin/bash:/bin-mount
```

あとは、サーバーのほうも、同じポート開放をしておきます。

# GUIで見る

まずは、compassという、DB内を見れるGUIのソフトがあるので、使ってみます。

https://www.mongodb.com/products/compass

catapultという名前のdbを開きます。

いろいろなコレクションがあります。カタパルト起動直後は少ないですが、トランザクションが発生すると増えていくようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/1e7541ed-3460-7bb5-b2b5-9237c34308d5.png)

unconfirmedTransactionsというのを見てみます。

何か入ってますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/9cb1becb-cad5-df97-f09c-bc006cabd444.png)

# Node.jsで見る

https://www.npmjs.com/package/mongodb

ここにあるコードを参考にしてみます。

```javascript
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
require('dotenv').config();

// Connection URL
const url = process.env.DB_HOST || 'mongodb://localhost:27017';

// Database Name
const dbName = 'catapult';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
    assert.equal(null, err);
    console.log("Connected successfully to server");

    const db = client.db(dbName);

    const findDocuments = function(db, callback) {
        // Get the documents collection
        const collection = db.collection('unconfirmedTransactions');
        // Find some documents
        collection.find({}).toArray(function(err, docs) {
            assert.equal(err, null);
            console.log("Found the following records");
            // console.log(docs);
            callback(docs);
        });
    };

    findDocuments(db, function(docs) {
        docs.map(doc => {
            console.log(`hash=${doc.meta.hash.buffer.toString('hex').toUpperCase()} signer=${doc.transaction.signer.buffer.toString('hex').toUpperCase()}`);
        });
    });

    client.close();
});
```

## unconfirmedトランザクションを生み出す

MIJIN_TESTでは手数料いらないので、0XEM送金をたくさんします。

http://wallet.48gh23s.xyz/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/59c3d7c4-3d3f-d09b-0524-63cd5e94f095.png)

## 実行してみる

```
node sample4.js
(node:17888) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
Connected successfully to server
Found the following records
hash=0D364825033AD326A94EEC432309446FC8DC00055030C3B844E856460B808186 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=8594FA157EDF13B59227ADB72AA5F1F51624267F1DBACF442549B0C7DEA5E2E5 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=87FB89349960723F70472F35A0C02917DB0A1E6258BA19C47D895397250036F2 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=684D3E1A5FD3D512348B8C53DA7BDAFBE68AA31E159585B5CDA225A6637572C2 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=42904663DEF13D81F345F551A977740DDB3E50D0F3BA93219018711EA2ADFD27 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=0AC47F341E4CA46AAECCBC0EB501803B4F1138246AD043DFAD409DD169AB5259 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=91DF901791840F26D50F0C67DEFA1519A1A4E1E04B9017C6D8B4FDD8808C4055 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=830B22AEBB4B9B90F74F7F98F8C04A1E1EE6B790C237589BF65F7F80B7AE161D signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=32966E1DAAACEACA7321C927FC9F8EC481FF68A0FD3E58A88ED5C430C4BFDD6F signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=30F309352563F79BDF4B73DFD1621D13459DD35045C2F2DE3A74A5119BBD4B2B signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=3AB638F606DF66F1EDB066BD55DC22BF1F75DEDA349BDEA2505A3D79C4FC8B27 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=0DC28EF688B35EC5923BAF1B5C82C6885F35223F3748A96A221E6EE35061FA0E signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=E1C2C37DD888FD508F3A0EEA8AF60310C671A86C7FA85B9BA8C1ED82194F845C signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=DC247227E9DCC99DF986167CF971992A342D974B0C4FF63F3F45B352403C6CC7 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=10D744D73E7BF5F78A70097476A29DBE458E6A6EEBA14F32901A1D424F401FB0 signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=B0DD864D0910713F5674FBDD36108180D54F6D8F6AEE3B5962A3A21C51BC096E signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=A54DB32E218ACCE671724718E4FE2C65DE05077761EA91CE66EE1F3B6EDF1CCD signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
hash=5681DA6A68BA85576F6BC18EEBA36FEA3B24EAF3C995C943A64CBCA08A9E77AC signer=AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
```

たくさん取得できました。

# おわりに

サクッと取得できました。

- モザイクIDがsignedで表示されてる。unsignedに変換がいる？
- 数値は64バイトで入ってるっぽい。jsだとそのままでは扱えない。
- 数値以外はバイナリで入っている。全部変換しないと読めない。