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

NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要区别是什么?

比较点Ethers.jsWeb3.js
体积更轻量,适合前端较大,加载慢,适合 Node
文档文档简洁、现代化,支持 TypeScript文档丰富,但不够现代化
模块化设计高度模块化(如 Provider、Wallet、Contract 分离)一体式架构
私钥管理内置 Wallet 支持本地签名,适合前端或热钱包使用需借助第三方或 Web3 Provider
支持度新项目推荐使用,开发活跃老项目常用,兼容性好
常用版本ethers@5ethers@6web3@1.x,较少更新

👉 总体来说:新项目推荐 Ethers.js,Web3.js 更适合老项目维护。


3.2 如何用 Ethers.js 查询钱包余额?

const { ethers } = require("ethers");// 使用默认的以太坊主网Provider(也可传Infura、Alchemy等)
const provider = new ethers.providers.InfuraProvider("homestead", "YOUR_INFURA_API_KEY");async function getBalance(address) {const balance = await provider.getBalance(address);console.log(`Balance: ${ethers.utils.formatEther(balance)} ETH`);
}getBalance("0x742d35Cc6634C0532925a3b844Bc454e4438f44e");

3.3 如何使用私钥签名一笔交易并广播?

const { ethers } = require("ethers");const provider = new ethers.providers.InfuraProvider("goerli", "YOUR_INFURA_API_KEY");
const privateKey = "YOUR_PRIVATE_KEY";
const wallet = new ethers.Wallet(privateKey, provider);async function sendTransaction() {const tx = {to: "0xRecipientAddressHere",value: ethers.utils.parseEther("0.01"),gasLimit: 21000,maxFeePerGas: ethers.utils.parseUnits("50", "gwei"),maxPriorityFeePerGas: ethers.utils.parseUnits("2", "gwei")};const txResponse = await wallet.sendTransaction(tx);console.log("Transaction Hash:", txResponse.hash);const receipt = await txResponse.wait();console.log("Transaction Confirmed:", receipt.blockNumber);
}sendTransaction().catch(console.error);

3.4 如何监听一个合约事件(Event)?如何处理多个事件?

const { ethers } = require("ethers");const provider = new ethers.providers.WebSocketProvider("wss://mainnet.infura.io/ws/v3/YOUR_INFURA_API_KEY");const contractAddress = "0xYourContractAddress";
const abi = ["event Transfer(address indexed from, address indexed to, uint value)","event Approval(address indexed owner, address indexed spender, uint value)"
];const contract = new ethers.Contract(contractAddress, abi, provider);// 监听 Transfer 事件
contract.on("Transfer", (from, to, value, event) => {console.log(`Transfer from ${from} to ${to}: ${ethers.utils.formatUnits(value, 18)} tokens`);console.log("Block:", event.blockNumber);
});// 监听 Approval 事件
contract.on("Approval", (owner, spender, value) => {console.log(`Approval: ${owner} approved ${spender} to spend ${value.toString()}`);
});// 可通过 contract.removeAllListeners() 停止监听

📌 总结要点:

  • Ethers.js 更轻便现代,签名交易、监听事件和查询数据都非常清晰易用。

  • 合约事件支持多个监听器并行,适合做实时处理或通知系统。

http://www.lryc.cn/news/2401209.html

相关文章:

  • Quick UI 组件加载到 Axure
  • Vue3(ref与reactive)
  • Starrocks中RoaringBitmap杂谈
  • 通过ca证书的方式设置允许远程访问Docker服务
  • 涂胶协作机器人解决方案 | Kinova Link 6 Cobot在涂胶工业的方案应用与价值
  • 理解继承与组合的本质:Qt 项目中的设计选择指南
  • 新手小白使用VMware创建虚拟机安装Linux
  • 使用 PHP 和 Guzzle 对接印度股票数据源API
  • EscapeX:去中心化游戏,开启极限娱乐新体验
  • 使用PyQt5的图形用户界面(GUI)开发教程
  • STM32实战:智能环境监测站设计方案
  • 猎板硬金镀层厚度:新能源汽车高压系统的可靠性基石
  • KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪
  • VR 虚拟仿真工器具:开启医学新视界的智慧钥匙​
  • webshell管理工具、C2远控服务器流量分析
  • JavaWeb:前端工程化-TS(TypeScript)
  • unity+ spine切换武器不换皮肤解决方案
  • [java八股文][MySQL面试篇]SQL基础
  • Ubuntu中SSH服务器安装使用
  • 【AI论文】SWE-rebench:一个用于软件工程代理的任务收集和净化评估的自动化管道
  • Flask文件处理全攻略:安全上传下载与异常处理实战
  • 【算法深练】分组循环:“分”出条理,化繁为简
  • 焊缝缺陷焊接缺陷识别分割数据集labelme格式5543张4类别
  • 关于scrapy在pycharm中run可以运行,但是debug不行的问题
  • Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据
  • 云数据库选型指南:关系型 vs NoSQL vs NewSQL的企业决策
  • Prj08--8088单板机C语言8255读取按键码
  • 蜜獾算法(HBA,Honey Badger Algorithm)
  • Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互
  • 飞算JavaAI 炫技赛重磅回归!用智能编码攻克老项目重构难题