跳至主要内容

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 上找到本指南的完整实现代码。

让这个页面变得更好