新着:HeliusがLight Protocolを買収
Solanaのオンチェーンイベントをリッスンする
ブログ/基礎

Solanaでオンチェーンイベントをリッスンする

共同創業者兼CEOXのMert MumtazLinkedInのMert Mumtaz
読了時間:7分

はじめに

暗号資産分野の開発者にとって、ブロックチェーンをリッスンするシステムの構築は最も基本的な作業の一つです。決済の確定、NFTの販売、資金移動を検知したり、セキュリティ上の目的でアカウントを監視したりすることがあります。ユースケースを問わず、チェーンを監視するシステムには耐障害性と信頼性を持たせ、レイテンシを最適化することが不可欠です。

この記事では、Solanaでこのようなシステムを構築するための方法、ユースケースの例、そしてH​​eliusを活用してより優れたシステムを構築する方法をご紹介します。

ブロックチェーンをリッスンする

オンチェーンイベントをリッスンする方法は、主に次の2つです。

  1. ポーリング
  2. ストリーミング

ポーリングとは、クライアントやアプリケーションがサーバーまたはデータソースに新しいデータがないか繰り返し確認する方式です。一定の間隔またはオンデマンドで実行できます。サーバーにリクエストを送信すると、変更の有無にかかわらず、サーバーは最新のデータを返します。そのため、更新がなくても、クライアントやアプリケーションが同じデータを繰り返し受信する場合があります。

一方、ストリーミングは、更新が発生したときにサーバーからクライアントやアプリケーションへデータをプッシュする方式です。クライアントがデータを繰り返しリクエストする必要はなく、サーバーも変更があった場合にのみデータを送信します。関連するデータだけが送信されるため、より効率的かつリアルタイムにデータを転送できます。

ポーリングはシンプルで広く使われている方式ですが、ネットワークトラフィックが増加し、特にリクエストの頻度が高い場合は多くのリソースを消費する可能性があります。一方、ストリーミングではサーバーが更新情報のみを送信するため、転送データ量とネットワークトラフィックを抑えられ、より効率的です。

ストリーミングは通常、株式市場のフィード、ソーシャルメディアの更新、オンラインゲームなど、リアルタイムのデータ更新が重要なアプリケーションで使用されます。ポーリングは、メールクライアントやニュースサイトなど、データの更新頻度や重要度が比較的低いアプリケーションでよく使用されます。

どちらの方式にも長所と短所がありますが、リアルタイムのデータ更新には一般にストリーミングの方が効率的で適しています。一方、更新頻度の低い一部のアプリケーションでは、ポーリングも引き続き有用です。

ブロックチェーン、特にSolana上のほとんどのワークフローでは、ストリーミングを使用することをおすすめします。理由はいくつかありますが、ストリーミングは実装がはるかに簡単で、Solanaが得意とする高トラフィックのユースケースにも対応しやすいためです。

Solanaでオンチェーンイベントをリッスンする方法

Solanaは非常に高速なブロックチェーンです。400msごとに新しいブロックを生成し、通常、各ブロックには数千件のトランザクションが含まれます。驚くべきことに、今が最も遅い状態です。コアエンジニアによるシステム開発が進むにつれて、チェーンが処理する新しいデータの量は増え続けます。そのため、スケーラビリティを考慮してシステムを設計することが不可欠です。

幸い、Solanaのオンチェーンデータをリッスンする方法はいくつかあります。

  1. ポーリング
  2. WebSockets
  3. Geyser
  4. Helius Webhook

ポーリング

概念的には最もシンプルかもしれませんが、Solana上のイベントをリッスンする方法としては最も推奨度が低い方式です。 

取得したいデータに応じて、Solana RPCノードのJSON-RPCメソッドを繰り返し呼び出すループを設定します。一般的なユースケースとして、新しいブロックをリッスンするためにgetBlockメソッドをポーリングしたり、特定のアドレスの新しいトランザクションを確認するために`getSignaturesForAddress`をポーリングしたりします。

興味深いことに、新しい更新をトリガーするための高度にカスタマイズされたロジックが必要なユースケースでは、これが最適な方法になる場合もあります。

WebSockets

Solana RPCは、開発者が接続できるPubSub WebSocketsも公開しています。利用可能なイベントタイプは次のとおりです。

以下は、JavaScriptでHelius RPC(WebSockets対応)を介してアカウントの変更をリッスンする短いコードサンプルです。

