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

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-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 上找到本指南的完整實現代碼。

讓這個頁面變得更好