【完全保存版】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
2 「oracle」フォルダの実施
1 実行してみよう
では、まずは、実行してみましょう。
npx hardhat w3f-run oracle --logs
下のようになりました。
こちらは、Ethreumの現在のドル建ての価格を取得しています。
なお下の、「673」という16進数を10進数に変換すると1,651(ドル)という、この時点での価格となります。
また、下の「8d6cc56d」の部分は「updatePrice(uint256)」の関数セレクタです。
なお、関数セレクタがご不明の場合は、こちらの第4章で簡単に解説しています。
実際にKeccak256で試してみると、このように変換されることが確認できました。(参考です)
2 コードを読んでみよう
では、実際の動きを見てみましょう。
「oracle」フォルダの「index.ts」を確認してみます。
「Web3Function」が実行されている箇所を確認してみましょう。
なお、引数である「context」の型である「Web3FunctionContext」の構成は下のようになります。
さらに、この中の「multiChainProvider」の型である「Web3FunctionMultiChainProvider」は下のようになります。
この中のdefault関数を使っています。
こちらで、providerを取得しています。
ブロックチェーンとやりとりを行うために使用します。
オラクルのアドレスを下のように設定します。
なお、オラクルとは、チェーンの外から情報を取ってくる仕組みで、「Chainlink」などもあります。
こちらで、コントラクトのインスタンスを作成しています。
このインスタンスを用いて、コントラクトの「lastUpdated」関数を実行します。
これで、コントラクトの情報を取って来ています。
次に、上で取ってきた、最終更新時間の1時間後と現在時刻を比較しています。
現在時刻が次の更新時刻より前であれば、「時刻が経過していない」旨を表示します。
次に、どの通貨かと、価格を入れています。
「Ethereum」で価格はここでは0に設定しています。
次に、CoinGeckoのAPIを取得しています。
「vs_currencies」は「usd」と設定してあり、ドル建てのAPIであることがわかります。
そのAPIを用いて、kyで価格データを取得しています。
3 「storage」フォルダの実施(ブロック番号の取得)
次に、ブロック番号を取得します。
次のコマンドで、mumbaiの最新のブロックを取得します。
npx hardhat w3f-run storage --logs --network mumbai
下のようになりました。
実際に、Polygonscanを確認すると、番号が一致していることが確認できました。
では、「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」の内容を取得していました。
今回は以上です。