[web3] Ethereum フルノードを使ったERC-721, ERC-1155の所有者のリアルタイム監視方法

はじめに

こんにちは、サイオステクノロジーの安藤 浩です。

前回の記事では、Ethereum Sepoliaテストネット上のフルノードを構築し、イベントログからERC-721やERC-1155の所有者を特定する方法をご紹介しました。

前回の記事は以下です。

今回はその続編として、WebSocketを活用したリアルタイムでの所有者の移転が行われた際の監視の方法をお伝えします。

WebSocketを使ったイベント監視の仕組み

Ethereumのフルノードは通常HTTPSによるRPC通信を提供していますが、リアルタイム監視にはWebSocketが適しています。WebSocketを使うことで、新しいイベントが発生した時点で即座に通知を受け取ることができます。

前提条件

  • Sepoliaテストネット上のフルノードがすでに構築されていること

上記に記載の前回の記事でフルノードを構築してください。

設定手順

1. Gethの起動設定を変更する

まず、GethでWebSocketを有効にするために、起動コマンドに以下のオプションを追加します。

--ws --ws.api eth,net,web3

実際のコマンド例は以下のようになります:

gethlocal --sepolia --ws --ws.api eth,net,web3 --http --http.api eth,net,engine,admin --authrpc.jwtsecret 【jwt.hexファイルのパス】 --datadir 【データディレクトリのパス】--syncmode snap

2. WebSocketでイベントをサブスクライブするコード

src/sub.ts というファイルを以下の内容で作成します。

import WebSocket from 'ws';

// Geth ノードの WebSocket エンドポイント
const wsUrl = 'ws://localhost:8546';

// WebSocket クライアントを作成
const ws = new WebSocket(wsUrl);

ws.on('open', () => {
  console.log('WebSocket connection established.');
  const contractAddressList = [
    '0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2',  //ERC-721
    '0x412E008d6157568F8c621FbF899e7717F0442a94'  //ERC-1155
  ];

  contractAddressList.forEach((contractAddress) => {
    // eth_subscribe を使用してトランザクションログを監視
    const subscriptionRequest = {
      jsonrpc: '2.0',
      id: 1,
      method: 'eth_subscribe',
      params: ['logs',
        {
          address: contractAddress, // 特定のコントラクトアドレスを指定
          topics: [] // トピックフィルタを指定(空配列はすべてのイベントを受信)
        }
      ]
    };

    ws.send(JSON.stringify(subscriptionRequest));
  });
});

ws.on('message', (data: any) => {
  const response = JSON.parse(data.toString());
  if (response.method === 'eth_subscription') {
    console.log('New log:', response.params.result);
  } else {
    console.log('Response:', response);
  }
});

ws.on('error', (error: any) => {
  console.error('WebSocket error:', error);
});

ws.on('close', () => {
  console.log('WebSocket connection closed.');
});

実行すると、WebSocketの接続が確立され、以下のようなレスポンスが表示されます:

[nodemon] starting `ts-node src/sub.ts`
WebSocket connection established.
Response: { jsonrpc: '2.0', id: 1, result: '0x8debf94ebabaea3a86f403b2e2791a19' }

リアルタイム監視の実例

ここでは、実際にNFT関連のトランザクションが発生した際に受信したイベントログをいくつか紹介します。

1. OwnershipTransferredイベント

New log: {
  address: '0x412e008d6157568f8c621fbf899e7717f0442a94',
  topics: [
    '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0'
  ],
  data: '0x',
  blockNumber: '0x7a2cce',
  transactionHash: '0xa8edf869ba4fd375f2fdfc51e557d7a3237299f2583242bb43d839f5930fcf78',
  transactionIndex: '0x1e',
  blockHash: '0x57e194d69b6dd85dc431228189c8bf551d0e91a74ed14c6eecfba581c580c73c',
  logIndex: '0x1a',
  removed: false
}

このイベントは、コントラクトのオーナーシップ移転を示しています。Etherscanではこちらで確認できます。

2. TransferSingleイベント

New log: {
  address: '0x412e008d6157568f8c621fbf899e7717f0442a94',
  topics: [
    '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0'
  ],
  data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001',
  blockNumber: '0x7a2d00',
  transactionHash: '0xa9f80aced3eb829117ef1cdfaba629a6ae625af9e44febe91bfed5b3dfec3565',
  transactionIndex: '0x43',
  blockHash: '0x3823f72b6cf3590915be2b19bc2bff5acbf4f35a772c91e69b3dc4d5804bc7e2',
  logIndex: '0x43',
  removed: false
}

このログはERC-1155のTransferSingleイベントで、単一のトークン移転を記録しています。トランザクションはこちらで確認できます。

New log: {
  address: '0x412e008d6157568f8c621fbf899e7717f0442a94',
  topics: [
    '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0'
  ],
  data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001',
  blockNumber: '0x7a2d0c',
  transactionHash: '0xb20b71a0e8b8d47ee30fa20c0afc74f82d83aa508492d6128a4dbf7258e91960',
  transactionIndex: '0x37',
  blockHash: '0x4a83395b33fd6dd60302d8d340fd4afb114b4b1208cc94b5246ff39162e0173e',
  logIndex: '0x64',
  removed: false
}

3. TransferBatchイベント

New log: {
  address: '0x412e008d6157568f8c621fbf899e7717f0442a94',
  topics: [
    '0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x00000000000000000000000036da942099c028275321130b5e503f37da446487',
    '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0'
  ],
  data: '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002',
  blockNumber: '0x7a2d5e',
  transactionHash: '0xd35a028d7c9a9d98d7ac103f6fa75b0496967e947791572b8a8a87b2407d78b2',
  transactionIndex: '0x8',
  blockHash: '0x1f9f0e0134a8b7c57156df86e84262c4037256a7f7f143a184f57922fd1ad3b1',
  logIndex: '0x13',
  removed: false
}

こちらはERC-1155のTransferBatchイベントで、複数のトークンが一度に移転されたことを示しています。詳細はEtherscanで確認できます。

イベントデータの活用方法

受信したイベントログを解析することで、以下のような情報を取得できます:

  • ERC-721: event Transfer から直近の送信先を特定
  • ERC-1155:event TransferSingle と event TransferBatch から所有者と所有量を計算

これらの情報をリアルタイムで処理し、データベースに記録することで、常に最新のNFT所有状況を把握することができます。

まとめ

Ethereumフルノードを使ったWebSocket接続により、NFTの所有権移転をリアルタイムで監視できることがわかりました。この方法は、NFT取引プラットフォームやウォレットサービスなど、常に最新の所有権情報を必要とするアプリケーションで特に有用です。


参考資料

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です