进阶 docs.web3js.org 2026-10-19 02:32:29 · 17 阅读

第6章 Web3.js Provider 详解:类型、配置与使用

# Web3.js Provider 概览 Provider(提供者)是让 Web3.js 与 Ethereum 网络建立连接的服务。要让应用连接到 Ethereum 节点,从而查询数据、发送交易、与智能合约交互,都必须借助 provider。本指南将介绍 Web3.js 各类 provider 的类型、配置方式及其在应用中的用法。 通常在创建 Web3 对象时传入 provider: 初始化 provider ```ts import { Web3 } from 'web3';

const web3 = new Web3(/* PROVIDER*/);

// 调用任何需要与网络交互的方法时,都会使用传入的 provider
await web3.eth.getBlockNumber();
``` 新创建的 Web3 实例会通过传入的 provider 与区块链网络交互,具体包括发送请求、接收响应,以及监听 provider 事件(如果 provider 支持的话)。 ## Provider 的类型​ Web3.js 支持多种类型的 provider,适用于不同的使用场景。可用类型如下: - HTTP Provider - WebSocket Provider - IPC Provider(仅限 Node.js) - 注入式 Provider(符合 EIP 1193 标准) HTTP 和 WebSocket provider 可以直接以 URL 字符串的形式传入,所有类型的 provider 也都可以通过构造 SupportedProviders 类型来创建。 继续阅读,了解更多 provider 类型及其用法。 ## HTTP Provider​ HTTP 是一种请求-响应协议,不支持持久连接,因此 HTTP provider 不适用于需要实时事件订阅的场景。 初始化 HTTP Provider ```ts import { Web3, HttpProvider } from 'web3';

// 以 URL 字符串的形式传入 HTTP provider
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_ID');

await web3.eth.getBlockNumber();
// ↳ 18849658n

// 或者

// 通过构造新的 HttpProvider 传入 HTTP provider
const web3_2 = new Web3(new HttpProvider('https://mainnet.infura.io/v3/YOUR_INFURA_ID'));

await web3.eth.getBlockNumber();
// ↳ 18849658n
``` ## 配置 HTTP Provider​ 配置 HTTP provider 的方法是在 HttpProvider 构造函数中传入一个 HttpProviderOptions 对象。HttpProviderOptions 类型只有一个属性 providerOptions,它是一个标准的 TypeScript RequestInit 对象。 配置 HTTP Provider ```ts import { Web3, HttpProvider } from 'web3';

