ethers.js读取合约信息

在区块链开发中,使用 ethers.js 读取合约信息是最基础且最重要的技能之一。ethers.js 目前的主流版本是 v6,相比旧版(v5)在 API 上更加精简和模块化。

要读取合约信息,你只需要三个核心要素:

  1. Provider:连接区块链的节点("读"操作不需要私钥,只需 Provider)。
  2. 合约地址:合约在链上的唯一标识。
  3. ABI (Application Binary Interface):合约的"说明书",告诉 ethers 哪些函数可以调用。

1. 核心步骤拆解

第一步:初始化 Provider

你可以使用公共的 RPC 节点(如 Alchemy、Infura)或者浏览器插件(如 MetaMask)。

javascript 复制代码
import { ethers } from "ethers";

// 方式 A: 使用公共 RPC 节点 (读取链上数据常用)
const provider = new ethers.JsonRpcProvider("https://mainnet.infura.io/v3/YOUR_API_KEY");

// 方式 B: 使用浏览器钱包 (DApp 常用)
// const provider = new ethers.BrowserProvider(window.ethereum);

第二步:定义 ABI 和地址

如果你只需要读取特定功能(例如代币余额),可以使用 Human-Readable ABI(人类可读 ABI),这比复杂的 JSON 格式要简洁得多。

javascript 复制代码
const contractAddress = "0x..."; // 合约地址
const abi = [
  "function name() view returns (string)",
  "function symbol() view returns (string)",
  "function balanceOf(address) view returns (uint256)",
  "function decimals() view returns (uint8)"
];

第三步:实例化合约并读取

javascript 复制代码
async function readContract() {
  // 创建合约实例 (地址, ABI, Provider)
  const contract = new ethers.Contract(contractAddress, abi, provider);

  // 调用合约的 view 函数
  const name = await contract.name();
  const symbol = await contract.symbol();
  const decimals = await contract.decimals();
  
  // 查询某个地址的余额
  const balance = await contract.balanceOf("0xUserAddress...");

  // 格式化输出 (将大数转换为人类可读的数字,如 1.5 ETH)
  console.log(`代币名称: ${name}`);
  console.log(`余额: ${ethers.formatUnits(balance, decimals)} ${symbol}`);
}

readContract();

2. 常见问题与进阶技巧

数据单位处理

区块链上的数值通常以"最小单位"(如 Wei)存储,没有小数点。

  • formatUnits(value, decimals): 将原始数据(BigInt)转为带小数点的字符串。
  • formatEther(value): 快捷转换 18 位小数(常用于 ETH 或标准 ERC20)。

读取结构体或多个返回值

如果合约函数返回一个结构体或多个值,ethers.js 会返回一个类似数组的对象,你可以通过索引或属性名访问:

javascript 复制代码
const result = await contract.getUserInfo(address);
console.log(result.name, result.age); 

错误处理

网络延迟或合约地址错误会导致调用失败,建议使用 try-catch

javascript 复制代码
try {
  const data = await contract.someFunction();
} catch (error) {
  console.error("读取失败:", error.reason || error.message);
}

3. 学习路线建议

阶段 重点
入门 掌握 JsonRpcProviderContract 类的基本用法。
进阶 学习如何从 Etherscan 获取完整的 JSON ABI。
实战 尝试读取一个 ERC20 代币的名称、符号和总供应量。
高级 学习 StaticCall(模拟交易执行而不发送)和事件监听 contract.on
相关推荐
RAN114267600819 分钟前
1.3第一个程序的介绍
开发语言·qt
blue_ice .1 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^138287988721 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
高级程序源2 小时前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
泡海椒2 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)2 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
lizz22762 小时前
Babel插件手册
javascript
2501_933670793 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
菜鸟~noob2333 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium