eth_getLogs blok aralığı sınırı ve parçalı sorgular

logs_range_too_large için zincirin max_logs_block_range değerini okuyun, dahil edici blok aralığını bu sınır içinde bölün ve yalnızca geçerli parça başarılı olduktan sonra ilerleyin.

Doğrudan yanıt

Tek bir eth_getLogs isteği, GET /v1/chains uç noktasından alınan hedef zincirin max_logs_block_range değeriyle (HyperEVM için, 1,000 blok) sınırlıdır ve toBlock − fromBlock + 1 blok olarak sayılır. Bu sınırın aşılması durumunda HTTP 200, JSON-RPC -32602 ve retryable: false ile error.data.reason: logs_range_too_large döndürülür (bkz. hata kataloğu). Aralığı [from, min(from + max − 1, end)] olarak bölün ve başarıdan sonra önceki parçanın sonuna bir ekleyerek ilerleyin.

  • İlk adım: curl -s "https://api.blockvectra.com/v1/chains" komutunu çalıştırın ve hedef zincirin max_logs_block_range, methods.allow ve methods.deny alanlarını okuyun.
  • Tamamlanma kriteri: logs-minimal.mjs, seçtiğiniz TO_BLOCK değerine kadar tamamlanan her parçanın fromBlock, toBlock ve result dizisini bir HTTP veya JSON-RPC hatası olmadan çıktı olarak verir.

Zincir parametreleri ve erişim seçenekleri.

Bunu logs-minimal.mjs olarak kaydedin, BLOCKVECTRA_API_KEY, sözleşme adresi LOG_ADDRESS ve FROM_BLOCK ile TO_BLOCK içinde onaylanmış bir blok penceresi ayarlayın, ardından Node.js 24 veya üzeri ile node logs-minimal.mjs komutunu çalıştırın. CHAIN ile bir zincir seçin; varsayılan robinhood_mainnet'tir.

const { BLOCKVECTRA_API_KEY: key, LOG_ADDRESS: address, FROM_BLOCK, TO_BLOCK } = process.env;
if (!key || !/^0x[0-9a-f]{40}$/i.test(address ?? '')) throw new Error('Set BLOCKVECTRA_API_KEY and LOG_ADDRESS');
if (![FROM_BLOCK, TO_BLOCK].every(value => /^(0x[0-9a-f]+|[0-9]+)$/i.test(value ?? ''))) {
  throw new Error('Set FROM_BLOCK and TO_BLOCK to nonnegative block numbers');
}
const start = BigInt(FROM_BLOCK), end = BigInt(TO_BLOCK);
if (start > end) throw new Error('FROM_BLOCK must not exceed TO_BLOCK');
const chainSlug = process.env.CHAIN ?? 'robinhood_mainnet';
const chainsUrl = 'https://api.blockvectra.com/v1/chains';
const catalogResponse = await fetch(chainsUrl, { signal: AbortSignal.timeout(15_000) });
if (!catalogResponse.ok) throw new Error(`Chains HTTP ${catalogResponse.status}`);
const catalog = await catalogResponse.json();
const chain = catalog.chains.find(item => item.chain === chainSlug);
if (!chain || !Number.isSafeInteger(chain.max_logs_block_range) || chain.max_logs_block_range <= 0) {
  throw new Error('Missing or invalid max_logs_block_range');
}
const matches = pattern => pattern.endsWith('*') ? 'eth_getLogs'.startsWith(pattern.slice(0, -1)) : pattern === 'eth_getLogs';
if (!chain.methods?.allow?.some(matches) || chain.methods?.deny?.some(matches)) {
  throw new Error('eth_getLogs is unavailable on this chain');
}
const max = BigInt(chain.max_logs_block_range);
const rpcUrl = new URL(`./${chainSlug}`, chainsUrl).href;
const hex = value => `0x${value.toString(16)}`;
for (let from = start; from <= end;) {
  const to = from + max - 1n < end ? from + max - 1n : end;
  const response = await fetch(rpcUrl, {
    method: 'POST', redirect: 'error', signal: AbortSignal.timeout(15_000),
    headers: { 'Content-Type': 'application/json', 'x-api-key': key },
    body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'eth_getLogs',
      params: [{ address, fromBlock: hex(from), toBlock: hex(to) }] }),
  });
  const body = await response.json();
  if (!response.ok || body.error || !Array.isArray(body.result)) {
    throw new Error(`RPC HTTP ${response.status}: ${JSON.stringify(body.error ?? 'Invalid result')}`);
  }
  console.log(JSON.stringify({ fromBlock: hex(from), toBlock: hex(to), result: body.result }));
  from = to + 1n;
}

