- Developers(開発者ガイド)概要
- 開発の事前準備
- 必須となるRust Crate(クレート)
- Writing On-Chain Code
- Getting Started with Rust
- Getting Started with AssemblyScript
- 基本的なスマートコントラクトをRustで書く方法
- スマートコントラクトのテスト
- スマートコントラクトのアップグレードとメンテナンス
- スマートコントラクトの呼び出し
- コントラクトとセッションコード
- セッションコードの書き方
- セッションコードのテスト
- コントラクトによるイベント発行を有効に
- コントラクトハッシュとパッケージハッシュの使い分け
- Casperスマートコントラクトのベストプラクティス
- Casper JSON-RPC API
- DAppsのビルド
- SDKクライアントライブラリ
- dApp Technology Stack
- ReactのFront-endテンプレート
- URefのアクセス権限とセキュリティへの考慮
- トランザクションへの署名
- スペキュラティブ(推測的)実行によるガス・コストの見積もり
- NCTLを使ったローカルネットワーク設定
- NCTLを使ったスマートコントラクトのテスト
- イベントの監視と消費
- CLIを使ったBlockchainとのやり取り
イベントの監視と消費
Casperプラットフォームは、スマートコントラクトとノードの状態変化を通知するためにイベントストリーミング(英文)を使用します。Casper Sidecarサービスとクライアント側SDKを使用すると、アクティブにイベントをリッスンしているdAppはイベントを消費しイベントデータに基づいてアクションを実行することができます。
スマートコントラクトは、ここで説明されているようにコントラクトレベルのイベントを発信することもできます。DAppsはイベントストリームのリスニングとTransactionProcessedイベントの検出、そしてmessages配列を解析して放出されたイベントのString表現を保存することでこれらのイベントを消費することができます。
Casper Sidecar
Casper Sidecar はノードプロセスと共に動作するアプリケーションです。サブスクライバがノードのイベントストリームを監視したり、保存されたイベントのクエリやノードのJSON-RPC APIのクエリが可能である為より速いレスポンスやノード上の負荷軽減が実現できます。サイドカーは以下の機能をサポートしています:
- サーバー送信イベント(SSE)エンドポイントは、接続されているすべてのノードからのイベントをストリーミングする/eventsエンドポイントを備えています。Sidecarはこれらのイベントも保存します。
- クライアントが保存されたイベントをクエリできるREST APIサーバー
- Casperノードと対話するためのJSON-RPC API
- 古いバージョンの SSE API を使用しているクライアントのためのレガシーエミュレーション
最新のソースコードと情報はGitHubをご覧ください:
- システム・アーキテクチャ
- サイドカーの設定
- Sidecarの実行とテスト
- REST APIのSwaggerドキュメント
- JSON-RPC API用のOpenAPIスキーマ
- トラブルシューティングTip
イベントストリーム
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)- EVENT_NAME – Casper ノードが発する様々なイベントタイプの一つ
イベントストリームの停止
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=29267508zshのような特定のシェルでは、クエスチョンマークの前にエスケープ文字が必要な場合があるためご注意ください:
curl -sN http://65.21.235.219:19999/events?start_from=29267508IDが0、もしくは既にキャッシュから削除されたイベントIDを指定した場合、サーバーはキャッシュされたすべてのイベントを再生します。
JSON-RPC API
SidecarはクライアントがCasperネットワークと疎通するJSON-RPC APIサーバーも提供しています。これはエンドユーザーとCasperノードのバイナリポート間のJSONブリッジであり、リクエストをCasperノードのバイナリポートに転送します。JSON-RPC APIの動作の詳細についてはJSON-RPC READMEを参照してください。
REST API
Sidecarは保存されたイベントのクエリ用REST APIを提供しています。OpenAPIとSwaggerを使って、REST API の特定のエンドポイントを見つけることができます。リポジトリにある使用説明書に詳細が記載されています。
トラブルシューティング用Tip
その他のトラブルシューティング用の情報は、Githubにてご確認いただけます。