logo

Shadowについて調べてみた

〜indexerより愛を込めて〜
profile photo
TaniguchiAkira
(この記事は2023年12月8日時点の情報をもとに記述しています。)

Shadowとは

公式サイト曰く、
『高度なオンチェーンデータインデキシングと分析のためのエンジニアリング時間とコストを削減するプラットフォーム』
とのこと

わかりやすくいうと

  1. 各種イベント情報(ERC20のTransfer等)を集めてくれる
    1. 収集されたイベント情報は画面から確認できるし、APIで取得することもできる
  1. 独自イベントを追加し、ログとして吐かせることができる
1は今までも実現できていたが、2が重要。
おそらくShadowが独自に構築している環境でイベントを追加したコントラクトを稼働させるか、シミュレーションするかして、その結果を出力している(ような気がする)。
どこまで細かくやっているかはわからないが、Plonky2などを使い、トランザクションのチェックとかもやっているかもしれない(そこまでやってないかもしれない、どっちなんだい、教えておくれ、僕の筋肉)
例えばUpgradeableに記述されていないコントラクトだと、内部でイベントを追加したくても二度とできないが、それが可能になる。
本番のコントラクトはイベントを設定せずにデプロイし、Shadow側のコントラクトはイベントを設定することによって、欲しい情報はShadow側から手にいれ、ガス代を削減することもできる

手順

getting startedを参考にすすめる。

1.Shadowアカウント作成

ポータルサイト にGoogle認証でログインし、アカウントを作成
Image without caption

2.接続テスト

ログイン後、認証キーが発行されるので、それを使って接続テストを行う
javascript
curl https://rpc.beta.shadow.xyz/ethereum/mainnet/v1/{認証キー}/v0 \ -X POST \ -H "Content-Type: application/json" \ --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' {"error":"Not Found"}%
見事にエラーが出るが、これは時間が解決してくれる。
短気なものにブロックチェーンは向いていない。
javascript
curl https://rpc.beta.shadow.xyz/ethereum/mainnet/v1/{認証キー}/v0 \ -X POST \ -H "Content-Type: application/json" \ --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' {"jsonrpc":"2.0","id":1,"result":"0x11dd131"}%
数分経つと結果が帰ってきた、安心。

3.コントラクト参照

検索バーにコントラクトアドレスを入力すると、対象のコントラクトがポータル画面に反映される
試しに弊社が発行しているDEAPCoinのアドレスを入力してみたところ、無事反映された。
反映直後はトランザクション情報などは取得されていない。
Image without caption
おそらくだが、コントラクトはverifyがなされれている必要があると思われる。
Event schemasを参照するとイベント情報が表示される。
Image without caption

4.イベント取得

コントラクト名、およびイベント名の横にチェックを入れ、しばらく待つとイベント情報の収集がなされる。
Image without caption
この情報は先にもいった通り、画面からも参照できるし、APIでも取得できる。
これはTransferイベントを取得した時の例。人類はGraphQLから解放された。
javascript
curl https://rpc.beta.shadow.xyz/ethereum/mainnet/v1/{認証キー}/v2 \ -X POST \ -H "Content-Type: application/json". \ --data '{"method":"eth_getLogs","params":[{"fromBlock": "18732196", "toBlock": "18732200", "address": "0x1a3496c18d558bd9c6c8f609e1b129f67ab08163", "topics": []}], "id":1, "jsonrpc":"2.0"}' { "jsonrpc": "2.0", "id": 1, "result": [ { "address": "0x1a3496c18d558bd9c6c8f609e1b129f67ab08163", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000fbb1b73c4f0bda4f67dca266ce6ef42f520fbb98", "0x000000000000000000000000ae1d91fdeba061a3ed1a70e639afc11e36f53574" ], "data": "0x00000000000000000000000000000000000000000000521437b2e61971fc0000", "blockHash": "0x0a825f40cbb5120e304544154992fec5b8a3b91462753501f14b3df05b62b044", "blockNumber": "0x11dd4a5", "transactionHash": "0x86a31cc16db0df7f564e5ac4ec034fc48bc402e942f5b4355749442bb958d481", "transactionIndex": "0x2b", "logIndex": "0xde", "removed": false }, { "address": "0x1a3496c18d558bd9c6c8f609e1b129f67ab08163", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000ae1d91fdeba061a3ed1a70e639afc11e36f53574", "0x0000000000000000000000006cc5f688a315f3dc28a7781717a9a798a59fda7b" ], "data": "0x00000000000000000000000000000000000000000000521437b2e61971fc0000", "blockHash": "0x43c2b8fb736c0a9409da3862d7a8d6c54e143e982649193bdb79fecea9eece9a", "blockNumber": "0x11dd4a7", "transactionHash": "0x6c4981bb79790ea07ad6bdf3aed53304a96b1997b41720874d97d64f241e968c", "transactionIndex": "0xc4", "logIndex": "0x128", "removed": false } ] }
エンコードだかデコードだかをする必要はあるが、これは便利。
もちろんShadowは有料なので、その点は考慮しなければいけない。

5.独自イベント設定

ここからが本番、独自イベントを設定し、動作を検証する。
DEAPCoinはUpgradeableではない(決してdisではない)ので、こういうことができると助かる。
Image without caption
Contract codeを選択すると、DEAPCoinのソースコードが表示され、その右上に「Open in editor」なるボタンが表示されるので、ここをクリックするとSolidityをエディットできる。
Image without caption
試しにTaniguchiイベントなるものを設定してみた。
Image without caption
トークンがtransferされるたびに、Shadow環境のDEAPCoinはTaniguchiイベントを発生させるはめになる。
右上にDeployボタンがあるので、押下する。(緊張の一瞬)
Image without caption
Shadow環境でのコンパイル、およびデプロイがうまく行ったようだが、ここで一つ問題が発生する。いつまで経ってもTaniguchiイベントが収集されない。
Image without caption
イベントスキーマでイベントの一覧を見ても、Taniguchiイベントが表示されていない。
DEAPCoinはApprovalなど、Transfer以外にもイベントが存在するのだが、それも表示されていない。
おそらく、ソースコードからイベント情報を取得する部分にバグがあるものと思われるんだが、実際どうなんだい?教えておくれ、僕の筋肉。
今後に期待というところ。

終わりに

まだEthereumn mainnetしか対応していない、イベント一覧取得機能におそらく不具合があるなど、課題はあるが、今後が楽しみなプロダクトではある。
パブリックチェーンを使う限り、我々はガス代と戦う必要が出てくるので、こういうプロダクトはとても助かる。
しかし何度も言うが、Shadow自体にお金を払う必要はあるので、そこは気をつけたい。
Related posts
post image
Arbitrum
Rust
contract
WASM
Arbitrum Stylusのすゝめ
〜SolidityHouseの名前はどうなるの?〜
post image
俺たちの戦いはこれからだ!
post image
Solana
Wormhole
Bridge
contract
WormholeのNTT
SIerとはいえトップはホワイト
Powered by Notaku