跳至主要內容
本頁面使用機器翻譯自英語,可能包含錯誤或不清楚的語言。如需最準確的信息,請參閱英文原文。由於更新頻繁,部分內容可能與英文原文有出入。請加入我們在 Crowdin 上的努力,幫助我們改進本頁面的翻譯。 (Crowdin translation page, Contributing guide)

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. 設置公共客戶端和傳輸​

首先,您需要用所需的 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 上找到本指南的完整實現代碼。

讓這個頁面變得更好