进阶 docs.web3js.org 2026-10-19 02:32:29 · 19 阅读
第1章 Web3.js 入门指南:安装、导入与区块链查询
快速开始
使用在线代码编辑器,立即在浏览器中体验 Web3.js!也可以继续阅读,了解如何在本地开发环境中使用 Web3.js。
在线代码编辑器
安装
如果使用 NPM 作为包管理器,可以通过以下命令安装 Web3.js:
npm i web3
如果项目使用 Yarn 作为包管理器,则使用: yarn add web3
注意:这种安装方式会引入 Web3.js 的所有子包。如果只需要特定包,建议单独安装(例如,只需要 Contract 包时,可以使用 npm i web3-eth-contract)。 导入 Web3.js Web3.js v4 同时支持 CommonJS(CJS)和原生 ECMAScript 模块(ESM)导入。在 CJS 中导入主 Web3 类,使用: const { Web3 } = require('web3');
使用 ESM 方式导入,则用: import { Web3 } from 'web3';
使用 Provider 初始化 Web3 Provider 是负责与 Ethereum 网络建立连接的服务。Web3 对象必须使用有效的 Provider 初始化,才能正常工作。Web3.js 支持 HTTP、WebSocket 和 IPC 三种 Provider,并为每种类型提供了相应的包。 Web3.js 遵循 EIP-1193(Ethereum Provider JavaScript API),因此任何符合 EIP-1193 的 Provider 都可以用来初始化 Web3 对象。 import { Web3 } from 'web3';
// 私有 RPC 端点
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_ID');
// 或公共 RPC 端点
// const web3 = new Web3('https://eth.llamarpc.com');
web3.eth.getBlockNumber().then(console.log);
// ↳ 18849658n
查询区块链 使用 Provider 实例化 Web3 后,就可以通过 web3-eth 包从 Ethereum 网络获取数据: // 获取某地址的余额
await web3.eth.getBalance('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045');
// ↳ 114438180989009447638n
// 获取最新区块号
await web3.eth.getBlockNumber();
// ↳ 18849658n
// 获取当前 Provider 的链 ID
await web3.eth.getChainId();
// ↳ 1n
// 获取某地址的 nonce
await web3.eth.getTransactionCount('0x37826D8B5F4B175517A0f42c886f8Fca38C55Fe7');
// ↳ 7n
// 获取当前 gas 价格
await web3.eth.getGasPrice();
// ↳ 23879160756n
配置钱包 若要向 Ethereum 网络发送交易(例如转账 ETH 或调用智能合约),需使用一个有余额的账户来支付 Gas 费用。 Wallet 对象用于管理一组可用于发送交易的账户,这些账户可通过 web3.eth.sendTransaction 或 web3.eth.contract.methods.contractfunction().send() 发起交易。 创建随机账户 利用 Wallet 创建随机账户是加速开发进程的有效方法,但由于随机账户没有余额来支付 Gas 费用,因此不适合主网或生产环境。使用 Wallet.create 方法可生成一个随机账户。 // 创建一个包含 1 个账户的随机钱包
web3.eth.accounts.wallet.create(1);
/* ↳
Wallet(1)
[
{
address: '0xcE6A5235d6033341972782a15289277E85E5b305',
privateKey: '0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(1) { '0xce6a5235d6033341972782a15289277e85e5b305' => 0 },
_defaultKeyName: 'web3js_wallet'
]
*/
通过私钥添加账户 使用 Wallet.add 方法,可将现有账户通过私钥添加到钱包中。 warning 私钥属于敏感数据,务必妥善保管。请确保私钥不外泄,包括避免将其提交到代码仓库中。 // 私钥必须以 "0x" 前缀开头
const account = web3.eth.accounts.wallet.add(
'0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
);
console.log(account[0].address);
//↳ 0xcE6A5235d6033341972782a15289277E85E5b305
console.log(account[0].privateKey);
//↳ 0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec
转账 ETH 以下示例展示了如何使用私钥将账户添加到钱包,并使用该账户转账 ETH: // 将账户添加到钱包
const account = web3.eth.accounts.wallet.add(
'0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
);
// 创建交易对象,从 account[0] 向 '0xa32...c94' 地址发送 1 个 ETH
const tx = {
from: account[0].address,
to: '0xa3286628134bad128faeef82f44e99aa64085c94',
value: web3.utils.toWei('1', 'ether'),
};
//“from”地址必须与此前通过 wallet.add 添加的地址一致
// 发送交易
const txReceipt = await web3.eth.sendTransaction(tx);
console.log('交易哈希:', txReceipt.transactionHash);
// ↳ 交易哈希:0x03c844b069646e08af1b6f31519a36e3e08452b198ef9f6ce0f0ccafd5e3ae0e
与智能合约交互 智能合约是在以太坊网络上运行的程序。继续阅读,学习如何使用 Web3.js 与智能合约进行交互。 实例化智能合约 与智能合约交互的第一步是实例化它,这需要提供合约的 ABI 和地址。以下示例演示了如何实例化 Uniswap 代币智能合约: // Uniswap 代币智能合约地址(主网)
const address = '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984';
// 完整 ABI 可在 etherscan.io 上找到
// https://etherscan.io/address/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984#code
const ABI = [
{
name: 'symbol',
outputs: [{ type: 'string' }],
type: 'function',
},
{
name: 'totalSupply',
outputs: [{ type: 'uint256' }],
type: 'function',
},
];
// 实例化智能合约
const uniswapToken = new web3.eth.Contract(abi, address);
读取方法 由于从智能合约读取数据不消耗 gas,因此无需使用账户。以下是从 Uniswap 代币智能合约读取数据的一些示例: // 调用合约
const symbol = await uniswapToken.methods.symbol().call();
console.log('Uniswap 符号:', symbol);
// ↳ Uniswap 符号:UNI
// 调用合约
const totalSupply = await uniswapToken.methods.totalSupply().call();
console.log('Uniswap 总供应量:', totalSupply);
// ↳ Uniswap 总供应量:1000000000000000000000000000n
写入方法 向智能合约写入数据会消耗 gas,并需要使用有余额的账户。以下示例演示了此类交互: // 代币发送地址
const to = '0xcf185f2F3Fe19D82bFdcee59E3330FD7ba5f27ce';
// 转账金额(1 个 ether,精度为 18)
const value = web3.utils.toWei('1', 'ether');
// 发送交易 => 返回交易收据
查询历史事件 智能合约会通过发出事件来传达重要的交互。下面的例子演示了如何查询 Uniswap 代币智能合约中某个区块号之后发生的所有 Transfer 事件: 注意:你只能查询最近 100,000 个区块以内的日志。 订阅事件 Web3.js 支持订阅事件,从而实时获知重要的合约交互。下面是一个订阅 Uniswap 代币 Transfer 事件的例子: 注意:HTTP provider 不支持实时事件订阅。要订阅实时事件,请使用其他类型的 provider。
如果项目使用 Yarn 作为包管理器,则使用: yarn add web3
注意:这种安装方式会引入 Web3.js 的所有子包。如果只需要特定包,建议单独安装(例如,只需要 Contract 包时,可以使用 npm i web3-eth-contract)。 导入 Web3.js Web3.js v4 同时支持 CommonJS(CJS)和原生 ECMAScript 模块(ESM)导入。在 CJS 中导入主 Web3 类,使用: const { Web3 } = require('web3');
使用 ESM 方式导入,则用: import { Web3 } from 'web3';
使用 Provider 初始化 Web3 Provider 是负责与 Ethereum 网络建立连接的服务。Web3 对象必须使用有效的 Provider 初始化,才能正常工作。Web3.js 支持 HTTP、WebSocket 和 IPC 三种 Provider,并为每种类型提供了相应的包。 Web3.js 遵循 EIP-1193(Ethereum Provider JavaScript API),因此任何符合 EIP-1193 的 Provider 都可以用来初始化 Web3 对象。 import { Web3 } from 'web3';
// 私有 RPC 端点
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_ID');
// 或公共 RPC 端点
// const web3 = new Web3('https://eth.llamarpc.com');
web3.eth.getBlockNumber().then(console.log);
// ↳ 18849658n
查询区块链 使用 Provider 实例化 Web3 后,就可以通过 web3-eth 包从 Ethereum 网络获取数据: // 获取某地址的余额
await web3.eth.getBalance('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045');
// ↳ 114438180989009447638n
// 获取最新区块号
await web3.eth.getBlockNumber();
// ↳ 18849658n
// 获取当前 Provider 的链 ID
await web3.eth.getChainId();
// ↳ 1n
// 获取某地址的 nonce
await web3.eth.getTransactionCount('0x37826D8B5F4B175517A0f42c886f8Fca38C55Fe7');
// ↳ 7n
// 获取当前 gas 价格
await web3.eth.getGasPrice();
// ↳ 23879160756n
配置钱包 若要向 Ethereum 网络发送交易(例如转账 ETH 或调用智能合约),需使用一个有余额的账户来支付 Gas 费用。 Wallet 对象用于管理一组可用于发送交易的账户,这些账户可通过 web3.eth.sendTransaction 或 web3.eth.contract.methods.contractfunction().send() 发起交易。 创建随机账户 利用 Wallet 创建随机账户是加速开发进程的有效方法,但由于随机账户没有余额来支付 Gas 费用,因此不适合主网或生产环境。使用 Wallet.create 方法可生成一个随机账户。 // 创建一个包含 1 个账户的随机钱包
web3.eth.accounts.wallet.create(1);
/* ↳
Wallet(1)
[
{
address: '0xcE6A5235d6033341972782a15289277E85E5b305',
privateKey: '0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
},
_accountProvider: {
create: [Function: createWithContext],
privateKeyToAccount: [Function: privateKeyToAccountWithContext],
decrypt: [Function: decryptWithContext]
},
_addressMap: Map(1) { '0xce6a5235d6033341972782a15289277e85e5b305' => 0 },
_defaultKeyName: 'web3js_wallet'
]
*/
通过私钥添加账户 使用 Wallet.add 方法,可将现有账户通过私钥添加到钱包中。 warning 私钥属于敏感数据,务必妥善保管。请确保私钥不外泄,包括避免将其提交到代码仓库中。 // 私钥必须以 "0x" 前缀开头
const account = web3.eth.accounts.wallet.add(
'0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
);
console.log(account[0].address);
//↳ 0xcE6A5235d6033341972782a15289277E85E5b305
console.log(account[0].privateKey);
//↳ 0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec
转账 ETH 以下示例展示了如何使用私钥将账户添加到钱包,并使用该账户转账 ETH: // 将账户添加到钱包
const account = web3.eth.accounts.wallet.add(
'0x50d349f5cf627d44858d6fcb6fbf15d27457d35c58ba2d5cfeaf455f25db5bec',
);
// 创建交易对象,从 account[0] 向 '0xa32...c94' 地址发送 1 个 ETH
const tx = {
from: account[0].address,
to: '0xa3286628134bad128faeef82f44e99aa64085c94',
value: web3.utils.toWei('1', 'ether'),
};
//“from”地址必须与此前通过 wallet.add 添加的地址一致
// 发送交易
const txReceipt = await web3.eth.sendTransaction(tx);
console.log('交易哈希:', txReceipt.transactionHash);
// ↳ 交易哈希:0x03c844b069646e08af1b6f31519a36e3e08452b198ef9f6ce0f0ccafd5e3ae0e
与智能合约交互 智能合约是在以太坊网络上运行的程序。继续阅读,学习如何使用 Web3.js 与智能合约进行交互。 实例化智能合约 与智能合约交互的第一步是实例化它,这需要提供合约的 ABI 和地址。以下示例演示了如何实例化 Uniswap 代币智能合约: // Uniswap 代币智能合约地址(主网)
const address = '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984';
// 完整 ABI 可在 etherscan.io 上找到
// https://etherscan.io/address/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984#code
const ABI = [
{
name: 'symbol',
outputs: [{ type: 'string' }],
type: 'function',
},
{
name: 'totalSupply',
outputs: [{ type: 'uint256' }],
type: 'function',
},
];
// 实例化智能合约
const uniswapToken = new web3.eth.Contract(abi, address);
读取方法 由于从智能合约读取数据不消耗 gas,因此无需使用账户。以下是从 Uniswap 代币智能合约读取数据的一些示例: // 调用合约
const symbol = await uniswapToken.methods.symbol().call();
console.log('Uniswap 符号:', symbol);
// ↳ Uniswap 符号:UNI
// 调用合约
const totalSupply = await uniswapToken.methods.totalSupply().call();
console.log('Uniswap 总供应量:', totalSupply);
// ↳ Uniswap 总供应量:1000000000000000000000000000n
写入方法 向智能合约写入数据会消耗 gas,并需要使用有余额的账户。以下示例演示了此类交互: // 代币发送地址
const to = '0xcf185f2F3Fe19D82bFdcee59E3330FD7ba5f27ce';
// 转账金额(1 个 ether,精度为 18)
const value = web3.utils.toWei('1', 'ether');
// 发送交易 => 返回交易收据
查询历史事件 智能合约会通过发出事件来传达重要的交互。下面的例子演示了如何查询 Uniswap 代币智能合约中某个区块号之后发生的所有 Transfer 事件: 注意:你只能查询最近 100,000 个区块以内的日志。 订阅事件 Web3.js 支持订阅事件,从而实时获知重要的合约交互。下面是一个订阅 Uniswap 代币 Transfer 事件的例子: 注意:HTTP provider 不支持实时事件订阅。要订阅实时事件,请使用其他类型的 provider。