viem
Viem是以太坊的類型碼接口,提供與以太坊和其他 EVM 兼容區塊鏈交互的底層基元。 由於 kaia 支持Ethereum Equivalence功能,因此 viem 等以太坊工具無需進行任何重大修改即可在 kaia 上使用。
因此,開發人員可以利用這種兼容性,使用 viem 庫與 kaia 節點進行交互。
在本指南中,您將學習如何使用 viem 庫從區塊鏈讀取數據、發送交易以及與 kaia 網絡上的現有合約交互。
要求
- 代碼編輯器:源代碼編輯器,如 VS Code。
- Metamask:用於部署合約、簽署事務和與合約交互。
- RPC 端點:您可以從支持的[端點提供程序](.../public-en.md)中獲取。
- 從 水龍頭測試 KAIA:為您的賬戶注入足夠的 KAIA。
- NodeJS和NPM
- TS-node:用於運行 TypeScript 腳本。
設置項目
開始時,您需要創建一個項目目錄來存放本指南中要創建的文件。
mkdir viem-examplecd viem-example
1. 安裝 viem
要安裝 viem,請在終端運行以下命令:
npm i viem
在本教程中,我們將創建一系列腳本文件,用於從區塊鏈讀取數據、發送交易以及與現有智能合約交互。 要開始使用,您需要知道如何為每個腳本文件設置 viem。
2. 設置公共客戶端和傳輸
首先,您需要用所需的 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. 設置錢包客戶端和賬戶
其次,您需要設置一個錢包客戶端與賬戶進行交互。 使用錢包客戶端,您可以通過錢包操作執行檢索賬戶、執行交易、簽署信息等操作。
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 和 viem:
- 從合約中讀取;以及
- 寫入合約。
為編寫本指南,我們在 Remix IDE 上編譯並部署了 simple_storage 合約。 因此,我們將通過調用 retrieve
函數從該合約中讀取內容,並通過調用 store
函數向該合約發送事務。
1. 從合約中讀取
為了讀取合約,我們使用了 readContract 方法,該方法在內部使用 Public Client 調用帶有 ABI 編碼數據 的 call action。 要查看實際效果,請在您的 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 來調用帶有 ABI 編碼數據 的 sendTransaction action。 要查看實際效果,請在您的 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 上找到本指南的完整實現代碼。