Параметры
Этот метод не принимает никаких параметров.
Ответ
Слот наименьшего доступного подтверждённого блока
Примеры кода
Базовый запрос
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": "getFirstAvailableBlock"
}'
Использование web3.js
import { Connection } from '@solana/web3.js';
const connection = new Connection('https://fra.rpc.orbitflare.com?api_key=YOUR-API-KEY');
// Get first available block
const firstBlock = await connection.getFirstAvailableBlock();
console.log('First available block:', firstBlock);
// Get block range
async function getAvailableBlockRange() {
const firstBlock = await connection.getFirstAvailableBlock();
const currentSlot = await connection.getSlot();
return {
firstBlock,
currentSlot,
totalBlocks: currentSlot - firstBlock + 1
};
}
Примечания
- Возвращает слот наименьшего доступного подтверждённого блока
- Полезен для определения доступной истории узла
- Значение может меняться по мере того, как узел удаляет старые блоки
- Разные узлы могут возвращать разные значения
- Ответ приходит немедленно, поскольку считывается из текущего состояния
Лучшие практики
- Используйте этот метод для определения доступного диапазона блоков
- Учитывайте удаление данных узлом при запросе исторических блоков
- Кэшируйте результаты при необходимости для снижения нагрузки на RPC
- Обрабатывайте случаи, когда запрашиваемые блоки недоступны
- Используйте совместно с другими методами для работы с блоками
Распространённые ошибки
| Код | Сообщение | Решение |
|---|
| -32601 | Method not found | Убедитесь, что вы подключены к узлу Solana RPC |
| -32007 | Block information unavailable | Узел может выполнять начальную загрузку или синхронизацию |
Примеры использования
-
Проверка диапазона блоков
async function verifyBlockRange(startSlot: number, endSlot: number) {
const firstBlock = await connection.getFirstAvailableBlock();
const currentSlot = await connection.getSlot();
if (startSlot < firstBlock) {
throw new Error(`Start slot ${startSlot} is before first available block ${firstBlock}`);
}
if (endSlot > currentSlot) {
throw new Error(`End slot ${endSlot} is after current slot ${currentSlot}`);
}
return {
startSlot,
endSlot,
available: true
};
}
-
Доступность исторических данных
interface BlockAvailability {
firstAvailable: number;
currentSlot: number;
availableRange: number;
requestedSlot: number;
isAvailable: boolean;
}
async function checkBlockAvailability(slot: number): Promise<BlockAvailability> {
const firstBlock = await connection.getFirstAvailableBlock();
const currentSlot = await connection.getSlot();
return {
firstAvailable: firstBlock,
currentSlot,
availableRange: currentSlot - firstBlock + 1,
requestedSlot: slot,
isAvailable: slot >= firstBlock && slot <= currentSlot
};
}
-
Анализ истории блоков
async function analyzeBlockHistory() {
const firstBlock = await connection.getFirstAvailableBlock();
const currentSlot = await connection.getSlot();
const blocks = await connection.getBlocks(firstBlock, currentSlot);
const metrics = {
firstBlock,
currentSlot,
totalSlots: currentSlot - firstBlock + 1,
availableBlocks: blocks.length,
missingBlocks: (currentSlot - firstBlock + 1) - blocks.length,
availabilityPercentage: (blocks.length / (currentSlot - firstBlock + 1)) * 100
};
return metrics;
}