跳至主要內容

viem

Viem是以太坊的類型碼接口,提供與以太坊和其他 EVM 兼容區塊鏈交互的底層基元。 由於 kaia 支持Ethereum Equivalence功能,因此 viem 等以太坊工具無需進行任何重大修改即可在 kaia 上使用。

因此,開發人員可以利用這種兼容性,使用 viem 庫與 kaia 節點進行交互。

在本指南中,您將學習如何使用 viem 庫從區塊鏈讀取數據、發送交易以及與 kaia 網絡上的現有合約交互。

要求

  • 代碼編輯器:源代碼編輯器,如 VS Code
  • Metamask:用於部署合約、簽署事務和與合約交互。
  • RPC 端點:您可以從其中一個支援的 Endpoint Providers 取得。
  • 水龍頭測試 KAIA:為您的賬戶注入足夠的 KAIA。
  • NodeJS和NPM
  • TS-node:用於運行 TypeScript 腳本。

設置項目

開始時,您需要創建一個項目目錄來存放本指南中要創建的文件。


mkdir viem-example
cd viem-example

1. 安裝 viem

要安裝 viem,請在終端運行以下命令:


npm i viem

在本教程中,我們將創建一系列腳本文件,用於從區塊鏈讀取數據、發送交易以及與現有智能合約交互。 要開始使用,您需要知道如何為每個腳本文件設置 viem。

2. 設置公共客戶端和傳輸

首先,您需要用所需的 TransportChain 設置公共 客戶端。 公共客戶端是公共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 上找到本指南的完整實現代碼。

讓這個頁面變得更好