Her çıktı satırı tamamlanmış bir parçadır. Herhangi bir HTTP veya JSON-RPC hatası, başarısız olan parçayı atlamadan örneği durdurur. 429'u ele almak için aşağıdaki toplu işlem ve hız sınırı rehberine bakın.

eth_getLogs blok aralığı sınırları

JSON-RPC eth_getLogs yöntemi çağrıldığında, tek bir isteğin blok aralığı toBlock − fromBlock + 1 olarak hesaplanır ve hedef zincirin yayınlanan max_logs_block_range değerini aşamaz.

Bu sınır zincire göre değişir. Zincir başına parametreler GET /v1/chains genel uç noktası aracılığıyla yayınlanır (zincirler Desteklenen Zincirler sayfasında listelenmiştir). Bu uç nokta kimlik doğrulamasızdır ve faturalandırılmaz. İstemci uygulamaları geliştirirken, kodunuza blok aralığı sınırlarını sabit kodlamak yerine çalışma zamanında bu uç noktayı dinamik olarak sorgulayın.

fromBlock ve toBlock filtre alanları atlandığında veya null olduğunda varsayılan olarak latest değerini alır.

Zincire göre eth_getLogs sınırları

Bunlar, GET /v1/chains tarafından yayınlanan her bir zincirin max_logs_block_range değerleridir. "Yayınlanmadı", sınırsız anlamına gelmez. Çağırmadan önce methods.allow ve methods.deny alanlarını da kontrol edin (deny önceliklidir); bir blok aralığı sınırı, sonuç sayısı veya sorgu süresi sınırlarından ayrıdır.

ZincirZincir slugmax_logs_block_range (blok)
Arbitrum Onearb_mainnet1,000
Basebase_mainnet1,000
BNB Smart Chainbsc_mainnet1,000
Ethereumeth_mainnet1,000
Ethereum Sepoliaeth_sepolia1,000
HyperEVMhyperevm_mainnet1,000
Polygonpolygon_mainnet1,000
Robinhood Chainrobinhood_mainnet1,000
Robinhood Chain Testnetrobinhood_testnet1,000

Yaygın hata mesajları, harfi harfine

Blok aralığını, sonuç sayısını ve sorgu süresini ayırt edin: aynı JSON-RPC kodu farklı hataları tanımlayabilir.

Hata metni / tanımlayıcısıKaynakNe yapılmalı
eth_getLogs block range too large: max <N> blocks; -32602; logs_range_too_largeBlockVectra hata kataloğu<N> zincirin max_logs_block_range değeridir; yeniden göndermeden önce aralığı azaltın. Değiştirmeden yeniden denemek işe yaramaz.
query block range exceeds server limit, narrow your filter: <N>Erigon eth_getLogs kaynağı<N> o düğümün aralık sınırıdır; yeniden göndermeden önce sorgulanan aralığı daraltın.
query returns too many logs, narrow your filter: <N>Erigon eth_getLogs kaynağı<N> o düğümün sonuç sınırıdır; aralığı azaltın ve address ile topics filtrelerini daraltın. Tek bir blok bile daha spesifik filtrelere ihtiyaç duyabilir.

Bu mesaj şablonlarında <N>, uç noktanın sınırıyla değiştirilir. Üçüncü taraf mesajları kendi uç noktalarına ve sınırlarına atıfta bulunur; ifade istemci sürümüne göre değişebilir. BlockVectra için /v1/chains ve error.data.reason kullanın.

