イベントの監視と消費

Casperプラットフォームは、スマートコントラクトとノードの状態変化を通知するためにイベントストリーミング(英文)を使用します。Casper Sidecarサービスとクライアント側SDKを使用すると、アクティブにイベントをリッスンしているdAppはイベントを消費しイベントデータに基づいてアクションを実行することができます。

スマートコントラクトは、ここで説明されているようにコントラクトレベルのイベントを発信することもできます。DAppsはイベントストリームのリスニングとTransactionProcessedイベントの検出、そしてmessages配列を解析して放出されたイベントのString表現を保存することでこれらのイベントを消費することができます。

Casper Sidecar

Casper Sidecar はノードプロセスと共に動作するアプリケーションです。サブスクライバがノードのイベントストリームを監視したり、保存されたイベントのクエリやノードのJSON-RPC APIのクエリが可能である為より速いレスポンスやノード上の負荷軽減が実現できます。サイドカーは以下の機能をサポートしています:

Sidecar components and architecture

最新のソースコードと情報はGitHubをご覧ください:

イベントストリーム

Casperノードは、JSONエンコードされたデータでサーバ送信イベント(SSE)を返すイベントストリームAPIを提供します。Sidecar は接続されているすべてのノードのイベントストリームを読み込み、パススルーとして動作し接続されているノードの SSE インターフェースを複製します。

サイドカーは以下のことができます:

  • ノードからの現在のイベントをSidecarのSSE APIをリッスンしているクライアントのリパブリッシュ
  • ?start_from=クエリ(ノードのSSE APIと同様)を使用してSidecarのSSE APIに接続するクライアントへの設定可能な数の過去のイベントパブリッシュ
  • クライアントによるREST API経由のクエリを可能にするため外部ストレージへのイベントの保存

Sidecarはまた、ノードが生成していないにもかかわらず、有用なSidecar生成イベントのエンドポイントも提供している。

要約すると、イベントは2つのカテゴリに分けられ、それぞれのエンドポイントで発信されます:

  • Node-generated events(ノードが生成したイベント) – 接続されたノードから来る全てのイベントは、eventエンドポイントに送られます。MainnetまたはTestnetノードでこれらのイベントを利用するためのデフォルトURLは通常http://HOST:19999/events/です。このURLはノード上でSidecarがどのように設定されたかに依存します。
  • Sidecar-generated events(Sidecarが生成するイベント) – SidecarもまたSidecarサービスからのみ発信されるイベント用に指定されたevents/sidecarエンドポイントでイベントを発信します。MainnetまたはTestnetノード上でSidecarを使用したこれらのイベント消費用URLは通常、http://HOST:19999/events/sidecar/です。このURLは、ノード上でSidecarがどのように設定されたかに依存します。

Casper Sidecar 利用ガイドでは、各イベントタイプについて詳しく説明しています。

イベントストリームのリスニング

イベントストリームを受信するには、以下のコードにてdAppにイベントリスナーを設定します。NODE_ADDRESSはSidecarがインストールされたノードのアドレスです。PORTはSidecarがイベントをストリームするアドレスです。デフォルトでは19999ですが、Sidecarの設定内容については把握しておかなくてはなりません。

const { EventStream, EventName } = require("casper-js-sdk")

const es = new EventStream("http://NODE_ADDRESS:PORT/events/")
es.start()
es.subscribe(EventName.EVENT_NAME, eventHandler)

const eventHandler = (event) => {
    console.log(event)
}

from pycspr import NodeClient, NodeConnection, NodeEventType

def eventHandler(event):
    print(event)

client = NodeClient(NodeConnection(host = "NODE_ADDRESS", port_rpc = "PORT"))
client.get_events(eventHandler, NodeEventType.EVENT_NAME)

curl -s http://NODE_ADDRESS:PORT/events/

Mainnetの場合はcspr.live、Testnetの場合はtestnet.cspr.liveにアクセスし、NODE_ADDRESSの代わりとなるアクティブなオンラインのピアノードアドレスを見つけることができます。

EVENT_NAMEを以下のイベントタイプのいずれかに置き換えます。

コンタクトレベルのイベント検出

Sidecarは、コントラクトが発するメッセージを人間が読める形式でストリームします。これらのメッセージは、対応するブロックが処理されてブロックチェーンに追加された後、TransactionProcessedイベントの一部として可視化されます。詳細については、「トピックの検証」と「メッセージの検証」を参照してください。

イベントへの反応

アプリケーションは、そのユースケースに必要な各イベントを解析し、それに応じて応答することができます。各イベントタイプには、アクションを起こすかどうかを決定するのに役立つ追加データが含まれています。例えば、TransactionAcceptedイベントには、トランザクションを送信したアカウントの公開鍵、コントラクトアドレスなどが含まれます。この情報は、処理の進め方における判断に役立ちます。

const eventHandler = (event) => {
  if (event.body.TransactionAccepted.header.account == "012481699f9231e36ecf002675cd7186b48e6a735d10ec1b30f587ca716937752c") {
    // Perform an action
  }
}

def eventHandler(event):
  if event["TransactionAccepted"]["header"]["account"] == "012481699f9231e36ecf002675cd7186b48e6a735d10ec1b30f587ca716937752c":
    # Perform an action

イベントからのサブスクライブの解除

多くの場合、アプリケーションは特定の時間経過後に購読解除が必要であったり、いくつかのイベントから購読を解除したいが他のイベントからは解除したくない場合があります。Casper SDKはこの機能をunsubscribe関数で提供します:

es.unsubscribe(EventName.EVENT_NAME)

イベントストリームの停止

dAppはstop関数を用いて全てのイベントのリッスンを停止することができます:

es.stop()

サイドカーイベントストリームの再生

このコマンドは古いイベントからイベントストリームを再生します。NODE_ADDRESSやPORT、ID フィールドをご自身のシナリオの値に置き換えてください。

curl -s http://NODE_ADDRESS:PORT/events?start_from=ID

例:

curl -sN http://65.21.235.219:19999/events?start_from=29267508

zshのような特定のシェルでは、クエスチョンマークの前にエスケープ文字が必要な場合があるためご注意ください:

curl -sN http://65.21.235.219:19999/events?start_from=29267508

IDが0、もしくは既にキャッシュから削除されたイベントIDを指定した場合、サーバーはキャッシュされたすべてのイベントを再生します。

JSON-RPC API

SidecarはクライアントがCasperネットワークと疎通するJSON-RPC APIサーバーも提供しています。これはエンドユーザーとCasperノードのバイナリポート間のJSONブリッジであり、リクエストをCasperノードのバイナリポートに転送します。JSON-RPC APIの動作の詳細についてはJSON-RPC READMEを参照してください。

REST API

Sidecarは保存されたイベントのクエリ用REST APIを提供しています。OpenAPISwaggerを使って、REST API の特定のエンドポイントを見つけることができます。リポジトリにある使用説明書に詳細が記載されています。

Sidecar components and architecture diagram 1
Sidecar components and architecture diagram 2

トラブルシューティング用Tip

その他のトラブルシューティング用の情報は、Githubにてご確認いただけます。