Viem:轻量级以太坊开发工具库
2024-11-22 23:03
登链社区
2024-11-22 23:03
订阅此专栏
收藏此文章

前言

在以太坊生态系统蓬勃发展的今天,开发者们正在寻求更高效、更安全的开发工具来满足日益增长的需求。本文将为大家简要介绍 Viem 这款新一代以太坊开发库的主要特性和使用方法。

为方便中文开发者深入学习 Viem,我们登链社区已完成了 Viem 官方文档的完整中文翻译。如果你在阅读本文后想深入了解 Viem 的更多技术细节,欢迎访问 Viem 中文文档,那里提供了从入门到进阶的详细指南。

关键特性

Viem 的设计理念围绕着几个关键特性展开:

  • 模块化:可组合模块以快速构建应用程序和库
  • 轻量级:经过树摇优化的小型打包,体积极小
  • 高性能:与其他库相比,架构进行了优化
  • 类型化 API:灵活的编程 API,具有广泛的 TypeScript 类型

主要功能

Viem 支持开箱即用的功能:

  • JSON-RPC API 抽象
  • 智能合约交互
  • 钱包集成(浏览器扩展、WalletConnect、私钥钱包)
  • 原生 BigInt 支持
  • ABI 工具(编码 / 解码 / 检查)
  • 对 Anvil、Hardhat 和 Ganache 的一流支持

性能对比

根据官方数据显示,Viem 在多个关键指标上都展现出了显著优势:

  1. 包体积:相比其他库,显著降低了应用的资源占用
  2. 性能基准:在 ABI 编码、地址验证和解析等核心操作上表现优异

包大小对比

基准测试

快速入门指南

安装配置

npm install viem
# 或
yarn add viem

客户端初始化

import { createPublicClient, createWalletClient, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { mainnet } from 'viem/chains'

// 初始化公共客户端
const publicClient = createPublicClient({
  chain: mainnet,
  transport: http(), // 支持自定义 RPC 节点
})

// 账户配置
const account = window.ethereum || privateKeyToAccount('0x...');

// 初始化钱包客户端
const walletClient = createWalletClient({
    account,
    chain: mainnet,
    transport: http(),
})

常用操作示例

  1. 区块查询
const block = await publicClient.getBlock()
console.log('当前区块高度:', block.number)
  1. 发送交易
import { parseEther } from 'viem'

const hash = await walletClient.sendTransaction({
  to'0xC27018ca6c6DfF213583eB504df4a039Cc7d8043',
  value: parseEther('0.001')
})
console.log('交易哈希:', hash)
  1. 合约调用
const balance = await publicClient.readContract({
  address'0xdac17f958d2ee523a2206206994597c13d831ec7'//usdt 合约地址
  abi: contractABI, // eg: erc20 abi
  functionName'balanceOf',
  args: [accountAddress]
})
console.log('代币余额:', balance)

从 Ethers v5 迁移

Provider 迁移到 Client:

// Ethers 写法
const provider = getDefaultProvider()

// Viem 写法
const client = createPublicClient({
  chain: mainnet,
  transport: http()
})

Signer 迁移到 Account:

// Ethers 写法
const signer = provider.getSigner(address)

// Viem 写法
const client = createWalletClient({
  account,
  chain: mainnet,
  transport: custom(window.ethereum)
})

合约交互

  • 读取合约:
    • Ethers:new Contract(address, abi, provider).method()
    • viem:client.readContract({ address, abi, functionName })
  • 写入合约:
    • Ethers:new Contract(address, abi, signer).method()
    • viem:client.writeContract({ address, abi, functionName, account })

事件监听

// Ethers 写法
const contract = new Contract(address, abi, provider)
contract.on('EventName', listener)
contract.off('EventName', listener)


// viem 写法
const unwatch = client.watchContractEvent({
  ...contractConfig,
  eventName'EventName',
  onLogs: logs => {
    // 处理事件
  }
})
unwatch() // 取消监听

完整的迁移指南可以参考 Ethers v5 → viem 迁移指南

总结

Viem 作为新一代以太坊开发工具库,通过其现代化的设计理念和优异的性能表现,正在重新定义区块链开发体验。其核心优势包括:

  1. 优秀的开发体验:类型安全的 API 设计大幅降低开发错误
  2. 卓越的性能表现:轻量级架构带来更快的响应速度
  3. 丰富的功能集成:满足各类区块链应用开发需求

对于现代化区块链应用开发者而言,Viem 不仅是一个工具库,更代表了以太坊生态技术演进的新方向。它的出现标志着区块链开发工具正在向更高效、更专业的方向发展。


登链社区是一个 Web3 开发者社区,通过构建高质量技术内容平台和线下空间,助力开发者成为更好的 Web3 Builder。

  • 登链社区网站 : learnblockchain.cn

  • 开发者技能认证 : decert.me

  • B 站 : space.bilibili.com/581611011

  • YouTube : www.youtube.com/@upchain


【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

登链社区
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开