Cryptocurrency Research Lab.

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

【Binance Chain API】⑥ 送金受領通知

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

WebSocket経由でBinance Chainのエンドポイントに接続して、特定アドレスに紐づいたtransferイベントをsubscribeすることで、指定したアドレスへの送金、もしくは、指定したアドレスからの送金のトランザクションが発生した契機でメッセージを受け取ることができます。

たとえば、送金受領の契機で通知メールを送る等、イベント契機で何かしらのアクションを行いたい場合に便利です。この仕組みを利用すれば、色々と面白いことができそうですね。

npmモジュール

Node.jsからWebSocketを使うために、ここではwsモジュールを使用します。

$ npm install ws

プログラム例

const WebSocket = require('ws');
const client = new WebSocket('wss://dex.binance.org/api/ws');

const address = '<対象アドレス(bnb~)>';

client.on('open', (event) => {
  client.send(JSON.stringify({
    method: "subscribe",
    topic: "transfers",
    address: address
  }));
});

client.on('message', (event) => {
  let message = JSON.parse(event);
  console.log(JSON.stringify(message, null, 2));
});

client.on('error', (event) => {
  console.log(event);
  console.error('an error occurred', event.data);
  process.exit(0);
});

client.on('close', () => {
  console.log('closed');
});

受領イベント

{
  "stream": "transfers",
  "data": {
    "e": "outboundTransferInfo",
    "E": <イベント通番>,
    "H": "<トランザクションハッシュ>",
    "f": "<送金元アドレス>",
    "t": [
      {
        "o": "<送金先アドレス>",
        "c": [
          {
            "a": "BNB", // トークン
            "A": "0.09500000" // 金額
          }
        ]
      }
    ]
  }
}

JSONデータは整形済み

KeepAlive

公式ドキュメントによれば、通信を持続させるためにサーバ側からクライアントへ30秒おきにpingフレームが送信されるとのことです。 wsモジュールを含む一般的なWebSocketライブラリは、サーバからのpingに自動応答する仕組みとなっているようです。

ただし30分~60分後で自動的に切断されるとのことですので、もし接続を持続させたい場合には、以下のメッセージを送信する必要があるようです。公式ドキュメントには、30分ごとに送信するとよいと書かれていました。

client.send(JSON.stringify({ method: "keepAlive" }));

参考ページ

公式ドキュメントを参考にするとよいでしょう。

docs.binance.org

docs.binance.org