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