Перейти к основному содержанию

Параметры

Этот метод не принимает никаких параметров.

Ответ

result
number
Наименьший слот, о котором у узла есть информация в его реестре

Примеры кода

Базовый запрос

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()
    }
  };
}

Примечания

  1. Возвращает наименьший слот в реестре узла
  2. Ответ приходит немедленно, поскольку считывается из текущего состояния
  3. Минимальный слот может меняться по мере удаления данных реестра
  4. Слоты ниже этого значения недоступны
  5. Значение может различаться между узлами в зависимости от их конфигурации

Лучшие практики

  1. Используйте этот метод для определения границ реестра
  2. Кэшируйте результаты при необходимости для снижения нагрузки на RPC
  3. Следите за изменениями минимального слота
  4. Рассмотрите использование подписки через websocket для обновлений в реальном времени
  5. Обрабатывайте сетевые ошибки и повторяйте попытки при необходимости

Распространённые ошибки

КодСообщениеРешение
-32601Method not foundУбедитесь, что вы подключены к узлу Solana RPC
-32603Internal errorУзел может выполнять начальную загрузку или синхронизацию

Примеры использования

  1. Анализ реестра
    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()
          }
        };
      }
    }
    
  2. Мониторинг реестра
    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;
      }
    }
    
  3. Планирование операций с реестром
    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
          }
        };
      }
    }