# web3-vs-ethers **Repository Path**: dusw/web3-vs-ethers ## Basic Information - **Project Name**: web3-vs-ethers - **Description**: 项目原地址:https://github.com/adrianmcli/web3-vs-ethers 说明:web3和ethers使用Demo - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://github.com/adrianmcli/web3-vs-ethers - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-21 - **Last Updated**: 2025-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Web3.js 与 Ethers.js 对比 这是一个用于展示 Web3.js 与 Ethers.js 之间基本差异的指南,这两个库是与以太坊区块链交互的最受欢迎的工具。本项目还提供了两个使用 React + Hooks 的前端示例应用! --- ## 示例 Dapp 合约 在 `smart-contracts` 文件夹中,你会发现一个简单的 Truffle 项目,包含以下 Solidity 合约: ```solidity pragma solidity ^0.5.0; contract Counter { uint count = 0; function increment() public { count = count + 1; } function getCount() public view returns (uint) { return count; } } ``` --- ## Truffle 项目的设置 在运行任何前端应用之前,请确保使用以下命令启动开发控制台,并部署合约到开发链上: ```bash truffle develop migrate ``` --- ## 两个前端 UI 示例 本项目包含两个文件夹: - `app-ethers`:使用 Ethers.js 的 React 前端示例。 - `app-web3js`:使用 Web3.js 的 React 前端示例。 这两个项目的主要区别在于它们的 `useCounterContract.js` 文件,分别展示了如何使用这两种库与智能合约交互。 ### 启动前端应用 在每个应用的目录下运行以下命令: ```bash npm install npm start ``` 前端将运行在 `http://localhost:1234`,你可以在浏览器中查看。 --- ## 主要区别 本项目主要展示了三种关键部分的差异:设置、读取(调用常量方法)和写入(调用非恒定的修改方法)。 ### 设置 Web3.js 和 Ethers.js 的设置流程略有不同。 #### Web3.js 设置 ```js const web3 = new Web3("http://127.0.0.1:8545"); const accounts = await web3.eth.getAccounts(); const networkId = await web3.eth.net.getId(); const contractAddress = artifact.networks[networkId].address; contractInstance = new web3.eth.Contract(artifact.abi, contractAddress, { from: accounts[0], }); ``` #### Ethers.js 设置 ```js const provider = new ethers.providers.JsonRpcProvider(); const network = await provider.getNetwork(); const contractAddress = artifact.networks[network.chainId].address; contractInstance = new ethers.Contract( contractAddress, artifact.abi, provider.getSigner(), ); ``` --- ### 调用常量方法 两种库调用常量方法的方式类似,但返回值类型不同。 #### Web3.js ```js const count = await contractInstance.methods.getCount().call(); console.log(count); // 返回字符串 ``` #### Ethers.js ```js const count = await contractInstance.getCount(); console.log(count); // 返回 BigNumber 实例 ``` --- ### 调用非恒定方法 调用修改区块链状态的方法时,两者返回值的处理方式也有所不同。 #### Web3.js ```js await contractInstance.methods.increment().send(); // 交易被挖矿后完成 ``` #### Ethers.js ```js const tx = await contractInstance.increment(); await tx.wait(); // 等待交易被挖矿 ``` 注意:Web3.js 返回的是 [PromiEvent](https://web3js.readthedocs.io/en/v1.2.1/callbacks-promises-events.html?highlight=promievent#callbacks-promises-events),你可以监听交易的确认、错误和哈希。 Ethers.js 返回的是一个交易对象,其中包含与交易相关的各种信息。你可以通过 `tx.hash` 获取交易哈希,但必须通过 `tx.wait()` 确保交易被挖矿。 --- ## 如何贡献 欢迎提交 Pull Request 来改进此项目或示例代码。 --- ## 许可证 本项目使用 MIT 许可证,请查看仓库中的 `LICENSE` 文件了解详情。