/Web3

Ethers.js、Web3.js、Connectwallet、量化策略、套利、区块链、币安、网格、跟单、撸羊毛、脚本、跨链桥、MPC钱包、铭文、符文、zk、Layer1 (基础公链)、Layer2 (扩容解决方案)、layer3、AI + Web3、DeFi 、GameFi、防夹、滑点、PumpFun、FourMeme、公链、钱包、流动性池子

1. 基本初始化对比

// Web3.js初始化
const web3Example = {
  // 通过 HTTP Provider
  httpProvider: () => {
    const Web3 = require('web3');
    return new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/YOUR-ID'));
  },
  // 通过 MetaMask
  metamask: () => {
    const Web3 = require('web3');
    return new Web3(window.ethereum);
  }
};

// Ethers.js 初始化
const ethersExample = {
  // 通过 HTTP Provider
  httpProvider: () => {
    const { ethers } = require('ethers');
    return new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR-ID');
  },

  // 通过MetaMask(小狐狸)钱包
  metamask: () => {
    const { ethers } = require('ethers');
    return new ethers.providers.Web3Provider(window.ethereum);
  }
};

2. 合约交互对比

// Web3.js 合约交互
const web3ContractExample = {
  init: (abi, address) => {
    const web3 = new Web3(window.ethereum);
    return new web3.eth.Contract(abi, address);
  },

  // 方法调用
  methods: async (contract) => {
    // 读取方法
    const result = await contract.methods.balanceOf(address).call();
    
    // 写入方法
    await contract.methods.transfer(to, amount)
      .send({ from: account });
  }
};
  
// Ethers.js 合约交互
const ethersContractExample = {
  init: (abi, address) => {
    const provider = new ethers.providers.Web3Provider(window.ethereum);
    return new ethers.Contract(address, abi, provider.getSigner());
  },

  // 合约调用方法
  methods: async (contract) => {
    // 读取方法
    const result = await contract.balanceOf(address);
    
    // 写入方法
    await contract.transfer(to, amount);
  }
};

3. 工具类及函数对比

// Web3.js 工具函数
const web3Utils = {
  // 单位转换
  toWei: (amount) => {
    const web3 = new Web3();
    return web3.utils.toWei(amount.toString(), 'ether');
  },
  
  fromWei: (amount) => {
    const web3 = new Web3();
    return web3.utils.fromWei(amount.toString(), 'ether');
  },
  
  // 地址检查 
  isAddress: (address) => {
    const web3 = new Web3();
    return web3.utils.isAddress(address);
  }
};

// Ethers.js工具类函数
const ethersUtils = {
  // 单位转换
  toWei: (amount) => {
    return ethers.utils.parseEther(amount.toString());
  },
  
  fromWei: (amount) => {
    return ethers.utils.formatEther(amount);
  },
  
  // 地址检查工具
  isAddress: (address) => {
    return ethers.utils.isAddress(address);
  }
};

4. 主要区别总结

const differences = {
  // 1. 包大小
  packageSize: {
    web3js: "1.5MB+",
    ethersjs: "116.5KB"  // 更小的包体积
  },
  
  // 2. API设计
  apiDesign: {
    web3js: {
      style: "回调和 Promise 混合",
      example: "contract.methods.method().call()"
    },
    ethersjs: {
      style: "Promise 和 async/await 友好",
      example: "contract.method()"
    }
  },
  
  // 3. 类型支持
  typeScriptSupport: {
    web3js: "基础支持",
    ethersjs: "原生支持,类型定义完善"
  },
  
  // 4.功能特点
  features: {
    web3js: {
      advantages: [
        "更成熟的生态系统",
        "更多的社区支持",
        "更多的历史项目在使用"
      ],
      disadvantages: [
        "API设计上不够直观",
        "包体积较大",
        "类型支持不够完善"
      ]
    },
    ethersjs: {
      advantages: [
        "更现代的API设计",
        "更小的包体积",
        "更好的TypeScript支持",
        "更好的安全性考虑"
      ],
      disadvantages: [
        "社区相对较小",
        "部分高级功能需要额外配置"
      ]
    }
  }
};

5. 实际使用场景对比

// Web3.js使用场景
const web3UsageExample = {
  // 批量请求
  batchRequest: async () => {
    const web3 = new Web3(provider);
    const batch = new web3.BatchRequest();
    
    const promises = addresses.map(address => {
      return new Promise((resolve, reject) => {
        batch.add(
          web3.eth.getBalance.request(address, 'latest', (err, balance) => {
            if (err) reject(err);
            else resolve(balance);
          })
        );
      });
    });
    
    batch.execute();
    return Promise.all(promises);
  },
  
  // 事件监听
  eventListener: (contract) => {
    contract.events.Transfer({
      filter: { from: userAddress },
      fromBlock: 'latest'
    })
    .on('data', event => console.log(event))
    .on('error', error => console.error(error));
  }
};

// Ethers.js 使用场景
const ethersUsageExample = {
  // 批量请求
  batchRequest: async () => {
    const provider = new ethers.providers.JsonRpcProvider();
    return Promise.all(
      addresses.map(address => provider.getBalance(address))
    );
  },
  
  // 事件监听
  eventListener: (contract) => {
    contract.on('Transfer', (from, to, amount, event) => {
      console.log({ from, to, amount, event });
    });
  }
};

6. 性能对比

主要性能差异: 1、包大小比较:

  • Web3.js: ~1.5MB
  • Ethers.js: ~116.5KB 2、初始化时间:
  • Ethers.js 通常更快 3、合约调用:
  • 单次调用:差异不大
  • 批量调用:Web3.js 的 BatchRequest 略优 4、事件监听:
  • Ethers.js 内存占用更少
  • Web3.js 事件处理更灵活 5、内存使用:
  • Ethers.js 整体内存占用更少 选择建议:
  • 如果注重:
  • 包大小和加载速度:选择 Ethers.js
  • 批量操作性能:选择 Web3.js
  • 内存占用:选择 Ethers.js
  • TypeScript 支持:选择 Ethers.js
  1. 其他考虑因素:
  • API 设计
  • 社区支持
  • 文档质量
  • 维护活跃度
// 性能测试case
const performanceTest = async () => {
  // Web3.js 性能测试 demo
  const web3Test = async () => {
    const web3 = new Web3(provider);
    console.time('web3');
    
    const batch = new web3.BatchRequest();
    for(let i = 0; i < 100; i++) {
      batch.add(web3.eth.getBalance.request(address));
    }
    await batch.execute();
    
    console.timeEnd('web3');
  };
  
  // Ethers.js性能测试demo
  const ethersTest = async () => {
    const provider = new ethers.providers.JsonRpcProvider();
    console.time('ethers');
    
    const promises = [];
    for(let i = 0; i < 100; i++) {
      promises.push(provider.getBalance(address));
    }
    await Promise.all(promises);
    
    console.timeEnd('ethers');
  };
};