Параметры
Этот метод не принимает никаких параметров.
Ответ
Наименьший слот, о котором у узла есть информация в его реестре
Примеры кода
Базовый запрос
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": "minimumLedgerSlot"
}'
Использование web3.js
import { Connection } from '@solana/web3.js';
const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');
// Get minimum ledger slot
const minSlot = await connection.minimumLedgerSlot();
console.log('Minimum ledger slot:', minSlot);
// Get minimum ledger slot with analysis
async function getMinimumLedgerSlotWithAnalysis() {
const minSlot = await connection.minimumLedgerSlot();
const currentSlot = await connection.getSlot();
return {
slots: {
minimum: minSlot,
current: currentSlot,
difference: currentSlot - minSlot
},
metadata: {
timestamp: Date.now()
}
};
}
Примечания
- Возвращает наименьший слот в реестре узла
- Ответ приходит немедленно, поскольку считывается из текущего состояния
- Минимальный слот может меняться по мере удаления данных реестра
- Слоты ниже этого значения недоступны
- Значение может различаться между узлами в зависимости от их конфигурации
Лучшие практики
- Используйте этот метод для определения границ реестра
- Кэшируйте результаты при необходимости для снижения нагрузки на RPC
- Следите за изменениями минимального слота
- Рассмотрите использование подписки через websocket для обновлений в реальном времени
- Обрабатывайте сетевые ошибки и повторяйте попытки при необходимости
Распространённые ошибки
| Код | Сообщение | Решение |
|---|
| -32601 | Method not found | Убедитесь, что вы подключены к узлу Solana RPC |
| -32603 | Internal error | Узел может выполнять начальную загрузку или синхронизацию |
Примеры использования
-
Анализ реестра
interface LedgerAnalysis {
slots: {
minimum: number;
current: number;
difference: number;
};
metrics: {
pruningRate: number;
retentionPeriod: number;
};
metadata: {
timestamp: number;
};
}
class LedgerAnalyzer {
private readonly slotsPerSecond = 2; // Solana's target slots per second
async analyzeLedger(): Promise<LedgerAnalysis> {
const minSlot = await connection.minimumLedgerSlot();
const currentSlot = await connection.getSlot();
const difference = currentSlot - minSlot;
return {
slots: {
minimum: minSlot,
current: currentSlot,
difference
},
metrics: {
pruningRate: difference / this.slotsPerSecond, // seconds
retentionPeriod: difference / (this.slotsPerSecond * 3600) // hours
},
metadata: {
timestamp: Date.now()
}
};
}
}
-
Мониторинг реестра
interface LedgerStatus {
slots: {
minimum: number;
previous: number;
difference: number;
};
history: Array<{
timestamp: number;
minimum: number;
}>;
}
class LedgerMonitor {
private previousMinSlot: number | null = null;
private history: Array<{
timestamp: number;
minimum: number;
}> = [];
async monitorLedger(): Promise<LedgerStatus | null> {
const minSlot = await connection.minimumLedgerSlot();
const now = Date.now();
this.history.push({
timestamp: now,
minimum: minSlot
});
if (this.previousMinSlot === null) {
this.previousMinSlot = minSlot;
return null;
}
const status: LedgerStatus = {
slots: {
minimum: minSlot,
previous: this.previousMinSlot,
difference: minSlot - this.previousMinSlot
},
history: this.history
};
this.previousMinSlot = minSlot;
return status;
}
}
-
Планирование операций с реестром
interface LedgerPlan {
slots: {
minimum: number;
current: number;
difference: number;
};
recommendations: Array<{
type: 'fetch' | 'wait' | 'error';
reason: string;
}>;
metadata: {
timestamp: number;
};
}
class LedgerPlanner {
private readonly maxSlotRange = 1000000; // Maximum slots to search
async planLedgerOperation(
targetSlot: number
): Promise<LedgerPlan> {
const minSlot = await connection.minimumLedgerSlot();
const currentSlot = await connection.getSlot();
const now = Date.now();
const recommendations: Array<{
type: 'fetch' | 'wait' | 'error';
reason: string;
}> = [];
if (targetSlot < minSlot) {
recommendations.push({
type: 'error',
reason: `Target slot ${targetSlot} is below minimum ledger slot ${minSlot}`
});
} else if (targetSlot > currentSlot) {
recommendations.push({
type: 'wait',
reason: `Target slot ${targetSlot} has not been reached yet`
});
} else if (currentSlot - targetSlot > this.maxSlotRange) {
recommendations.push({
type: 'error',
reason: `Target slot ${targetSlot} is too far in the past`
});
} else {
recommendations.push({
type: 'fetch',
reason: 'Target slot is within valid range'
});
}
return {
slots: {
minimum: minSlot,
current: currentSlot,
difference: currentSlot - minSlot
},
recommendations,
metadata: {
timestamp: now
}
};
}
}