Indexer比較WIP概要ブロックチェーンの情報をDBにエクスポートするにあたって既存ツールの調査・検証・比較を行う。制御情報(途止めた場合。sqlを動かすグラフ更新TL;DRhttps://gyazo.com/4a2d580c16592ed30e435c4a26352cd4ether-sql全体的に使いやすいが、同期が30秒(2ブロック)毎と少しリアルタイム性に欠ける。Ethereum-etlセットアップが簡単でエンジニアでなくても扱いやすい。CSVへのエクスポートなど統計、解析向き。BigQueryで使われている。eth.eventsAPIキーだけもらってSQLを操作する。パブリックな情報を解析するサービス向け。eventeumWebSocketでイベントの発火を取得してくれる。SQLもサポート予定。GraphWebSocketでイベントの発火を取得してくれる。クエリはGrapsQLを使用。いう時に使える?ブロックチェーンの情報を取得してDBに格納、解析などしたい時。blockchainのデータをsqlデータベースにプッシュするPythonライブラリ。RabbitMQを利用する。ブログもgithubも1年前から更新がない。queueを使うことで随時取得可能。11つ目のqueueは30秒毎に(約2ブロック毎)新しいブロックを探し、(遅くないか?)2新しく発見されたものを2つ目のqueueにプッシュする。32つ目のqueueは1つ目からプッシュされた最新の情報をもとにノードからブロックデータを取得し、4詳細な情報をデータベースにプッシュする。プッシュ時はデータベースの最後のブロックを確認し、後続のブロックをプッシュしていく。queue1はひたすらブロックの最新状況をチェックするマン、queue2はqueue1からの情報をもとにDBにプッシュするマンと役割分担している模様。reorgへの言及はなし。データ上述のようにeventの情報はない。Logsのテーブルは以下のようになっていて、イベントデータの形式はLogをデコードする過程で自分で決める。amount)というイベントを検出する場合対応するtopicは0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146なので以下のようになる。https://gyazo.com/a8b691d840c52a50cf5ae43de54270e4dataをデコードすれば必要な情報は得られる。transactions)を抽出、変換、ロードできるpythonスクリプト。BigQueryで利用可能。google大先生公認というだけあって非常に情報がまとまっている。(load)の2つで仕事が分けられる。(export)EthereumブロックチェーンのデータをCSVまたはJSONでエクスポートできるオープンソースツール。nodeに接続し、随時ブロックとトランザクションのデータを取得する。https://gyazo.com/ccf85d5f45d211cf728c37012b0f7ae9ethereum-etlではまずblocks_and_transctionsをexport_receipts_and_logsで生成したファイルから指定のイベントログでフィルターにかけエクスポートすることが可能。生成されたファイルをtransferイベントのログでフィルターにかけエクスポートする。Storageで移し、BigQueryにloadする。BigQueryコンソールやAPIによってデータをクエリできる。ERC20、721トークンの場合はtoken_transfersから検出が可能。architecture)リアルタイム(ブロック毎)で情報を取得することが可能。Pub/SubやAWSにエクスポートすることが可能。)という別のライブラリがある。どこまでのデータをsyncしたかはlast_synced_blockで保存される。オプションによってブロックを遡ることが可能。これによりre-orgにも対応可。データhttps://gyazo.com/700bb264408c04102938aa973e6887cf上述のようにイベントの情報はない。イベントデータの形式はLogをデコードする過程で自分で決める。概要eth.eventsはホストされたEthereumベースのブロックチェーンのイベントをフィルタリングして検索するAPIを提供する。PostgreSQLベース。ユーザー登録するとAPIキーがもらえる。methodsという謎のテーブルの計9種類用意されており、クエリが可能。サーバーのインデックスは新しいブロックが生成される度にリアルタイムでアップデートされる。新しいブロック生成時にSQLのインデックスも更新され、関係のない情報は除かれるためre-orgへの耐性もある。メモイベントのデコードはABIを提出することで可能に2019年4月3日のブログによるとlogの91%デコード済みとのこと。自分でeth.eventsを運用することができないのでABIを提出することでデコードしてもらう必要がある。ABIを提出したくなければ自分でlogからデコードするのみ。Logをクエリをした時ダブりが出たhttps://gyazo.com/49144e4cb7778f38b02408bf58781d7d試しにコントラクトのイベントログを取得してみたらトランザクションがダブっていた。概要Ethereumのイベント監視サービス。スマートコントラクトとミドルウェアレイヤーをbridgeする。ユーザーはイベントを直接監視することなくイベントに関する情報をsubscribeできる。Kafka/ZookepperとMongoDBを使用。kauriによって開発されており、Consensysに採択されてるプロジェクトでもある。RabbitMQ)に伝播してくれる。上図には記されていないが、複数のノードからデータを取得することが可能。ノードのsubscribeはweb3jで行われる。protocolの代わりにWebSocketを利用している。取得できる情報は主にコントラクトイベント、ブロックイベント、トランザクションイベントの3種類。default)に以下のフォーマットで伝播されるhttps://gyazo.com/4a2bd99dd1bf758c9a01f28895b014beデータeventに関するテーブルはcontractEventDetails、contractEventFilter、latestBlockの3つ。contractEventDetailsイベントの詳細の一覧。トランザクションデータはnonIndexedParametersに格納。事前に指定した型も教えてくれる。メモSQLフォーマットドキュメントにはまだ書かれてないがSQLフォーマットに対応するコミットが2019年8月13日にマージされている。起きた場合Eventeumは完全に承認されるまでのブロック数を指定することができる。仮に承認されるまでの間にフォークが起きた場合、マイナーなチェーンのTransactionをINVALIDとみなすまでのブロック数を指定することができる。Graphはブロックチェーン上のデータをインデックス化やしたりクエリしてりするための分散プロトコル。node、Store(PostgreSQL)によって運用されている。現在はゴリゴリ開発中のため、APIの仕様などはコロコロ変わる可能性があるとのこと。Ethereumのeventに応じてトランザクションをいくつか生成し、storeを更新する。endpointを利用して取得しようとする。Nodeはそのクエリをstoreに対してのクエリに変換し、情報を取得する。7dAppはuser-friendlyなフォーマットで情報を表示する。nodeがそれを検知し、ブロックに取り込まれた時にstoreは更新される。manifestと呼ばれ、上図のsubgraph.yamlに格納される。Explorerでstateを確認することができる。ブロックチェーンとの同期はgenesisブロックから行われ、指定したイベントを取得していく。subgraphに変更を加えた場合は新しいsubgraphをデプロイすることで更新することが可能であり、この場合syncがgenesisブロックから再び行われる。nodeのsyncを中断した場合も続きからまたsyncが始まる。イベントを取得したい場合はsubgraphの以下の項目に欲しいイベント名などを指定する。subgraphを作成するコマンドでコントラクトから全てのイベントは拾うように自動で設定してくれるのいじる必要はあまりなさそう。起きた場合はロールバックしてstoreを更新するgraphQLstoreからGraphQLでデータを取得する。subgraphのschema.graphqlというファイルで取得する情報と型を指定。クエリする情報はここで決める。watcherで監視/検知しており参考になりそう。TokenBridgeはEthereumエコシステムの2つのチェーン間での資産の移転を可能にします。Oracleは、ネットワーク内の指定されたバリデーターノード(コントラクト内でで指定されたアドレスの秘密鍵を持つノードのみ)にデプロイされます。(RPC)を介して2つのチェーンに接続し、ブリッジコントラクトに関連するイベントの監視と資産の移転を承認するトランザクションの送信を行う。アーキテクチャNative-to-ERC20https://gyazo.com/0716fddad983cbc5818a91e1abcf3de7Watcherwatcherは特定のイベントを監視し、queue内に適切なjobを作成します。これらのjobには、トランザクションデータ(ナンスなし)およびイベントのトランザクションハッシュが含まれます。watcherは指定された頻度で実行され、最新のブロックを追跡します。contractのTransferイベントを監視Sender送信者はqueueをサブスクライブしながらナンスを追跡します。Senderはqueueからjobを取得し、トランザクションデータを抽出し、適切なナンスを追加して、ネットワークに送信します。Oraclehttps://github.com/poanetwork/tokenbridge/blob/master/oracle/README.md参考Ethereumでコントラクトの監視https://qiita.com/satons/items/d9c2dabfbf513e44f78b。