const httpOptions = {
providerOptions: {
```text body: undefined,
cache: 'force-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
},
integrity: undefined,
keepalive: true,
method: 'GET',
mode: 'same-origin',
redirect: 'error',
referrer: undefined,
referrerPolicy: 'same-origin',
signal: undefined,
window: undefined,
} as RequestInit,
};

const web3 = new Web3(new HttpProvider('https://eth.llamarpc.com', httpOptions));
WebSocket Provider​ WebSockets 支持客户端与服务器之间的持久连接,因此适合需要实时事件订阅的场景。 初始化 WS Providerimport { Web3, WebSocketProvider } from 'web3';

// 使用 URL 字符串提供 WebSocket provider
const web3 = new Web3('wss://mainnet.infura.io/ws/v3/YOUR_INFURA_ID');

await web3.eth.getBlockNumber();
// ↳ 18849658n

// 或者

// 通过构建新的 WebSocketProvider 实例来提供
const web3_2 = new Web3(new WebSocketProvider('wss://mainnet.infura.io/ws/v3/YOUR_INFURA_ID'));

await web3.eth.getBlockNumber();
// ↳ 18849658n
Websocket Providers will only terminate when closed​ 连接 WebSocket provider 时,即使代码执行完毕,程序也不会自动终止。这是为了确保 WebSocket 连接保持打开,让程序能继续监听事件。 程序会保持活动状态,直到你显式断开 WebSocket provider 的连接: const web3 = new Web3(wsUrl);
// 程序会持续运行以监听事件。
Terminating the Program​ 当准备停止程序时,可以通过调用 disconnect 方法手动断开 WebSocket provider 的连接。这将正确关闭连接并终止程序: const web3 = new Web3(wsUrl);
// 当准备好终止程序时
web3.currentProvider?.disconnect();
// 程序现在将终止
Configuring WebSocket Providers​ WebSocketProvider 构造函数接受两个可选参数,用于配置其行为:第一个参数类型必须是 ClientRequestArgs 或 ClientOptions,第二个参数类型必须是 ReconnectOptions。 Configuring a WebSocket Provider// 包含两个可选参数
const provider = new WebSocketProvider(
`ws://localhost:8545`,
{
headers: {
``` // 适用于 Node 服务中需要在请求头中指定 API 密钥的情况
'x-api-key': '',
},
},
{
delay: 500,
autoReconnect: true,
maxAttempts: 10,
},
);

// 或者仅传入 ReconnectOptions
const provider = new WebSocketProvider(
`ws://localhost:8545`,
{},
{
delay: 500,
autoReconnect: true,
maxAttempts: 10,
},
);
IPC Provider IPC(进程间通信)Provider 提供高性能的本地通信能力,是 HTTP Provider 更快速的替代方案。IPC Provider 专为效率优化设计,在本地环境中表现出色,同时支持实时事件订阅。 初始化 IPC Provider import { Web3 } from 'web3';
import { IpcProvider } from 'web3-providers-ipc';

const web3 = new Web3(new IpcProvider('/users/myuser/.ethereum/geth.ipc'));

await web3.eth.getBlockNumber();
// ↳ 18849658n
配置 IPC Provider IpcProvider 构造函数接受两个可选参数,用于配置 IpcProvider 的行为:第一个参数必须是 SocketConstructorOpts 类型,第二个参数必须是 ReconnectOptions 类型。 配置 IPC Provider // 同时包含两个可选参数
const provider = new IpcProvider(
'/Users/myuser/Library/Ethereum/geth.ipc',
{
writable: false,
},
{
delay: 500,
autoReconnect: true,
maxAttempts: 10,
},
);

// 或者仅传入 ReconnectOptions
const provider = new IpcProvider(
'/Users/myuser/Library/Ethereum/geth.ipc',
{},
{
delay: 500,
autoReconnect: true,
maxAttempts: 10,
},
);
注入式 Provider​ 注入式 Provider 由外部第三方提供,最常见的是配合 Ethereum 网络使用的钱包或浏览器。除了提供网络连接外,它们通常还会提供一个或多个账户。Web3.js 支持任何符合 EIP-1193 标准的注入式 Provider,并支持实时事件订阅。后文将给出使用注入式 Provider 的示例。 Provider 来源​ Provider 可以是应用本地的(即运行在同一台机器上),也可以是远程的(即运行在第三方服务器上)。注入式 Provider 是第三种选择,由外部第三方提供,通常是配合 Ethereum 网络使用的钱包或浏览器。继续阅读,查看本地、远程和注入式 Provider 的使用示例。 本地 Provider​ 本地 Provider 通常可通过 IPC、HTTP 或 WebSocket 访问。以下示例演示了如何使用本地 Geth 节点为 Web3.js 提供 Provider。 IPC、HTTP 和 WS Providerimport { Web3 } from 'web3';
import { IpcProvider } from 'web3-providers-ipc';

// IPC provider
const web3 = new Web3(new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc'));
// 上面是 macOS 的路径
// Windows 下的路径是: '\\\\.\\pipe\\geth.ipc'
// Linux 下的路径是: '/users/myuser/.ethereum/geth.ipc'

// HTTP provider
web3.setProvider('http://localhost:8545');
// 或者
web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));

// WebSocket provider
web3.setProvider('ws://localhost:8546');
// 或者
web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
远程 Provider​ Alchemy、Infura、QuickNode 等服务提供可通过 HTTP 或 WebSocket 访问的 Ethereum 节点服务。 Alchemy、Infura 等import { Web3 } from 'web3';
const web3 = new Web3('https://eth-mainnet.alchemyapi.io/v2/your-api-key');
注入式 Provider 注入式 Provider 由外部第三方提供,通常是专为以太坊网络设计的钱包或 Web 浏览器。除了提供网络连接外,注入式 Provider 通常还会提供一到多个账户。Web3.js 支持任何符合 EIP-1193 标准的注入式 Provider,并且已针对包括 MetaMask、Hardhat 和 Incubed (IN3) 在内的多个 EIP-1193 Provider 进行了测试。 提示 以下示例需在安装了 MetaMask 扩展的浏览器中运行。 例如,MetaMask

评论 (0)