第6节:v5 到 v6 迁移速查
小白入门:https://github.com/dukedaily/solidity-expert ,欢迎star转发,文末加V入群。
职场进阶: https://dukeweb3.com
v6 相对 v5 有不少破坏性变化,这一节把高频改动放在几张表里,便于改代码时对照。
Provider 命名
| v5 | v6 |
|---|---|
new ethers.providers.JsonRpcProvider |
new ethers.JsonRpcProvider |
new ethers.providers.Web3Provider |
new ethers.BrowserProvider |
new ethers.providers.WebSocketProvider |
new ethers.WebSocketProvider |
ethers.getDefaultProvider() |
ethers.getDefaultProvider()(同) |
Utils 扁平化
| v5 | v6 |
|---|---|
ethers.utils.parseEther |
ethers.parseEther |
ethers.utils.formatEther |
ethers.formatEther |
ethers.utils.parseUnits |
ethers.parseUnits |
ethers.utils.formatUnits |
ethers.formatUnits |
ethers.utils.keccak256 |
ethers.keccak256 |
ethers.utils.Interface |
ethers.Interface |
ethers.utils.getAddress |
ethers.getAddress |
ethers.utils.AbiCoder |
ethers.AbiCoder |
ethers.utils.toUtf8Bytes |
ethers.toUtf8Bytes |
BigNumber → bigint
| v5 | v6 |
|---|---|
ethers.BigNumber.from(1) |
1n |
a.add(b) / a.mul(b) / a.div(b) |
a + b / a * b / a / b |
a.gte(b) |
a >= b |
a.toString() |
a.toString()(同) |
a.toNumber() |
Number(a)(注意精度溢出) |
陷阱:bigint 与 number 不能直接混算,1n + 1 会抛 TypeError。
常量
| v5 | v6 |
|---|---|
ethers.constants.AddressZero |
ethers.ZeroAddress |
ethers.constants.HashZero |
ethers.ZeroHash |
ethers.constants.MaxUint256 |
ethers.MaxUint256 |
Signer / Wallet
| v5 | v6 |
|---|---|
provider.getSigner()(同步) |
await provider.getSigner()(BrowserProvider 下 async) |
contract.deployed() |
await contract.waitForDeployment() |
tx.wait() |
tx.wait()(同) |
事件回调
v5 中事件回调最后一个参数是 log,v6 改为 event,原始 log 放在 event.log:
// v5
contract.on("Transfer", (from, to, amount, log) => {
console.log(log.transactionHash);
});
// v6
contract.on("Transfer", (from, to, amount, event) => {
console.log(event.log.transactionHash);
});
推荐迁移步骤
npm install ethers@6,同时卸载 v5。- 全局替换
ethers.utils.→ethers.(utils 扁平化一刀切)。注意部分工具还同时改了名(arrayify→getBytes、hexZeroPad→zeroPadValue、solidityKeccak256→solidityPackedKeccak256),替换命名空间后必须跑测试核对。 - 全局替换
ethers.providers.→ethers.(Provider 命名空间扁平化)。 - 搜索
BigNumber并替换为 bigint 字面量或显式转换。 - 搜索
.getSigner()并加await(BrowserProvider 场景)。 - 跑测试,逐一修复剩余错误。
小结
v6 的目标是更简洁、更贴近 ES2020 原生语义。迁移工作量主要集中在 BigNumber → bigint;其他大多是机械替换。至此本章结束。