Provider(连接到以太坊)
Provider
是与以太坊网络交互的接口,用于读取链上数据。
ethers.js
提供了十几种 Provider
最常 用的是 JsonRpcProvider
。
什么是 JsonRpcProvider
JsonRpcProvider
是 ethers.js
提供的一个类,用于通过 JSON-RPC 协议与以太坊节点通信。JSON-RPC 是一种轻量级的远程过程调用协议,广泛用于以太坊生态系统中,允许客户端(您的代码)向区块链节点发送请求(如查询余额、调用合约、发送交易等)。
与 getDefaultProvider
不同,JsonRpcProvider
要求开发者显式指定 RPC 端点的 URL,从而提供更高的控制权和灵活性。
连接
使用 buildbear 提供的测试网 RPC 节点。
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider("提供商的RPC测试节点");
读取链上数据
getBalance 获取余额
返回最原始余额 wei
单位 ETH 余额,Bigint
类型。
传入 address
地址参数,address
在 MetaMask
钱包中最顶部 0x...
。
const balance = await provider.getBalance(
"0x2cFC43B94126595E8B636fed9fB585fF220Bc97d"
);
console.log(balance.toString());
// 返回 300000000000000000000 等价于 300.0 ETH
什么是 wei
在以太坊区块链中,wei
是以太坊原生货币 ETH
的最小单位。ETH 的各种单位(如 wei
、gwei
、ether
)之间的关系类似于法定货币中的分、角、元,用于表示不同数量级的值。wei 是最小的计价单位,广泛用于以太坊的交易、Gas 费用计算和智能合约操作。
wei 的定义
- 1 ETH = 10^18 wei,也就是说,1 个以太币(ETH)等于 1,000,000,000,000,000,000(10 的 18 次方)wei。
- wei 得名于以太坊的先驱之一 Wei Dai(戴伟),他提出了加密货币的早期概念。
以太坊使用多种单位来表示 ETH 的数量,方便不同场景的使用。以下是常见单位及其与 wei 的换算关系:
wei
:最小的单位,1 wei = 1 wei。kwei
(或 kilo-wei):1 kwei = 1,000 wei。mwei
(或 mega-wei):1 mwei = 1,000,000 wei。gwei
(或 giga-wei):1 gwei = 1,000,000,000 wei(10^9 wei)。常用于表示 Gas 费用。ether
:1 ether = 1,000,000,000,000,000,000 wei(10^18 wei)。
getNetwork 获取网络信 息
返回网络信息,包含网络名称、链 ID。
const network = await provider.getNetwork();
console.log(`网络名称:${network.name},网络链ID:${network.chainId}`);
链 ID(chainId) 是什么 在以太坊及兼容区块链的上下文中,chainId 是一个唯一的数字标识符,用于标识特定的区块链网络。它是 EIP-155(以太坊改进提案)引入的一个关键概念,主要用于区分不同的区块链网络(如以太坊主网、测试网或其他兼容链),以确保交易和签名在正确的网络上执行,并防止跨链重放攻击。
chainId 的定义
- chainId 是一个整数,用于唯一标识一条区块链网络。
- 例如:
- 以太坊主网的
chainId 通常是 1
。 - Sepolia 测试网:
chainId = 11155111
- 币安智能链 (BSC) 主网:
chainId = 56
- 以太坊主网的
- 每个区块链网络(包括主网、测试网、侧链或私有链)都有一个独特的
chainId
,确保网络间的隔离。
chainId 的作用
- 网络标识:
- 帮助开发者确认当前连接的区块链网络。例如,
chainId = 1
表示连接到以太坊主网。 - 在 DApp 中,
chainId
用于验证用户是否连接到正确的网络(如要求连接主网)。
- 帮助开发者确认当前连接的区块链网络。例如,
- 防止重放攻击:
chainId
是交易签名的一部分,确保交易只在指定网络上有效。例如,在主网签名的交易无法在 Sepolia 测试网上重放。- 这通过 EIP-155 的签名机制实现,交易数据包含
chainId
。
- 智能合约和工具支持:
- 钱包(如 MetaMask)、节点和工具(如 ethers.js)使用 chainId 来正确处理交易和查询。
- 例如,调用合约时,chainId 确保合约地址和网络匹配。
完整列表可参考 Chainlist
getFeeData 获取当前网络 Gas 费用
getFeeData
方法通过查询区块链网络的最新状态,返回与 Gas 费用相关的数据。这些数据可以用于:
- 估算 Gas 费用:为交易设置合适的 Gas 价格(传统交易)或最大费用/优先费用(EIP-1559 交易)。
- 优化交易成本:根据网络拥堵情况选择合适的 Gas 设置,避免支付过高费用或交易失败。
- 支持 EIP-1559:提供与 EIP-1559(伦敦硬分叉引入的费用市场 )相关的参数,如基础费用和优先费用。
const freeData = await provider.getFeeData();
console.log(
`当前网络的Gas费用:${freeData.gasPrice.toString()} wei,当前网络的最大Gas费:${freeData.maxFeePerGas.toString()} wei,当前网络的最大优先级Gas费:${freeData.maxPriorityFeePerGas.toString()} wei`
);
getFeeData 的返回内容
gasPrice
(传统 Gas 价格,单位:wei):- 用于传统(Legacy)交易,代表每单位 Gas 的价格。
- 在非 EIP-1559 网络(如某些测试网或侧链)上使用。
maxFeePerGas
(EIP-1559 最大费用,单位:wei):- 交易愿意支付的每单位 Gas 的最大费用,包括基础费用(
baseFeePerGas
)和优先费用(maxPriorityFeePerGas
)。
- 交易愿意支付的每单位 Gas 的最大费用,包括基础费用(
maxPriorityFeePerGas
(EIP-1559 优先费用,单位:wei):- 支付给矿工(或验证者)的"优先费"(小费),用于激励更快确认交易。