当前位置: 首页 > backend >正文

web3.js 和 ethers.js 的核心区别

1. 核心设计理念

---------web3.jsethers.js
开发背景以太坊基金会官方维护独立开发者创建,社区驱动
架构风格集中式对象 (web3 为核心)模块化设计(分离 Wallet/Provider/Contract)
包体积较大(1MB+)更轻量(压缩后约 300KB)
TypeScript类型支持较弱原生完整类型定义

2. API 风格对比

创建钱包
<JAVASCRIPT>
// web3.js
const account = web3.eth.accounts.create();
const { address, privateKey } = account;
// ethers.js
const wallet = ethers.Wallet.createRandom();
const { address, privateKey } = wallet;
发送交易
<JAVASCRIPT>
// web3.js
const txHash = await web3.eth.sendTransaction({from: address,to: "0x...",value: web3.utils.toWei("1", "ether")
});
// ethers.js
const tx = await wallet.sendTransaction({to: "0x...",value: ethers.parseEther("1")
});
const receipt = await tx.wait(); // 自动等待确认

3. 关键功能差异

功能web3.jsethers.js
大整数处理使用 BN.js 或 BigNumber.js原生支持 JavaScript 的 BigInt
合约事件监听依赖 subscribe 方法使用 contract.on 事件过滤器
错误处理统一错误类型细粒度错误类型(如 TransactionReplaced)
ABI 编码自动填充默认参数严格类型校验
Provider 抽象仅支持以太坊节点通信支持多链(通过自定义 Provider)

4. 异步处理模式

web3.js 的回调风格
<JAVASCRIPT>
web3.eth.getBlockNumber((err, blockNumber) => {if (!err) console.log(blockNumber);
});
ethers.js 的 Promise 优先
<JAVASCRIPT>
const blockNumber = await provider.getBlockNumber();
console.log(blockNumber);

5. 生态系统支持

-----web3.jsethers.js
开发者工具与 Truffle 深度集成与 Hardhat 生态更紧密
流行框架更多历史项目使用新项目采用率更高
文档质量分散(不同版本差异大)统一且结构清晰

6. 安全性对比

私钥管理
<JAVASCRIPT>
// web3.js 直接暴露私钥
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
// ethers.js 加密钱包
const encryptedJson = await wallet.encrypt("password");
const restoredWallet = await ethers.Wallet.fromEncryptedJson(encryptedJson, "password");
交易重放保护
web3.js:需手动处理 nonce
ethers.js:自动管理 nonce(可通过 wallet.getTransactionCount() 覆盖)

7. 开发体验差异

智能合约交互
<JAVASCRIPT>
// web3.js
const contract = new web3.eth.Contract(abi, address);
const result = await contract.methods.getValue().call();
// ethers.js
const contract = new ethers.Contract(address, abi, wallet);
const result = await contract.getValue();
单位转换
<JAVASCRIPT>
// web3.js
const weiValue = web3.utils.toWei("1.5", "ether");
// ethers.js
const weiValue = ethers.parseEther("1.5"); // 直接返回 BigInt

8. 适用场景建议

场景推荐选择理由
新项目开发ethers.js轻量、现代、TypeScript 友好
维护旧项目web3.js避免重构成本
需要多链支持ethers.js更易扩展自定义 Provider
复杂交易场景ethers.js细粒度的错误类型和事件处理
与 Truffle 集成web3.js历史项目常用组合
http://www.xdnf.cn/news/2699.html

相关文章:

  • c++11: 类型转换
  • dummy cli-tool ubuntu22.04使用
  • 在 Git 中,撤销(回退)merge 操作有多种方法
  • terraform 动态块(Dynamic Blocks)详解与实践
  • [Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)
  • Java面试:Spring及Spring Cloud技术深度剖析
  • docker安装部署TDengine实现主从复制
  • 雷池WAF的身份认证 - GitHub
  • <uniapp><插件><UTS>在uniapp中,创建自己的插件并发布到uni插件市场
  • JavaScript-基础语法
  • 「Mac畅玩AIGC与多模态05」部署篇03 - 在 Mac 上部署本地向量化模型(Embedding Models)
  • 在QGraphicsView中精确地以鼠标为锚缩放图片
  • 迈瑞医疗一季度业绩环比大幅改善 国内业务将从今年三季度迎来重大拐点
  • 用Java模拟打字:深入解析 java.awt.Robot 的键盘控制艺术
  • 【Robocorp实战指南】Python驱动的开源RPA框架
  • 【Vue3-Bug】中路由加载页面直接显示空白
  • 【面经分享】长鑫存储Java研发一面|40分钟速战速决
  • python_股票月数据趋势判断
  • HTML标记语言_@拉钩教育
  • leetcode0230. 二叉搜索树中第 K 小的元素-medium
  • C++?模板!!!
  • ai环境cuda cudnn conda torch整体迁移 wsl docker
  • 在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)
  • 如何使用electron-forge开发上位机ui
  • 如何开展有组织的AI素养教育?
  • zynq 7010 PS 串口打印
  • 绘制板块层级图
  • 健康养生:开启品质生活的密钥
  • 【jceks】使用keytool和hadoop credential生成和解析jceks文件(无密码storepass)
  • 零基础搭建AI作曲工具:基于Magenta/TensorFlow的交互式音乐生成系统