Blok aralığı sınırını aşma

Tek bir isteğin blok aralığı olan toBlock − fromBlock + 1, zincirin max_logs_block_range değerini aştığında, istek HTTP 200 ve bir JSON-RPC hatası ile reddedilir:

  • Hata kodu: -32602
  • Hata mesajı: eth_getLogs block range too large: max <N> blocks
  • Faturalandırma durumu: Faturalandırılmaz.

Örnek istek

Bu istek, yalnızca blok aralığı hedef zincirin mevcut max_logs_block_range değerinden daha büyükse sınırı aşar:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_getLogs",
  "params": [
    {
      "fromBlock": "0x45a2409",
      "toBlock": "0x45a27f1"
    }
  ]
}

Örnek yanıt

İlgili hata yanıtı örneği:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "eth_getLogs block range too large: max <N> blocks"
  }
}

<N>, hedef zincirin max_logs_block_range değeridir (GET /v1/chains aracılığıyla yayınlanır).

Birden fazla çağrı içeren bir toplu istekte, bir eth_getLogs çağrısı blok aralığı sınırını aşarsa, ilgili öğe yukarıdaki -32602 hatasını döndürür ve faturalandırılmaz.

Parçalı sorguları gerçekleştirme

Geniş bir blok aralığında logları sorgulamak için önce hedef zincirin max_logs_block_range değerini sorgulayın, hedef aralığı ardışık [from, from + max - 1] parçalarına bölün ve sonuçları toplarken sıralı istekler gönderin.

Aşağıdaki örnekler, parçalı sorguları göstermek için robinhood_mainnet kullanır:

export BLOCKVECTRA_API_KEY="rgw_your_api_key"

# 1. Read max_logs_block_range from the public chains endpoint (unauthenticated, unbilled)
curl -s "https://api.blockvectra.com/v1/chains"

# 2. Make a single compliant request within the chain's max_logs_block_range (toBlock - fromBlock + 1)
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H 'Content-Type: application/json' \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_getLogs",
    "params": [{
      "address": "0x1111111111111111111111111111111111111111",
      "fromBlock": "0x45a2409",
      "toBlock": "0x45a246c"
    }]
  }'

Toplu işlem isteklerinde dikkat edilmesi gerekenler

Tek bir JSON-RPC toplu isteğine birden fazla parçalı sorgu paketlemeyi düşünüyorsanız, toplu işlem ve burst kapasitesi kurallarını aklınızda bulundurun:

  • Toplu işlem boyutu sınırı: Toplu istekler 1 ila 100 çağrı kabul eder. 100'den fazla çağrı göndermek HTTP 200 ve -32600 batch too large: max 100 calls hata koduyla reddedilir (faturalandırılmaz).
  • Tek istek burst kapasitesi: Tek bir istekteki çağrıların toplam CU ağırlığı anahtarın burst kapasitesini (burst_cu) aşarsa, istek HTTP 429 -32022 request cost <N> CU exceeds burst capacity <M> CU ile reddedilir (faturalandırılmaz); bunu daha küçük partilere bölün.
  • Yetersiz kova kapasitesi: Tam ağırlıkların toplamı burst kapasitesini aşmıyor ancak token kovasında (token bucket) yeterli kullanılabilir kapasite yoksa, hizmet HTTP 429 ile birlikte -32005 rate limit exceeded hata kodu ve Retry-After döndürür; yeniden deneme ve faturalandırma ayrıntıları için Neler faturalandırılmaz: hata kodları ve faturalandırma kuralları sayfasına bakın.

Bu nedenle, büyük ölçekli log sorguları gerçekleştirirken sıralı parçalı sorgular önerilir; toplu işlem yapılıyorsa, tam ağırlıkların toplamı burst kapasitesi dahilinde kalacak şekilde parti başına çağrı sayısını yeterince küçük tutun.

İlgili rehberler ve faturalandırma kuralları

Sonraki adımlar

Son güncelleme:

Bu sayfada