第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);
});

推荐迁移步骤

  1. npm install ethers@6,同时卸载 v5。
  2. 全局替换 ethers.utils.ethers.(utils 扁平化一刀切)。注意部分工具还同时改了名(arrayifygetByteshexZeroPadzeroPadValuesolidityKeccak256solidityPackedKeccak256),替换命名空间后必须跑测试核对。
  3. 全局替换 ethers.providers.ethers.(Provider 命名空间扁平化)。
  4. 搜索 BigNumber 并替换为 bigint 字面量或显式转换。
  5. 搜索 .getSigner() 并加 await(BrowserProvider 场景)。
  6. 跑测试,逐一修复剩余错误。

小结

v6 的目标是更简洁、更贴近 ES2020 原生语义。迁移工作量主要集中在 BigNumber → bigint;其他大多是机械替换。至此本章结束。