进阶 docs.web3js.org 2026-10-19 02:32:29 · 14 阅读
第10章 订阅以太坊智能合约与节点事件
Events subscription
订阅智能合约事件
import { Web3 } from 'web3';
// 设置一个 provider,必须使用 WebSocket (WSS) 类型的
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
// 创建一个新的合约对象,需要提供 ABI 和地址
const contract = new web3.eth.Contract(abi, address);
// 订阅该智能合约的事件
const subscription = contract.events.EventName();
// 每次事件被触发时,获取新的值
subscription.on('data', console.log);
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
订阅节点事件 像 Geth 这样的标准以太坊节点支持订阅特定事件。此外,还有一些以太坊节点提供了额外的自定义订阅功能。正如你在这份指南中发现的,web3.js 允许你开箱即用地订阅标准事件。它也提供了订阅自定义功能的能力,你可以在《Custom Subscriptions 指南》中找到相关内容。 重要提示 如果你是向用户提供自定义订阅服务的开发者,建议你在阅读完下方的《Custom Subscription》章节后,开发一个 web3.js Plugin。你可以在《web3.js Plugin Developer Guide》中查阅如何开发插件。 on("data") - 每当收到新的 log 时触发,并将 log 对象作为参数传入。 subscription.on('data', data => console.log(data));
on("changed") - 每当有 log 从区块链上移除时触发。该 log 会包含一个附加属性 "removed: true"。 subscription.on('changed', changed => console.log(changed));
on("error") - 当订阅过程中发生错误时触发。 subscription.on('error', error => console.log(error));
on("connected") - 在订阅成功连接后触发一次。返回订阅 ID。 subscription.on('connected', connected => console.log(connected));
Logs logs:在 LogsSubscription 类中实现 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
// 创建订阅
const subscription = await web3.eth.subscribe('logs');
// 打印最新挖出的区块的 logs
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Pending Transactions(待处理交易) newPendingTransactions:实现在 NewPendingTransactionsSubscription 类中。 pendingTransactions:与 newPendingTransactions 相同。 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('pendingTransactions'); //或者 ("newPendingTransactions")
//打印待处理交易的交易哈希
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Block Headers(区块头) newBlockHeaders:实现在 NewHeadsSubscription 类中。 newHeads:与 newBlockHeaders 相同。 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('newBlockHeaders'); //或者 ("newHeads")
//每当挖出一个新区块就打印区块头
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Syncing(同步状态) syncing:实现在 SyncingSubscription 类中 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('syncing');
//节点正在同步时返回 `true`
//同步完成后,`changed` 事件会返回 `false`
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
// 设置一个 provider,必须使用 WebSocket (WSS) 类型的
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
// 创建一个新的合约对象,需要提供 ABI 和地址
const contract = new web3.eth.Contract(abi, address);
// 订阅该智能合约的事件
const subscription = contract.events.EventName();
// 每次事件被触发时,获取新的值
subscription.on('data', console.log);
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
订阅节点事件 像 Geth 这样的标准以太坊节点支持订阅特定事件。此外,还有一些以太坊节点提供了额外的自定义订阅功能。正如你在这份指南中发现的,web3.js 允许你开箱即用地订阅标准事件。它也提供了订阅自定义功能的能力,你可以在《Custom Subscriptions 指南》中找到相关内容。 重要提示 如果你是向用户提供自定义订阅服务的开发者,建议你在阅读完下方的《Custom Subscription》章节后,开发一个 web3.js Plugin。你可以在《web3.js Plugin Developer Guide》中查阅如何开发插件。 on("data") - 每当收到新的 log 时触发,并将 log 对象作为参数传入。 subscription.on('data', data => console.log(data));
on("changed") - 每当有 log 从区块链上移除时触发。该 log 会包含一个附加属性 "removed: true"。 subscription.on('changed', changed => console.log(changed));
on("error") - 当订阅过程中发生错误时触发。 subscription.on('error', error => console.log(error));
on("connected") - 在订阅成功连接后触发一次。返回订阅 ID。 subscription.on('connected', connected => console.log(connected));
Logs logs:在 LogsSubscription 类中实现 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
// 创建订阅
const subscription = await web3.eth.subscribe('logs');
// 打印最新挖出的区块的 logs
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Pending Transactions(待处理交易) newPendingTransactions:实现在 NewPendingTransactionsSubscription 类中。 pendingTransactions:与 newPendingTransactions 相同。 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('pendingTransactions'); //或者 ("newPendingTransactions")
//打印待处理交易的交易哈希
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Block Headers(区块头) newBlockHeaders:实现在 NewHeadsSubscription 类中。 newHeads:与 newBlockHeaders 相同。 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('newBlockHeaders'); //或者 ("newHeads")
//每当挖出一个新区块就打印区块头
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);
Syncing(同步状态) syncing:实现在 SyncingSubscription 类中 import { Web3 } from 'web3';
const web3 = new Web3('wss://ethereum-rpc.publicnode.com');
async function subscribe() {
//创建订阅
const subscription = await web3.eth.subscribe('syncing');
//节点正在同步时返回 `true`
//同步完成后,`changed` 事件会返回 `false`
subscription.on('data', data => console.log(data));
}
// 取消订阅的函数
async function unsubscribe(subscription) {
await subscription.unsubscribe();
}
subscribe();
unsubscribe(subscription);