条目监控提供了对 Solana 区块链基本执行单元的访问。条目包含交易批次及其执行结果,提供了区块链活动的最低级视图。
高级主题: 条目监控主要用于深入的区块链分析、调试和特殊用例。大多数应用程序应使用交易或账户监控。
什么是条目?
基本的区块链单元 条目是验证者用来构建区块的基本构建块:
交易批次: 一起执行的交易组
执行顺序: 条目内的确定性交易排序
哈希链: 条目之间的加密链接
时间信息: 条目创建和处理的时间
const subscribeRequest : SubscribeRequest = {
entry: {
entrySubscribe: {} // Subscribe to all entries
},
commitment: CommitmentLevel . CONFIRMED
};
实现示例
基本条目监控
import { StreamManager } from './stream-manager' ; // From quickstart guide
async function monitorEntries () {
const streamManager = new StreamManager (
"your-grpc-endpoint" ,
"your-api-key" ,
handleEntryUpdate
);
const subscribeRequest : SubscribeRequest = {
entry: {
entrySubscribe: {} // Subscribe to all entries
},
commitment: CommitmentLevel . CONFIRMED
};
console . log ( 'Starting entry monitoring...' );
await streamManager . connect ( subscribeRequest );
}
function handleEntryUpdate ( data : any ) : void {
if ( data . entry ) {
const entry = data . entry ;
console . log ( ' \n 📋 Entry Details:' );
console . log ( ` Slot: ${ entry . slot } ` );
console . log ( ` Index: ${ entry . index || 'N/A' } ` );
console . log ( ` Hash: ${ entry . hash || 'N/A' } ` );
console . log ( ` Num Hashes: ${ entry . numHashes || 'N/A' } ` );
if ( entry . transactions ?. length > 0 ) {
console . log ( ` \n 📦 Entry Transactions ( ${ entry . transactions . length } ):` );
entry . transactions . forEach (( tx : any , index : number ) => {
console . log ( ` ${ index + 1 } . ${ tx . signature || 'No signature' } ` );
console . log ( ` Vote: ${ tx . isVote ? 'Yes' : 'No' } ` );
// Show transaction status if available
if ( tx . meta ) {
const status = tx . meta . err ? 'Failed' : 'Success' ;
console . log ( ` Status: ${ status } ` );
if ( tx . meta . fee ) {
console . log ( ` Fee: ${ tx . meta . fee } lamports` );
}
}
});
} else {
console . log ( ` 📦 No transactions in this entry` );
}
// Check if this is a tick entry (no transactions)
if ( entry . tick !== undefined ) {
console . log ( ` ⏱️ Tick Entry: ${ entry . tick ? 'Yes' : 'No' } ` );
}
}
}
// Start monitoring
monitorEntries (). catch ( console . error );
条目分析示例
条目模式的高级分析:
let entryStats = {
totalEntries: 0 ,
totalTransactions: 0 ,
tickEntries: 0 ,
largestEntry: 0 ,
slotsProcessed: new Set < number >()
};
function analyzeEntry ( data : any ) : void {
if ( data . entry ) {
const entry = data . entry ;
entryStats . totalEntries ++ ;
entryStats . slotsProcessed . add ( entry . slot );
const txCount = entry . transactions ?. length || 0 ;
entryStats . totalTransactions += txCount ;
if ( txCount === 0 || entry . tick ) {
entryStats . tickEntries ++ ;
}
if ( txCount > entryStats . largestEntry ) {
entryStats . largestEntry = txCount ;
console . log ( ` \n 🔥 New largest entry: ${ txCount } transactions in slot ${ entry . slot } ` );
}
// Log stats every 100 entries
if ( entryStats . totalEntries % 100 === 0 ) {
console . log ( ' \n 📊 Entry Statistics:' );
console . log ( ` Total Entries: ${ entryStats . totalEntries } ` );
console . log ( ` Total Transactions: ${ entryStats . totalTransactions } ` );
console . log ( ` Tick Entries: ${ entryStats . tickEntries } ` );
console . log ( ` Slots Processed: ${ entryStats . slotsProcessed . size } ` );
console . log ( ` Avg Tx/Entry: ${ ( entryStats . totalTransactions / entryStats . totalEntries ). toFixed ( 2 ) } ` );
console . log ( ` Largest Entry: ${ entryStats . largestEntry } transactions` );
}
}
}
条目数据结构
了解条目数据格式:
{
slot : number ; // Slot number containing this entry
index : number ; // Entry index within the slot
hash : string ; // Entry hash (proof-of-history)
numHashes : number ; // Number of hashes in PoH sequence
transactions : Array < { // Transactions in this entry
signature : string ;
isVote : boolean ;
meta : {
err : any ; // Error if transaction failed
fee : number ; // Transaction fee
// ... other transaction metadata
};
} > ;
tick : boolean ; // Whether this is a tick entry
}
条目与交易:
条目将交易分组在一起
显示执行顺序和批处理
包含 PoH(历史证明)信息
条目与区块:
区块包含多个条目
条目是区块内的子单元
区块添加共识和最终性信息
条目与槽:
槽是时间单位(400ms)
每个槽可以存在多个条目
条目显示槽内发生的事件
性能考虑
容量特性 高频数据流
非常高的消息速率
网络活动期间的连续流
每个条目包含多个交易
需要高效处理
处理效率 优化性能
异步处理条目
批量条目分析
专注于特定数据字段
对大规模分析使用采样
常见用例
分析交易批处理效率 function analyzeBatching ( entry : any ) : void {
const txCount = entry . transactions ?. length || 0 ;
if ( txCount > 50 ) {
console . log ( `Large batch: ${ txCount } transactions in entry ${ entry . index } ` );
}
// Track batching patterns
const batchSizes = new Map < number , number >();
const currentCount = batchSizes . get ( txCount ) || 0 ;
batchSizes . set ( txCount , currentCount + 1 );
}
过滤和优化
条目监控目前不支持特定过滤器,因此所有条目都被流式传输。为管理此情况:
优化策略:
客户端过滤: 仅处理符合您条件的条目
采样: 分析每第 N 个条目以进行统计分析
基于时间的分析: 专注于特定时间段
基于槽位的过滤: 仅处理来自某些槽位的条目
交易类型过滤: 专注于具有特定交易类型的条目
客户端过滤示例:
function handleFilteredEntries ( data : any ) : void {
if ( data . entry ) {
const entry = data . entry ;
// Only process entries with transactions
if ( entry . transactions ?. length > 0 ) {
// Only process entries with non-vote transactions
const hasNonVoteTransactions = entry . transactions . some (( tx : any ) => ! tx . isVote );
if ( hasNonVoteTransactions ) {
processImportantEntry ( entry );
}
}
}
}
最佳实践
适用场景:
深度区块链分析和研究
验证器性能研究
网络调试和取证
学术区块链研究
理解 PoH 机制
不适用场景:
标准应用程序开发
面向用户的功能
业务逻辑实现
实时交易应用程序
处理高容量数据:
实施高效的数据处理
使用异步处理模式
考虑数据采样进行分析
监控内存使用并进行清理
实施背压处理
有效的条目分析:
专注于特定指标
使用统计采样
实施滚动平均
跟踪随时间变化的模式
与其他区块链数据相关联
故障排除
问题: 条目流量过大解决方案:
实施客户端过滤
使用数据采样技术
异步处理条目
监控系统资源
考虑替代监控方法
问题: 需要额外的交易上下文解决方案:
结合交易监控
与账户更新交叉引用
使用区块监控获取更广泛的上下文
维护本地状态跟踪
下一步
请记住: 入口监控是用于高级区块链分析的专业工具。对于大多数应用程序,交易、账户或区块监控将更合适且更高效。