Cryptocurrency Research Lab.

Cryptocurrency関連技術についての調査・研究

【RippleAPI】④ 送金受領通知

Ripple APIを使って送金の受領通知を受け取ることができます。

支払いが完了した契機で何かしらのデータ処理を行いたい場合に使用できそうです。

本物のXRPを使って検証を行うと費用がかかってしまいますので、今回もTest Net上で行います。接続先サーバや対象アドレスを変更すれば、本番環境でも動作すると思います。(試してません)

Test Net上のアカウント作成 および 送金方法については、『【RippleAPI】② XRP Test Net』や『【RippleAPI】③ Payment』を参考にしてください。

送金に先立って以下のプログラムを実行しておくことで、送金完了契機で通知を受け取ることができます。

プログラム例
const RippleAPI = require('ripple-lib').RippleAPI;

const api = new RippleAPI({
  server: 'wss://s.altnet.rippletest.net:51233' // testnet
});

const address = '<監視対象アドレス>';

(async ()=>{
  try {
    // Connect 
    await api.connect();
    
    // 送金受領通知
    api.connection.on('transaction', (event) => {
        // 受領イベント処理
        console.log(JSON.stringify(event, null, 2))
    });

    let response = await api.request('subscribe', {
        accounts: [ address ]
    });
    console.log('Successfully subscribed')

  } catch (e) {
      console.log(e);
  }
})();
受領イベント例

Test Net上でPaymentを行った際の受領イベントの結果例を示します。

{
  "engine_result": "tesSUCCESS",
  "engine_result_code": 0,
  "engine_result_message": "The transaction was applied. Only final in a validated ledger.",
  "ledger_hash": "88813EB3BB0EE195F3C35382CD332947C9F117BA9AA61A96D59768302A372E57",
  "ledger_index": 19120610,
  "meta": {
    "AffectedNodes": [
      {
        "ModifiedNode": {
          "FinalFields": {
            "Account": "rM6ToyvCmTavh4zPjJSsTVgCbabZ6Harup",
            "Balance": "1500000000",
            "Flags": 0,
            "OwnerCount": 0,
            "Sequence": 1
          },
          "LedgerEntryType": "AccountRoot",
          "LedgerIndex": "64CCDE20EFFDDBD96C3A9FA662433B31F6FC0F63E60E39396BF68876759DD42F",
          "PreviousFields": {
            "Balance": "1000000000"
          },
          "PreviousTxnID": "AD398B47DDB44FF346908BE91D63EF74F5578A36622D48EF63ECB3E55A71D3E5",
          "PreviousTxnLgrSeq": 18568215
        }
      },
      {
        "ModifiedNode": {
          "FinalFields": {
            "Account": "rc8qCurPUeXBjE4DGqg3YQX3N6F5r7cog",
            "Balance": "8499999964",
            "Flags": 0,
            "OwnerCount": 0,
            "Sequence": 4
          },
          "LedgerEntryType": "AccountRoot",
          "LedgerIndex": "807ACAA6FC7612CB2D4A18ECAB1DD6BF1EA3E2C581123B438FCDEAF44C9016B2",
          "PreviousFields": {
            "Balance": "8999999976",
            "Sequence": 3
          },
          "PreviousTxnID": "AD398B47DDB44FF346908BE91D63EF74F5578A36622D48EF63ECB3E55A71D3E5",
          "PreviousTxnLgrSeq": 18568215
        }
      }
    ],
    "TransactionIndex": 0,
    "TransactionResult": "tesSUCCESS",
    "delivered_amount": "500000000"
  },
  "status": "closed",
  "transaction": {
    "Account": "<送付元アドレス>",
    "Amount": "500000000",
    "Destination": "<送付先アドレス>",
    "Fee": "12",
    "Flags": 2147483648,
    "LastLedgerSequence": 19120613,
    "Sequence": 3,
    "SigningPubKey": "03D9278E3BAE27CAA9EF9892523A6402253F9D96CACAC9EF5A7EB9F6D2377CDDC9",
    "TransactionType": "Payment",
    "TxnSignature": "3045022100BB0BFDA8EC3B3AFAEB238F6700CE17C67D11B371DB7C53AA4406FADD7941C05102200369C5FCBAD3306AD57CE5470C8A101DEFE04C1AFBFE4B27DC3410F9A2490358",
    "date": 610296010,
    "hash": "EA887B8046F0E9BE06A2CF29AF0900AA485D70D80F484093AE7FF29CEABD029D"
  },
  "type": "transaction",
  "validated": true
}

送金メモ

Payment時にメモを付与することができますので、金額だけでなく何らかの付加データも送ることができるようです。

送金処理
      memos: [{
        format: 'text/plain',
        data: 'This is test memo of payment.'
      }]
受領イベント

メモはHEX形式にエンコードされた形で渡ってきます。

{
  ︙
  "transaction": {
    ︙
    "Memos": [
      {
        "Memo": {
          "MemoData": "546869732069732074657374206D656D6F206F66207061796D656E742E",
          "MemoFormat": "746578742F706C61696E"
        }
      }
    ],
    ︙
  }}

たとえば、以下のようにデコードできます。

let memo = Buffer.from('546869732069732074657374206D656D6F206F66207061796D656E742E', 'hex').toString();
console.log(memo);