进阶 docs.web3js.org 2026-10-19 02:32:30 · 16 阅读

第21章 从 Web3.js 迁移到 Ethers.js:v6 版本指南与代码对照

# 第21章 🔄 迁移到 ethers.js ## 从 Web3.js 迁移到 Ethers.js 本指南将帮助你从 web3.js 迁移到 ethers.js 来与以太坊区块链交互。指南基于 ethers.js v6,并提供了两个库的对照代码示例。 ### 安装 开始迁移前,先安装 ethers.js 包: npm install ethers@6

### Provider 初始化 从 Web3.js 迁移到 ethers.js 时,第一步是更新连接以太坊网络的方式。两个库都使用 provider,但初始化方法有所不同。 import { Web3 } from 'web3';

// 私有 RPC 端点
const web3 = new Web3(providerURL);

const blockNumber = await web3.eth.getBlockNumber();
console.log(blockNumber);
迁移到 ethers.js 时,需要改用 JsonRpcProvider。注意 ethers.js 对 provider 类型的划分更加明确: import { ethers } from 'ethers';

// ethers.js v6
const provider = new ethers.JsonRpcProvider(providerURL);

const blockNumber = await provider.getBlockNumber();
console.log(blockNumber);
### 浏览器注入的 Provider 迁移浏览器钱包连接时,需要更新处理注入 provider(如 MetaMask)的方式。你现有的 Web3.js 代码如下: const web3 = new Web3(window.ethereum);
在 ethers.js v6 中,需要改用 BrowserProvider 类。这个 provider 专门为浏览器环境设计: // v6 中
const provider = new ethers.BrowserProvider(window.ethereum);
### 钱包与账户 - 生成私钥 如果你的代码使用 Web3.js 生成私钥,可以按以下方式迁移。你现有的 Web3.js 代码: // 会生成类似这样的私钥:
// '0x286f65c4191759fc5c7e6083b8c275ac2238cc7abb5915bd8c905ae4404215c9'
//(请务必加密存储在安全的地方)
const privateKey = web3.eth.accounts.create().privateKey;
在 ethers.js 中实现同样的功能,使用 Wallet.createRandom() 方法: // 会生成类似这样的私钥:
// '0x286f65c4191759fc5c7e6083b8c275ac2238cc7abb5915bd8c905ae4404215c9'
//(请务必加密存储在安全的地方)
const privateKey = ethers.Wallet.createRandom().privateKey;
### 钱包与账户 - 创建钱包 迁移钱包创建代码时,需要更改向钱包添加账户的方式。你现有使用 wallet.add() 的 Web3.js 代码: const web3 = new Web3();
const wallet = web3.eth.accounts.wallet.add(
// 你可以通过 web3.eth.accounts.create().privateKey 生成私钥
privateKey,
);

// 输出:0x6f7D735dFB514AA1778E8D97EaCE72BfECE71865
console.log(wallet[0].address);
在 ethers.js 中,创建钱包使用 Wallet 构造函数: const wallet = new ethers.Wallet(
// 可能是通过以下方法生成的私钥:
ethers.Wallet.createRandom().privateKey,
// 或显式提供的 privateKey
);

// 输出:0x6f7D735dFB514AA1778E8D97EaCE72BfECE71865
console.log(wallet.address);
获取 Signer 账户 迁移获取当前账户的代码时,需将 Web3.js 的 getAccounts() 改为 ethers.js 的 getSigner() 方法,后者返回一个 signer 对象,而不仅仅是地址: const account = (await web3.eth.getAccounts())[0];
const signer = await provider.getSigner();
签名 迁移消息签名功能时,需将 Web3.js 的 sign 方法更新为: // 使用私钥通过 web3.js 签名:
const signature = web3.eth.accounts.sign('Some data', privateKey).signature;

// 使用连接提供商管理的账户进行签名
const signature = await web3.eth.sign(
web3.utils.utf8ToHex('Some data'), // 待签名数据(4.x 版本仅支持 Hex 字符串)
'0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', // 地址
);
在 ethers.js 中,使用 signMessage 方法简化签名过程: const signer = new ethers.Wallet(privateKey);
const signature = await signer.signMessage('Some data');
签名并发送交易 发送交易 迁移交易发送代码时,需更新事务的签名和发送方式。以下是在 Web3.js 中使用已解锁或添加的账户进行签名的现有代码: const web3 = new Web3(url);

// 添加将用作签署者的钱包
const wallet = web3.eth.accounts.wallet.add(givenPrivateKey);
const account = wallet[0].address;

