viem
Viem はイーサリアム用のタイプスクリプト・インターフェースで、イーサリアムや他のEVM互換ブロックチェーンとやり取りするための低レベルのプリミティブを提供する。 kaiaはEthereum Equivalenceの機能をサポートしているため、viemのようなEthereumツールはkaia上で大きな変更を加えることなく使用することができる。
そのため、開発者はこの互換性を活用し、viemライブラリを使ってkaiaノードとやりとりすることができる。
このガイドでは、viemライブラリを使用してブロックチェーンからデータを読み取り、トランザクションを送信し、kaia Network上の既存のコントラクトとやり取りする方法を学びます。
前提条件
- コードエディタ:VS Codeなどのソースコードエディタ。
- メタマスク:コントラクトのデプロイ、トランザクションへの署名、コントラクトとの対話に使用される。
- RPC エンドポイント: サポートされている エンドポイントプロバイダから取得できます。
- FaucetからKAIAをテスト: 口座に十分なKAIAを入金してください。
- NodeJSとNPM
- TS-node: TypeScriptスクリプトの実行に使用される。
セットアップ・プロジェクト
始めるには、このガイドで作成するファイルを格納するプロジェクト・ディレクトリを作成する必要がある。
mkdir viem-examplecd viem-example
1. viemをインストールする
viemをインストールするには、ターミナルで以下のコマンドを実行する:
npm i viem
このチュートリアルでは、ブロックチェーンからデータを読み取り、トランザクションを送信し、また既存のスマート・コントラクトとやり取りするためのスクリプト・ファイルを大量に作成する。 始めるには、スクリプト・ファイルごとにviemを設定する方法を知っておく必要がある。
2. パブリッククライアントとトランスポートの設定
まず、Public Clientに、希望する Transportと Chainを設定する必要があります。 パブリッククライアントとは、パブリックアクションを通じて、ブロック番号やトランザクションの取得、スマートコントラクトからの読み取りなど、パブリック JSON-RPC APIメソッドへのインターフェイスである。
import { createPublicClient, http } from 'viem'import { klaytnBaobab } from 'viem/chains' const client = createPublicClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io"), })
3. ウォレットクライアントとアカウントの設定
次に、アカウントとやり取りするためにウォレットクライアントを設定する必要があります。 ウォレットクライアントでは、Wallet Actionsを通じて、アカウントの取得、トランザクションの実行、メッセージの署名などのアクションを実行できます。
import { createWalletClient } from 'viem'import { privateKeyToAccount } from 'viem/accounts' const walletClient = createWalletClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io")}) const account = privateKeyToAccount("PASTE PRIVATE KEY HERE");
ブロックチェーンからデータを読み取る
ブロックチェーンからデータを読み取るには、プロジェクトフォルダー内に新しい read.ts ファイルを作成します。このコマンドを実行してください:
touch read.ts
このファイルを作成したら、上記のセットアップセクションで行ったように、パブリッククライアントをセットアップします。 このセクションでは、ブロックチェーンからデータを読み取る方法(例:blockNumber、KAIAの残高)を学びます。
これを実行するには、以下のコードを read.ts に貼り付けてください。
import { createPublicClient, http, formatEther } from 'viem'import { klaytnBaobab } from 'viem/chains' const client = createPublicClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io"), }) async function getBlockNumber() { const blockNumber = await client.getBlockNumber() console.log(`Current block number is: ${blockNumber}`);}async function getKlayBalance() { const balance = await client.getBalance({ address: '0x75Bc50a5664657c869Edc0E058d192EeEfD570eb', }) const formatBal = formatEther(balance); console.log(`Current KAIA balance is ${formatBal}`); }getBlockNumber();getKlayBalance();
出力
スクリプトを実行し、ブロックチェーンからデータを読み取るには、ターミナルに以下のコマンドを貼り付ける:
npx ts-node read.ts
取引が成功すると、ブロック番号とユーザーのKAIA残高が端末に表示されます。
ブロックチェーンにトランザクションを送信する
ブロックチェーンにトランザクションを送信するには、プロジェクトフォルダー内に新しい send.ts ファイルを作成します。このコマンドを実行してください:
touch send.ts
このファイルを作成した後、上記のセットアップセクションで行ったようにウォレットクライアントをセットアップします。 このセクションでは、ブロックチェーンにトランザクションを送信する方法(例えば、KAIAをアドレスに送信する)を学びます。
これを実際に見るには、send.ts
に以下のコードを貼り付ける。
import { createWalletClient, http, parseEther } from 'viem'import { klaytnBaobab } from 'viem/chains'import { privateKeyToAccount } from 'viem/accounts'const walletClient = createWalletClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io")}) const account = privateKeyToAccount("PASTE PRIVATE KEY");async function sendKlayToRecipient() { const hash = await walletClient.sendTransaction({ account, to: "PASTE RECIPIENT ADDRESS", value: parseEther('0.01') }) console.log(`Send KAIA tx hash is: ${hash}`);}sendKlayToRecipient();
出力
スクリプトを実行してブロックチェーンにトランザクションを送信するには、ターミナルに以下のコマンドを貼り付ける:
npx ts-node send.ts
トランザクションが成功した場合、トランザクションのハッシュがターミナルに記録されます。
スマートコントラクトとの対話
kaia上の既存のスマートコントラクトと対話するには、以下のコマンドを実行して、プロジェクトフォルダに新しいinteract.ts
ファイルを作成する:
touch interact.ts
このファイルを作成した後、上記のセットアップセクションで行ったように、パブリッククライアントとウォレットクライアントをセットアップします。 このセクションでは、viemを両方のために使用します:
- 契約書を読む。
- 契約書を書く。
このガイドのために、simple_storageコントラクトをコンパイルし、Remix IDE上にデプロイした。 そのため、 retrieve
関数を呼び出してこのコントラクトから読み取りを行い、store
関数を呼び出してこのコントラクトにトランザクションを送信する。
1. 契約書を読む
ABIエンコードされたデータ](https://viem.sh/docs/contract/encodeFunctionData)を使って[コールアクション](https://viem.sh/docs/actions/public/call)を呼び出すために、内部的に[パブリッククライアント](https://viem.sh/docs/clients/public)を使用する[readContract](https://viem.sh/docs/contract/readContract#readcontract)メソッドを使用した。 これを実際に見るには、interact.js
に以下のコードを貼り付ける。
import { createPublicClient, http } from 'viem'import { klaytnBaobab } from 'viem/chains' const client = createPublicClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io"), }) const abi = [ { "inputs": [], "name": "retrieve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "num", "type": "uint256" } ], "name": "store", "outputs": [], "stateMutability": "nonpayable", "type": "function" }]async function readFromContract() { const retrieve = await client.readContract({ address: "0x472a1226796b6a0918DC78d40b87d750881fdbDC", // Contract Address abi: abi, functionName: 'retrieve' }) console.log(`Value read from contract is: ${retrieve}`);}
2. 契約書
コントラクトに書き込むには、writeContractメソッドを使用しました。このメソッドは内部的にWallet Clientを使用し、sendTransaction アクションをABIエンコードされたデータで呼び出します。 これを実際に見るには、interact.js
に以下のコードを貼り付ける。
import { createWalletClient, http } from 'viem'import { klaytnBaobab } from 'viem/chains'import { privateKeyToAccount } from 'viem/accounts' const walletClient = createWalletClient({ chain: klaytnBaobab, transport: http("https://public-en-kairos.node.kaia.io")}) const account = privateKeyToAccount("PASTE PRIVATE KEY");const abi = [ { "inputs": [], "name": "retrieve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "num", "type": "uint256" } ], "name": "store", "outputs": [], "stateMutability": "nonpayable", "type": "function" }]async function writeToContract() { const { request } = await client.simulateContract({ address: "0x472a1226796b6a0918DC78d40b87d750881fdbDC", // Contract Address abi: abi, functionName: "store", account: account, args: [694n], }) const hash = await walletClient.writeContract(request) console.log(`Hash from writing to a contract: ${hash}`);}writeToContract();
出力
スクリプトを実行してスマート・コントラクトとやり取りするには、ターミナルに以下のコマンドを貼り付ける:
npx ts-node interact.ts
トランザクションが成功した場合、トランザクションハッシュとターミナルに保存された値が表示されます。
viemに関するより詳細なガイドについては、viem docsを参照してください。 また、このガイドのコードの完全な実装はGitHubにあります。