跳转到主要内容

参数

此方法不接受任何参数。

响应

result
object

代码示例

基本请求

curl https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getHighestSnapshotSlot"
}'

使用 web3.js

import { Connection } from '@solana/web3.js';

const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');

// Get highest snapshot slot
const snapshotSlot = await connection.getHighestSnapshotSlot();
console.log('Highest full snapshot slot:', snapshotSlot.full);
if (snapshotSlot.incremental !== null) {
  console.log('Highest incremental snapshot slot:', snapshotSlot.incremental);
}

// Check snapshot availability
async function checkSnapshotAvailability() {
  const snapshotSlot = await connection.getHighestSnapshotSlot();
  const currentSlot = await connection.getSlot();
  
  return {
    fullSnapshotAvailable: snapshotSlot.full > 0,
    incrementalSnapshotAvailable: snapshotSlot.incremental !== null,
    fullSnapshotSlot: snapshotSlot.full,
    incrementalSnapshotSlot: snapshotSlot.incremental,
    currentSlot,
    fullSnapshotAge: currentSlot - snapshotSlot.full,
    incrementalSnapshotAge: snapshotSlot.incremental ? currentSlot - snapshotSlot.incremental : null
  };
}

注意事项

  1. 返回最高快照 slot 的信息
  2. 完整快照包含完整的账本状态
  3. 增量快照包含自上次完整快照以来的更改
  4. 增量快照可能在所有节点上不可用
  5. 响应是即时的,因为它从当前状态读取

最佳实践

  1. 使用此方法确定快照可用性
  2. 规划操作时考虑快照年龄
  3. 在适当时缓存结果以减少 RPC 负载
  4. 处理增量快照不可用的情况
  5. 结合其他快照方法使用

常见错误

错误码消息解决方案
-32601Method not found验证是否连接到 Solana RPC 节点
-32007Snapshot information unavailable节点可能正在启动或同步中

用例

  1. 快照分析
    interface SnapshotMetrics {
      fullSnapshot: {
        slot: number;
        age: number;
        available: boolean;
      };
      incrementalSnapshot: {
        slot: number | null;
        age: number | null;
        available: boolean;
      };
      currentSlot: number;
    }
    
    async function analyzeSnapshots(): Promise<SnapshotMetrics> {
      const snapshotSlot = await connection.getHighestSnapshotSlot();
      const currentSlot = await connection.getSlot();
      
      return {
        fullSnapshot: {
          slot: snapshotSlot.full,
          age: currentSlot - snapshotSlot.full,
          available: snapshotSlot.full > 0
        },
        incrementalSnapshot: {
          slot: snapshotSlot.incremental,
          age: snapshotSlot.incremental ? currentSlot - snapshotSlot.incremental : null,
          available: snapshotSlot.incremental !== null
        },
        currentSlot
      };
    }
    
  2. 快照监控
    interface SnapshotAlert {
      type: 'full' | 'incremental';
      message: string;
      currentSlot: number;
      snapshotSlot: number;
      age: number;
    }
    
    async function monitorSnapshots(maxAge: number): Promise<SnapshotAlert[]> {
      const snapshotSlot = await connection.getHighestSnapshotSlot();
      const currentSlot = await connection.getSlot();
      const alerts: SnapshotAlert[] = [];
      
      if (snapshotSlot.full > 0) {
        const fullAge = currentSlot - snapshotSlot.full;
        if (fullAge > maxAge) {
          alerts.push({
            type: 'full',
            message: `Full snapshot is ${fullAge} slots old`,
            currentSlot,
            snapshotSlot: snapshotSlot.full,
            age: fullAge
          });
        }
      }
      
      if (snapshotSlot.incremental !== null) {
        const incrementalAge = currentSlot - snapshotSlot.incremental;
        if (incrementalAge > maxAge) {
          alerts.push({
            type: 'incremental',
            message: `Incremental snapshot is ${incrementalAge} slots old`,
            currentSlot,
            snapshotSlot: snapshotSlot.incremental,
            age: incrementalAge
          });
        }
      }
      
      return alerts;
    }
    
  3. 快照验证
    async function verifySnapshotAvailability() {
      const snapshotSlot = await connection.getHighestSnapshotSlot();
      const currentSlot = await connection.getSlot();
      
      if (snapshotSlot.full === 0) {
        throw new Error('No full snapshots available');
      }
      
      const fullAge = currentSlot - snapshotSlot.full;
      if (fullAge > 100000) { // Alert if snapshot is more than 100k slots old
        console.warn(`Full snapshot is ${fullAge} slots old`);
      }
      
      if (snapshotSlot.incremental === null) {
        console.warn('No incremental snapshots available');
      } else {
        const incrementalAge = currentSlot - snapshotSlot.incremental;
        if (incrementalAge > 10000) { // Alert if incremental snapshot is more than 10k slots old
          console.warn(`Incremental snapshot is ${incrementalAge} slots old`);
        }
      }
      
      return {
        fullSnapshot: snapshotSlot.full,
        incrementalSnapshot: snapshotSlot.incremental,
        currentSlot,
        fullAge,
        incrementalAge: snapshotSlot.incremental ? currentSlot - snapshotSlot.incremental : null
      };
    }