const tx = await web3.eth.sendTransaction({
from: account,
to: '0x92d3267215Ec56542b985473E73C8417403B15ac',
value: web3.utils.toWei('0.00000000001', 'ether'),
});
console.log(tx);
在 ethers.js 中,交易通过 signer 实例发送,该实例结合了私钥和 provider: const signer = new ethers.Wallet(privateKey, provider);

const tx = await signer.sendTransaction({
to: '0x92d3267215Ec56542b985473E73C8417403B15ac',
值: ethers.parseUnits('0.001', 'ether'), }); console.log(tx); 发送已签名交易 当迁移将交易签名与广播分离的代码时,你需要将 Web3.js 的两步流程更新为: const transaction = { from: senderPublicAddress, to: receiverPublicAddress, value: 1, gas: 21000, }; const signedTransaction = await web3.eth.accounts.signTransaction(transaction, privateKey); const tx = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); console.log(tx); 在 ethers.js 中,可以使用 provider 的 broadcastTransaction 方法来广播已签名的交易: await provider.broadcastTransaction(signedTx); 合约 合约部署 当迁移合约部署代码时,你需要将 Web3.js 的部署和发送模式更新为: const contract = new web3.eth.Contract(abi); const deployTx = await contract .deploy({ data: bytecode, arguments: ['constructor param'], }) .send({ from: '0x12598d2Fd88B420ED571beFDA8dD112624B5E730', gas: '1000000', }); console.log('contract address', deployTx.options.address); 在 ethers.js 中,合约部署使用 ContractFactory 类: const signer = await provider.getSigner(); const factory = new ethers.ContractFactory(abi, bytecode, signer); const contract = await factory.deploy('constructor param'); console.log('contract address', contract.address); // 等待合约创建交易被打包 await contract.deployTransaction.wait(); 合约方法调用 当迁移合约方法调用时,你需要将 Web3.js 的 methods 对象模式更新为: const contract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); // 用于读取操作 const result = await contract.methods.someFunction().call(); // 用于写入操作 const tx = await contract.methods.someFunction().send(); 在 ethers.js 中,合约方法直接作为函数调用: const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, provider); const result = await contract.someFunction(); 合约事件 当迁移事件处理代码时,你需要将 Web3.js 的 events 接口更新为: const event = contract.events.SomeEvent({ filter: { val: 100 }, fromBlock: 0, }); event.on('data', resolve); event.on('error', reject); 在 ethers.js 中,监听事件的写法是: contract.on('SomeEvent', (arg1, arg2, event) => {
// 事件处理逻辑
});
Gas 估算 迁移 gas 估算相关代码时,需要把 Web3.js 的 estimateGas 方法改为: const gasAmount = await contract.methods.myMethod(123).estimateGas({
from: transactionSenderAddress,
});
在 ethers.js 中,gas 估算通过直接调用方法完成: const gasEstimate = await contract.myMethod.estimateGas(123);
工具方法 哈希计算 迁移 Keccak-256 哈希计算代码时,需要把 Web3.js 的工具方法改为: // 计算输入的 Keccak-256 哈希并返回十六进制字符串
const hash1 = web3.utils.sha3('hello world');

// 另一个 keccak256 方法,支持的输入类型更广
const hash2 = web3.utils.keccak256('hello world');
在 ethers.js 中,计算哈希前需要显式把字符串转换为字节: import { keccak256, toUtf8Bytes } from 'ethers';

const message = 'Hello, World!';
const messageBytes = toUtf8Bytes(message);
const hash = keccak256(messageBytes);
以太坊单位换算 迁移以太坊单位换算相关代码时,需要把 Web3.js 的 fromWei 和 toWei 方法改为: // Wei 转 Ether
const fromWeiToEther = web3.utils.fromWei('1000000000000000000', 'ether');
// 输出:1
console.log(fromWeiToEther);

// Ether 转 Wei
const fromEtherToWei = web3.utils.toWei('1.0', 'ether');
// 输出:1000000000000000000
console.log(fromEtherToWei);
在 ethers.js 中,常用换算使用 formatEther 和 parseEther: // Wei 转 Ether
const fromWeiToEther = ethers.formatEther('1000000000000000000');
// 输出:1.0
console.log(fromWeiToEther);

// Ether 转 Wei
const fromEtherToWei = ethers.parseEther('1.0');
// 输出:1000000000000000000n
console.log(fromEtherToWei);

评论 (0)