コード
const solanaWeb3 = require(‘@solana/web3.js’)
const connection = new solanaWeb3.Connection(“https://rpc.helius.xyz?api-key=“);
(async () => {  
connection.onAccountChange(
new solanaWeb3.PublicKey(“5yv6Vh8FNx93TXeSS94xy8VLZMbTqx4vXp7Zg5bDLZtE”),
(updatedAccountInfo, context) => console.log(“Updated account info: “, updatedAccountInfo),“confirmed”  );
})();

‍WebSocketsに関する非常に重要な注意点があります。プロトタイプの作成には便利ですが、実際の運用では壊れやすく、信頼性に欠けることが分かっています。イベントを取りこぼす可能性があるため、ミッションクリティカルなワークフローには使用しないことを強くおすすめします。

Geyser

要約すると、Solana上のノードから、データの受信方法をカスタマイズできるプラグインインターフェースを通じて、データを直接ストリーミングできます。これはSolanaでデータをストリーミングする最速かつ最低レイテンシの方法であり、DeFiの清算やレイテンシに敏感なアプリケーションには不可欠です。

SolanaのバリデータとRPCには、Solanaネイティブの独自のデータストリーミング方式であるGeyserプラグインがあります。

バリデータは「Geyser」プラグインと呼ばれるプラグイン機構をサポートするように拡張されています。この機構を通じて、アカウント、スロット、ブロック、トランザクションに関する情報を、リレーショナルデータベース、NoSQLデータベース、Kafkaなどの外部データストアへ送信できます。RPCサービスはこれらの外部データストアからデータを取得するように開発でき、キャッシュやインデックス作成など、より柔軟で目的に合わせた最適化が可能になります。

残念ながら、Geyserのセットアップには多くの手間と費用がかかる場合があります。セットアップ後も、安定稼働を維持するには相応のDevOps作業が必要です。そこでHeliusでは、GeyserVMというサービスを開発しました。プラグインをアップロードするだけで、わずか数秒で稼働を開始できます。高可用性と冗長性を備えたクラスターにより、データに関する問題を心配する必要がありません。また、リソースを共有するため、月額コストを200%以上削減できます。

専用のGeyser-as-a-Serviceをご希望の場合は、もちろんそちらも提供しています。 詳細はこちらをご覧ください。

Webhook

Webhookの仕組みはシンプルです。イベントをリッスンし、発生時に設定済みのサーバーへ送信します。たとえば、NFTが販売されるたびにDiscordサーバーへ通知を送りたい場合も、Webhookならシームレスに実現できます。 

Solana上でイベントをリッスンするほとんどのワークフローでは、Webhookが最も簡単で柔軟性が高く、コスト効率にも優れた方法です。Webhookの使用を慎重に検討すべきなのは、高頻度取引のように、5msの差がアプリケーションの成否を左右するほど極めて低いレイテンシが求められるユースケースだけです。

Heliusでは、暗号資産業界で最も堅牢なWebhookサービスを構築しました。 

1つのWebhookで最大100,000件のアドレスをリッスンし、対象とするイベントタイプを設定できます(解析はHeliusが行います)。あとはサーバーのURLを入力するだけです。これだけで無料で開始できます。

このようなサービスには多くの利点があります。数週間から数か月分の開発時間と労力を節約できるだけでなく、成長に合わせてスケールする柔軟なバックエンドも利用できます。 

Webhookの詳細については、こちらをご覧ください。

ユースケース

これでSolana上のオンチェーンイベントをリッスンする方法を理解できました。次に何をすればよいでしょうか。興味深いユースケースをいくつかご紹介します。

ボット

  • NFTがマーケットプレイスXに出品されたら、「NFT購入」アクションをトリガーします。
  • マージンポジションが健全でなくなったら、「清算」アクションをトリガーします。

監視とアラート

  • プログラムが特定のログを出力したら、PagerDutyとの連携をトリガーします。
  • トークンアカウントの残高がX%以上変動したら、Dialectを使用して警告を送信します。

イベント駆動型インデックス作成

  • 特定のプログラムでトランザクションが発生したら、データベースまたはバックエンドへ直接送信します。

通知とアクティビティ追跡

  • ウォレットXからウォレットYへの送金が発生したら、Slack通知またはメールを送信します。

分析とログ

  • イベントXが発生したら、ETLパイプラインへ送信するか、Heliusに直接保存して経時的な傾向を確認します。

ワークフローの自動化

  • イベントXが発生したら、任意の一連のアクションをトリガーします。

まとめ

この記事では、ポーリングとストリーミングの違い、Solanaブロックチェーンをリッスンするさまざまな方法、そしてユースケースの例をご紹介しました。

まとめると、Solana上のオンチェーンイベントは、ポーリング、WebSockets、Geyser、またはHelius Webhookを介してリッスンできます。それぞれに長所と短所があるため、実装するアプローチを決定する前に、システムの要件を検討することが重要です。最後までお読みいただき、ありがとうございました。

Solana RPC、Solana API、Solana Webhook、Solanaインフラストラクチャを含むHeliusのサービスについて詳しくは、当社のWebサイトをご覧ください。

‍

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます