ether.js—3—contract
使用合约的代码流程(用 ethers.js)
⸻
- 先拿到合约地址
• 这个地址是合约部署后生成的唯一标识
• 来源:
• 你自己部署合约时得到的
• 或者别人已经部署好的合约地址(公开项目、链上查询)
⸻
- 准备 ABI(合约的接口描述)
• ABI 是合约编译后自动生成的 JSON,描述合约方法和事件
• 来源:
• 你自己写合约用 Remix、Hardhat 编译后生成的 ABI 文件
• 如果是公共合约,比如 ERC-20,标准 ABI 可以直接拿(网上或者官方文档)
• 也可以用 etherscan 上合约页面直接复制 ABI
⸻
- new 一个合约实例
const contract = new ethers.Contract(address, abi, providerOrSigner);
• 传入三个东西:
• 合约地址(必需)
• ABI(必需)
• Provider 或 Signer(决定调用的是只读还是可写接口)
⸻
Provider vs Signer 的区别
• Provider:只能调用合约的 view 或 pure 函数(即只读,不花 gas)
• Signer:有权限发起交易,调用修改链上状态的函数(需要 gas)
所以:
const readContract = new ethers.Contract(address, abi, provider); // 只读
const writeContract = new ethers.Contract(address, abi, signer); // 可写(发交易)
⸻
- 之后就可以调用合约方法
• 只读方法可以直接 await contract.name() 等调用,得到返回值
• 可写方法调用返回交易对象 tx = await contract.transfer(…),然后 await tx.wait() 等交易确认
⸻
简单示例流程(拿 ERC-20 查询和转账为例)
// 1. 合约地址(比如 USDT)
const address = “0xdAC17F958D2ee523a2206206994597C13D831ec7”;
// 2. 标准 ERC20 ABI(这里只写几个方法)
const abi = [
“function name() view returns (string)”,
“function symbol() view returns (string)”,
“function balanceOf(address) view returns (uint256)”,
“function transfer(address to, uint amount) returns (bool)”
];
// 3. 创建 provider 和 signer(假设是浏览器内注入的 Metamask)
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
// 4. 创建合约实例
const contractRead = new ethers.Contract(address, abi, provider); // 只读
const contractWrite = new ethers.Contract(address, abi, signer); // 可写
// 5. 调用只读方法
const name = await contractRead.name();
const symbol = await contractRead.symbol();
console.log(name, symbol);
// 6. 调用可写方法(转账)
const tx = await contractWrite.transfer(“0xRecipientAddress”, ethers.utils.parseUnits(“1.0”, 6));
await tx.wait();
console.log(“Transfer confirmed”);
⸻
总结
步骤 说明 来源/举例
- 合约地址 合约在链上的地址 自己部署、别人公开的地址
- ABI 合约接口定义,json格式或简写签名 编译生成、Etherscan、官方
- 创建合约实例 new Contract(address, abi, providerOrSigner) 传入 provider 只读,signer 可写
- 调用函数 await contract.readFunc() / await contract.writeFunc() 只读直接取值,写调用交易等待确认
⸻