认识 Web3,从 ethers.js 开始

307 阅读4分钟

认识 Web3,从 ethers.js 开始

引言

在区块链技术的发展中,Web3 成为连接用户与区块链的桥梁,而 ethers.js 则是构建这座桥梁的主要工具之一。本文将带您深入探索 ethers.js,理解其在以太坊开发中的重要性,以及如何通过它开始您的 Web3 之旅。

在我的理解中,链可以大概理解为一种云数据库,我们通过合约部署相当于云函数,可以存储数据和方法。然后通过接口请求调用合约上面的方法实现交互。

ethers就是我们和合约交互的封装的库,可以方便的利用ethers实现各种交互。如果不用ethers我们直接curl也是可以交互的,只是它封装了一些常用的方法。

从ethers开始了解web3是最直接的方法,如果一开始直接看合约可能会摸不着头脑。

基础信息

在以太坊交易中,Gas 费用通常以 Gwei 表示,而 Ether 则是用于表示账户余额、转账数量等。因此,在进行交易时,你可能会看到 Gas 费用以 Gwei 表示,而账户余额和转账数量以 Ether 表示。

单位Wei 值等价值
Wei11 Wei
Gwei10^91 Gwei = 10^9 Wei
Ether10^181 Ether = 10^18 Wei

什么是 Web3?

Web3 是指下一代互联网,它将区块链技术与传统的 Web 应用程序连接起来,使用户能够直接与去中心化应用(DApps)、智能合约以及区块链网络进行交互。

认识 ethers.js

etherjs 为什么能够和区块链进行交互,这主要是因为它基于以太坊网络提供的 JSON-RPC 接口进行交互的。以太坊节点通过 JSON-RPC 接口暴露了一系列方法,用于查询区块链状态、发送交易、部署智能合约等操作。利用这些 JSON-RPC 方法与以太坊节点进行通信,从而与以太坊网络进行交互。因此,ethers.js 可以通过与以太坊节点进行通信,与以太坊网络进行交互

ethers可以做到

  • 以太坊钱包管理: ethers.js 提供了创建、导入和管理以太坊钱包的功能。您可以轻松生成公钥、私钥、地址,并处理助记词(mnemonic)等操作。

  • 智能合约交互: 通过 ethers.js,您可以部署、调用和与智能合约进行交互。它提供了简单易用的 API,使开发人员能够直接与智能合约进行通信。

  • 交易处理: ethers.js 简化了交易管理的过程,包括交易的签名、发送以及 Gas 费用的管理。它还提供了非常方便的接口来处理以太坊网络上的交易。

  • 区块链数据访问: 您可以使用 ethers.js 轻松地查询以太坊区块链上的数据,包括查询区块、交易、余额以及事件等。

基本使用方法

先新建一个项目,添加etherjs依赖

pnpm init
pnpm add ethers
touch index.js

node index.js

通过ethers 获取链上的相关信息

import { ethers, formatEther } from "ethers";

const network = 'mainnet'

const provider = new ethers.AlchemyProvider(network, key)

let blockNumber = await provider.getBlockNumber();
console.log(blockNumber);

const balance = await provider.getBalance('vitalik.eth');
console.log(formatEther(balance))

const networkCurrency = await provider.getNetwork();
console.log(networkCurrency)

const txCount = await provider.getTransactionCount('vitalik.eth');
console.log(txCount)

const feeData = await provider.getFeeData();
console.log(feeData)

const zeroBlock = await provider.getBlock(0);
console.log(zeroBlock)

智能合约交互

可以通过ethers创建合约实例,创建的合约实例,可以读取合约上面的属性和调用合约上面的各种方法,从而实现链上交互

const contract = new ethers.Contract(addressDAI, abiERC20, provider)

其中addressDAI,abiERC20都是创建个合约的时候生成的

async function getContractInfo() {
    const abiERC20 = [
        "function name() view returns (string)",
        "function symbol() view returns (string)",
        "function totalSupply() view returns (uint256)",
        "function balanceOf(address) view returns (uint)",
        "event Transfer(address indexed from, address indexed to, uint value)"
    ];
    const addressDAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F' // DAI Contract
    const contractDAI = new ethers.Contract(addressDAI, abiERC20, provider)
    // 1. 读取DAI合约的链上信息(IERC20接口合约)
    const nameDAI = await contractDAI.name()
    const symbolDAI = await contractDAI.symbol()
    const totalSupplDAI = await contractDAI.totalSupply()
    console.log("\n1. 读取DAI合约信息")
    console.log(`合约地址: ${addressDAI}`)
    console.log(`名称: ${nameDAI}`)
    console.log(`代号: ${symbolDAI}`)
    console.log(`总供给: ${formatEther(totalSupplDAI)}`)
    const balanceDAI = await contractDAI.balanceOf('vitalik.eth')
    console.log(`Vitalik持仓: ${formatEther(balanceDAI)}\n`)
}

监听链上事件

contractDAI.once('Transfer', (from, to, amount, event) => {
    // The to will always be "address"
    console.log(`I got ${formatEther(amount)} from ${from}.`);
});

深入研究和进阶话题

除了基本功能外,ethers.js 还提供了许多高级功能和进阶话题,如事件过滤、Gas 费用估算、钱包恢复等。您可以深入研究这些话题,以提升对以太坊开发的理解和技能。

社区和资源

结论

ethers.js 是开发者进入 Web3 世界的重要工具之一,它提供了丰富的功能和简洁的 API,使以太坊开发变得更加容易和便捷。通过学习和掌握 ethers.js,您将能够构建更加强大和创新的去中心化应用程序,并深入了解区块链技术的应用与发展。

最后的思考

开始您的 Web3 之旅,从 ethers.js 开始。不断学习、探索,并与开发者社区分享您的经验和成果,共同推动区块链技术的发展与应用。