参数
此方法不接受任何参数。响应
代码示例
基本请求
复制
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
};
}
注意事项
- 返回最高快照 slot 的信息
- 完整快照包含完整的账本状态
- 增量快照包含自上次完整快照以来的更改
- 增量快照可能在所有节点上不可用
- 响应是即时的,因为它从当前状态读取
最佳实践
- 使用此方法确定快照可用性
- 规划操作时考虑快照年龄
- 在适当时缓存结果以减少 RPC 负载
- 处理增量快照不可用的情况
- 结合其他快照方法使用
常见错误
| 错误码 | 消息 | 解决方案 |
|---|---|---|
| -32601 | Method not found | 验证是否连接到 Solana RPC 节点 |
| -32007 | Snapshot information unavailable | 节点可能正在启动或同步中 |
用例
-
快照分析
复制
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 }; } -
快照监控
复制
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; } -
快照验证
复制
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 }; }