見出し画像

【完全保存版】GelatoのWeb3 Functionsを実行してみよう!

0 はじめに

ここでは、Gelato「Web3 Functions」のチュートリアルを実施していきます。

この記事で行われているのは、ブロック番号の取得と、「CoinGecko」を用いた、ETH価格の取得です。

この機能は現在、プライベートベータ版ですが、「autotask」という機能が実装されたら面白そうだと思いました。

1 準備を行おう

1 git clone

まずは、git clone を行います。

git clone https://github.com/gelatodigital/web3-functions-hardhat-template.git

2 依存関係のインストール

ディレクトリを移動し、依存関係をインストールします。

cd web3-functions-hardhat-template/
yarn install

3 .envファイルの作成

続いて、「.env.example」をコピーして、「.env」ファイルを作成します。

そこに「ALCHEMY_ID」を入力します。

なお、「INFURA_ID」も必要でしたので、そちらも追加します。

なお、「ALCHEMY_ID」「INFURA_ID」はアカウントを作ることで簡単に取得できます。

・Alchemy

・Infura

https://www.infura.io/

2 「oracle」フォルダの実施

1 実行してみよう

では、まずは、実行してみましょう。

npx hardhat w3f-run oracle --logs 

下のようになりました。

こちらは、Ethreum現在のドル建ての価格を取得しています。

なお下の、「673」という16進数を10進数に変換すると1,651(ドル)という、この時点での価格となります。

また、下の「8d6cc56d」の部分は「updatePrice(uint256)」関数セレクタです。

なお、関数セレクタがご不明の場合は、こちらの第4章で簡単に解説しています。

実際にKeccak256で試してみると、このように変換されることが確認できました。(参考です)

https://emn178.github.io/online-tools/keccak_256.html

2 コードを読んでみよう

では、実際の動きを見てみましょう。

「oracle」フォルダの「index.ts」を確認してみます。

「Web3Function」が実行されている箇所を確認してみましょう。

なお、引数である「context」の型である「Web3FunctionContext」の構成は下のようになります。

さらに、この中の「multiChainProvider」の型である「Web3FunctionMultiChainProvider」は下のようになります。

この中のdefault関数を使っています。

こちらで、providerを取得しています。

ブロックチェーンとやりとりを行うために使用します。

オラクルのアドレスを下のように設定します。

なお、オラクルとは、チェーンの外から情報を取ってくる仕組みで、「Chainlink」などもあります。

こちらで、コントラクトインスタンスを作成しています。

このインスタンスを用いて、コントラクトの「lastUpdated」関数を実行します。

これで、コントラクトの情報を取って来ています。

次に、上で取ってきた、最終更新時間の1時間後現在時刻を比較しています。

現在時刻次の更新時刻より前であれば、「時刻が経過していない」旨を表示します。

次に、どの通貨かと、価格を入れています。

「Ethereum」価格はここではに設定しています。

次に、CoinGeckoAPIを取得しています。

「vs_currencies」「usd」と設定してあり、ドル建てのAPIであることがわかります。

そのAPIを用いて、ky価格データを取得しています。

3 「storage」フォルダの実施(ブロック番号の取得)

次に、ブロック番号を取得します。

次のコマンドで、mumbaiの最新のブロックを取得します。

npx hardhat w3f-run storage --logs --network mumbai

下のようになりました。

実際に、Polygonscanを確認すると、番号が一致していることが確認できました。

https://mumbai.polygonscan.com/

では、「storage」フォルダの「index.ts」ファイルを確認してみましょう。

まずは、下の「storage.get("lastBlockNumber")」を見てみましょう。

これは、同じ「storage」フォルダ内の「storage.json」の値を取ってきていました。

そして、下の部分では、「provider」を通じて、ブロックチェーンから現在のブロック番号を取得していました。

4 「secrets」フォルダの実施(ETH価格の取得)

では、最後に「secrets」フォルダも実行してみましょう。

「.env.example」ファイルコピーして、「.env」ファイルを作ります。

こちらのコマンドを実行します。

npx hardhat w3f-run secrets --logs

すると、下のようにEthereumの価格を取得しました。

第2章で取得した値と異なるのは、この記事を書いた時間帯が異なるためです。)

第2章との違いだけ、こちらに書きます。

このように、「context.secrets.get("COINTGECKO_API")」の部分で「.env」の内容を取得していました。

今回は以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