概述

条目监控提供了对 Solana 区块链基本执行单元的访问。条目包含交易批次及其执行结果,提供了区块链活动的最低级视图。
先决条件: 本指南假设您已完成 Yellowstone gRPC 快速入门 并已设置好工作流。
高级主题: 条目监控主要用于深入的区块链分析、调试和特殊用例。大多数应用程序应使用交易或账户监控。

什么是条目?

基本的区块链单元条目是验证者用来构建区块的基本构建块:
  • 交易批次: 一起执行的交易组
  • 执行顺序: 条目内的确定性交易排序
  • 哈希链: 条目之间的加密链接
  • 时间信息: 条目创建和处理的时间
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`);
    }
  }
}

条目数据结构

了解条目数据格式:

性能考虑

容量特性

高频数据流
  • 非常高的消息速率
  • 网络活动期间的连续流
  • 每个条目包含多个交易
  • 需要高效处理

处理效率

优化性能
  • 异步处理条目
  • 批量条目分析
  • 专注于特定数据字段
  • 对大规模分析使用采样

常见用例

分析交易批处理效率
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);
      }
    }
  }
}

最佳实践

故障排除

下一步

请记住: 入口监控是用于高级区块链分析的专业工具。对于大多数应用程序,交易、账户或区块监控将更合适且更高效。