viem库
viem是一个用于和以太坊进行交互的javascript库,它提供了简单的API进行智能合约的读取和写入操作,你可以使用它来与区块链上智能合约进行交互,查询链上数据等。
基本功能
1,创建公有客户端
createPublicClient 可以创建一个链接到区块链的公有客户端,通常用于查询数据。
import { createPulicClient,http} from 'viem'
const client = creatPublicClient({
chain:"etherum",//链名
transport:http('https://mainnet.infura.io/v3'), //节点
})
参数 说明
chain 指定要连接的区块链网络(如 mainnet, goerli, sepolia)
transport 连接方式,通常是 http() 或 webSocket()
🔹 其他可用 publicClient 方法
📌 获取账户余额
const balance = await client.getBalance({address: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e',
});
console.log('ETH 余额:', balance);
📌 获取当前 gas 价格
const gasPrice = await client.getGasPrice();
console.log('当前 Gas 价格:', gasPrice);
📌 获取交易信息
const tx = await client.getTransaction({hash: '0x交易哈希',
});
console.log('交易详情:', tx);
✅ 总结
createPublicClient 适用于读取链上数据(区块、交易、余额、智能合约)。
适用于 无私钥 操作,不涉及交易发送。
可以与 Alchemy、Infura 等 RPC 服务提供商配合使用。
如果你想发送交易或者调用合约的 write 方法,你需要一个钱包客户端(createWalletClient),它支持:
发送 ETH 转账
调用智能合约 方法(如 approve, transfer, swap)
进行 EIP-1559 交易
离线签名 交易并广播
1. 创建钱包客户端(createWalletClient)
如果你要发送交易,必须使用私钥或连接钱包。
import { createWalletClient, http, privateKeyToAccount } from 'viem';
import { mainnet } from 'viem/chains';// 通过私钥创建账户
const account = privateKeyToAccount('0xYOUR_PRIVATE_KEY');// 创建钱包客户端
const walletClient = createWalletClient({account,chain: mainnet,transport: http('https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY'),
});console.log('钱包地址:', account.address);
📌 注意:使用私钥时,请确保安全存储,避免泄露!
2. 发送 ETH 转账
使用 sendTransaction() 发送 ETH 到目标地址:
import { parseEther } from 'viem';const txHash = await walletClient.sendTransaction({to: '0xRecipientAddress', // 目标地址value: parseEther('0.01'), // 发送 0.01 ETH
});console.log('交易哈希:', txHash);
📌 解释
to:接收 ETH 的钱包地址
value:发送的 ETH 金额(使用 parseEther() 处理)
txHash:返回的交易哈希,可用于查询交易状态
2,获取合约实例
getContract 用于获取智能合约实例,并允许你与合约进行交互。
import {getContract } from 'view '
const contract = getContract(client,{
address:'', //合约地址
abi:[], //合约abi
});
3,调用合约的函数
- 授权 ERC-20 代币(approve 方法)
如果你要在 DEX(如 Uniswap)上进行交易,需要先授权合约能使用你的代币。
const txHash = await walletClient.writeContract({address: '0xA0b86991c6218b36c1d19D4a2e9eb0cE3606e48c', // USDC 合约地址abi: parseAbi(['function approve(address spender, uint256 amount) public returns (bool)',]),functionName: 'approve',args: ['0xSpenderContractAddress', parseEther('1000')], // 授权 1000 USDC
});console.log('授权交易哈希:', txHash);
📌 适用于:
Uniswap / PancakeSwap 交易前,给 DEX 合约授权
质押 Staking 前,给 Staking 合约授权
5. 监听交易状态
提交交易后,你可以轮询或监听交易状态:
import { waitForTransactionReceipt } from 'viem';const receipt = await waitForTransactionReceipt(client, { hash: txHash });
console.log('交易成功 ✅', receipt);
📌 适用于
确保交易成功后执行后续操作(比如显示 UI 提示)
监听 status 是否 success
6. EIP-712 签名(Permit 授权 & Meta 交易)
如果合约支持 EIP-712(如 Permit 授权,无需 approve),你可以使用 signTypedData():
const signature = await walletClient.signTypedData({domain: {name: 'MyDApp',version: '1',chainId: 1,verifyingContract: '0x1234567890abcdef1234567890abcdef12345678',},types: {Permit: [{ name: 'owner', type: 'address' },{ name: 'spender', type: 'address' },{ name: 'value', type: 'uint256' },{ name: 'nonce', type: 'uint256' },{ name: 'deadline', type: 'uint256' },],},primaryType: 'Permit',message: {owner: '0xYourWalletAddress',spender: '0xSpenderContractAddress',value: parseEther('1000'),nonce: 1,deadline: Math.floor(Date.now() / 1000) + 3600, // 1 小时后过期},
});console.log('EIP-712 签名:', signature);
📌 适用于
Gasless 交易(如 EIP-2612 Permit)
Meta 交易(第三方代付 Gas
7. 创建自定义交易
如果你想自定义交易参数,可以手动指定 gasLimit、maxPriorityFeePerGas 等:
const txHash = await walletClient.sendTransaction({to: '0xRecipientAddress',value: parseEther('0.01'),maxFeePerGas: parseGwei('20'), // 手动设置 Gas 费用maxPriorityFeePerGas: parseGwei('2'),gasLimit: 21000, // 手动设置 gas 限额
});
console.log('自定义交易哈希:', txHash);
📌 总结
🚀 viem 提供了比 ethers.js 更轻量级、类型安全的 Web3 交互方案,非常适合 DApp、交易所、NFT 平台开发
相关文章:

viem库
viem是一个用于和以太坊进行交互的javascript库,它提供了简单的API进行智能合约的读取和写入操作,你可以使用它来与区块链上智能合约进行交互,查询链上数据等。 基本功能 1,创建公有客户端 createPublicClient 可以创建一个链接…...

Iceberg and AIStor 的Lakehouse Architecture 权威指南
Apache Iceberg 似乎已经掀起了一场(暴风雪)数据世界。它最初由 Ryan Blue(也是 Tabular 的成员,现在是 Databricks 的名人)在 Netflix 孵化,最终被传输到它目前所在的 Apache 软件基金会。从本质上讲&…...

TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解
注:本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议,也叫 TCP/IP 协议族(TCP/IP Protocol Suite,或 TCP/IP Pr…...

第四节 docker基础之---dockerfile部署JDK
本地宿主机配置jdk 创建test目录: [rootdocker ~]# mkdir test 压缩包tomcat和jdk上传到root/test目录下: 本机部署Jdk 解压jdk: [rootdocker test]# tar -xf jdk-8u211-linux-x64.tar.gz [rootdocker test]# tar -xf apache-tomcat-8.5.…...

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明
项目场景: 有时候加载的地图服务白色区域会露底,导致在三维场景时,露出了三维网格,影响效果,自此,我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示: 解决方案: 提示…...

基于javaweb的SpringBoot电影推荐系统
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明项目介绍环境需要技术栈使用说明 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclips…...

【kafka系列】Topic 与 Partition
Kafka 的 Topic(主题) 和 Partition(分区) 是数据组织的核心概念,它们的映射关系及在 Broker 上的分布直接影响 Kafka 的性能、扩展性和容错能力。以下是详细解析: 一、Topic 与 Partition 的映射关系 Top…...

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现
前言 大数据项目源码资料说明: 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等,极大提升效率! 1、项目目标 本…...

[笔记] 汇编杂记(持续更新)
文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…...
同步阻塞IO和多路复用IO(epoll)的性能对比
多路复用 I/O(如 epoll)相比传统的同步阻塞 I/O 在网络性能上具有显著优势,主要原因在于其高效的事件驱动机制和对高并发的优化能力。 1. 同步阻塞 I/O 的性能瓶颈 在传统的同步阻塞 I/O 模型中,每个网络连接通常需要一个独立的线…...

前端 CSS 动态设置样式::class、:style 等技巧详解
一、:class 动态绑定类名 v-bind:class(缩写为 :class)可以动态地绑定一个或多个 CSS 类名。 1. 对象语法 通过对象语法,可以根据条件动态切换类名。 <template><div :class"{ greenText: isActive, red-text: hasError }&…...
qt widget和qml界面集成到一起
将 Qt Widgets 和 QML 界面集成在一起可以利用 QQuickWidget 或 QQuickView。以下是基本步骤: 使用 QQuickWidget 创建 Qt Widgets 项目: 创建一个基于 Widgets 的应用程序。添加 QQuickWidget: 在你的窗口或布局中添加 QQuickWidget。 例如,可以在 QMainWindow 中使用: …...

BUU30 [网鼎杯 2018]Fakebook1
是一个登录界面,我们先注册一个试试: 用dirsearch扫描出来robots.txt,也发现了flag.php,并下载user.php.bak 源代码内容: <?phpclass UserInfo {public $name "";public $age 0;public $blog &quo…...

信息科技伦理与道德3-2:智能决策
2.2 智能推荐 推荐算法介绍 推荐系统:猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一:YouTube推荐算法向儿童推荐不适宜视频 …...

《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合
《代码随想录第二十八天》——回溯算法理论基础、组合问题、组合总和III、电话号码的字母组合 本篇文章的所有内容仅基于C撰写。 1. 基础知识 1.1 概念 回溯是递归的副产品,它也是遍历树的一种方式,其本质是穷举。它并不高效,但是比暴力循…...

PromptSource官方文档翻译
目录 核心概念解析 提示模板(Prompt Template) P3数据集 安装指南 基础安装(仅使用提示) 开发环境安装(需创建提示) API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…...

USB子系统学习(四)用户态下使用libusb读取鼠标数据
文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试6、其它 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商…...

Ansible简单介绍及用法
一、简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...
目前推荐的优秀编程学习网站与资源平台,涵盖不同学习方式和受众需求
一、综合教程与互动学习平台 菜鸟教程 特点:适合零基础新手,提供免费编程语言教程(Python、Java、C/C++、前端等),页面简洁且包含大量代码示例,支持快速上手。适用人群:编程入门者、需要快速查阅语法基础的学习者。W3Schools 特点:专注于Web开发技术(HTML、CSS、JavaS…...
软件工程-软件需求规格说明(SRS)
基本介绍 目标 便于用户、分析人员、设计人员进行交流 支持目标软件系统的确认(验收) 控制系统进化过程(追加需求):拥有版本记录表 需要在软件分析完成后,编写完成软件需求说明书。 具体标准可参考GB…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...