Desteklenen Pencereler Dahilinde Geçmiş EVM Durumunu Sorgulama
Kimlik doğrulamalı durum pencerelerini, anahtarsız geçmişi ve log aralıklarını ayırt edin. eth_call için sabit bir blok seçin ve state_window hatalarını teşhis edin.
Geçmiş eth_call, zincirin eth_getLogs blok aralığı sınırına değil, durum penceresine bağlıdır. Daha önceki bir sözleşme değerini okumadan önce durum penceresini, uç noktanın kimlik doğrulama modunu ve hedef bloğu kontrol edin.
Üç farklı geçmiş sınırı
| GET /v1/chains içindeki alan | Neyi denetler | Neyi kontrol etmeli |
|---|---|---|
state_window_blocks | eth_call, eth_getBalance, eth_getCode ve eth_getStorageAt gibi kimlik doğrulamalı durum okumalarının ne kadar geriye sorgulama yapabileceği | Tepe blok H ve bildirilen pencere W olduğunda, H − W değerinden daha eski numaralandırılmış bir blok pencerenin dışındadır. methods.allow ve methods.deny alanlarını da kontrol edin. |
public.history_blocks | Anahtarsız public.url üzerinden geçmiş blok başvuruları | Yalnızca public.methods kullanın. Durum okumaları için, genel geçmiş ile bildirilen durum penceresinden daha küçük olanı geçerlidir. |
max_logs_block_range | Tek bir kimlik doğrulamalı eth_getLogs isteğindeki blok sayısı | toBlock − fromBlock + 1 olarak hesaplayın. İzin verilen bir aralık, eski sözleşme durumunun veya logların mevcut olduğunu kanıtlamaz. |
Bu sınırlar gün cinsinden değil, blok cinsindendir. null veya bildirilmemiş bir durum penceresi arşiv kapsamı sağlamaz. Anahtarsız yöntem kullanılabilirliği, kimlik doğrulamalı yöntem kullanılabilirliğinden ayrıdır: yalnızca bir log aralığı genel eth_getLogs çağrısını etkinleştirmez.
Zincir başına durum pencerelerini karşılaştırın
Tablo, genel anlık görüntüden yayınlanan durum pencerelerini, anahtarsız geçmişi, log aralıklarını ve bildirilen Data API veri setlerini gösterir. Şu anki bir istek için GET /v1/chains ve GET /v1/status uç noktalarını tekrar okuyun.
Geliştiriciler ve AI Agent'lar durum pencerelerini ve log sorgu aralıklarını ayrı ayrı kontrol etmelidir. Null bir durum penceresi arşiv kapsamı sağlamaz. Genel geçmiş yalnızca bildirilen genel metotlar için geçerlidir.
| Zincir | Zincir slug | Kimlik doğrulamalı durum penceresi: state_window_blocks (blok) | Anahtarsız geçmiş: public.history_blocks (blok) | Kimlik doğrulamalı log sorgu aralığı: max_logs_block_range (blok) | Bildirilen Data API veri setleri |
|---|---|---|---|---|---|
| Arbitrum One | arb_mainnet | 6,000 | 1,000 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| Base | base_mainnet | 10,000 | 1,000 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| BNB Smart Chain | bsc_mainnet | 100 | 100 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| Ethereum | eth_mainnet | 250,000 | 1,000 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| Ethereum Sepolia | eth_sepolia | Bildirilmedi | 1,000 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| HyperEVM | hyperevm_mainnet | Bildirilmedi | 1,000 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, balances, holders, nfts, freshness |
| Polygon | polygon_mainnet | 126 | 126 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, freshness |
| Robinhood Chain | robinhood_mainnet | 900 | 900 | 1,000 | blocks, transactions, address_transactions, transfers, token_metadata, balances, holders, nfts, dex_swaps, dex_prices, stocks, traces, freshness |
| Robinhood Chain Testnet | robinhood_testnet | 1,023 | 1,000 | 1,000 | Data API kullanılamıyor |
GET /v1/chains · Örnekleme Zamanı (UTC):
GET /v1/status · Örnekleme Zamanı (UTC):
Bir blok etiketi seçin
Mevcut değer için latest kullanın. Geçmiş bir karşılaştırma için eth_blockNumber'ı bir kez okuyun ve seçilen blok numarasını 0x18efa2f gibi onaltılık bir miktara dönüştürün. Karşılaştırmadaki her çağrı için bu numarayı sabit tutun; tekrarlanan latest çağrıları farklı blokları kullanabilir.
Durum okumaları için earliest, safe ve finalized, durum penceresi ilkesi kapsamında -32011 döndürür. Bunun yerine bildirilen pencere içinde açık bir blok numarası seçin. Blok karması biçimi ek geçmiş elde etmenin bir yolu değildir: anahtarsız durum okumaları bunu reddeder ve kimlik doğrulamalı bir istek yine de mevcut duruma bağlıdır.
Bir blok numarası yeniden düzenlemeden sonra farklı bir bloğa atıfta bulunabilir. Sonucun bloğunu tanımlamanız gerekiyorsa eth_getBlockByNumber ile blok karmasını kaydedin. Pencere içi bir numara için ayrıca senkronize edilmiş bir zincir ve o yükseklikte mevcut bir sözleşme gerekir.
Sabit bloklu sözleşme okuma
Ethereum'da, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 adresindeki WETH, 0x313ce567 seçicisiyle decimals() işlevini sunar. 2026-10-08 (UTC) tarihinde 0x18efa2f bloğunda örneklenen anahtarsız bir çağrı, şu sonuçla HTTP 200 döndürdü:
Zincirin public.url adresine istek:
{
"jsonrpc": "2.0",
"id": 2,
"method": "eth_call",
"params": [
{ "to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "data": "0x313ce567" },
"0x18efa2f"
]
}Yanıt:
{
"jsonrpc": "2.0",
"id": 2,
"result": "0x0000000000000000000000000000000000000000000000000000000000000012"
}ABI ile kodlanmış tamsayı 18'dir. Sonuç bir bakiye değil ondalık basamak değeridir ve diğer yüksekliklerde kullanılabilirliği kanıtlamaz. Bu sabit blok, sınırlı bir pencerenin dışına çıkacaktır; aşağıdaki örneği daha sonra çalıştırırken yakın tarihli bir blok kullanın.
Örneği historical-state.mjs olarak kaydedin ve Node.js 24 veya üzeri ile BLOCKVECTRA_API_KEY ortam değişkeniniz ayarlanmış olarak node historical-state.mjs komutunu çalıştırın. Kimlik doğrulamalı uç noktayı kullanır, aynı sözleşmeyi ve calldata'yı korur ve latest, yakın tarihli sabit bir blok ve yayınlanan kimlik doğrulamalı pencerenin dışındaki bir bloğu karşılaştırır. Her çıktı gerçek HTTP durumunu ve JSON-RPC gövdesini içerir; HTTP 200 yine de bir hata içerebilir. Beklenmeyen bir yanıtı başarılı bir okuma olarak değerlendirmek yerine işlemi durdurur.
const key = process.env.BLOCKVECTRA_API_KEY;
if (!key) throw new Error('Set BLOCKVECTRA_API_KEY');
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 === 'eth_mainnet');
const matches = (method, pattern) => pattern.endsWith('*')
? method.startsWith(pattern.slice(0, -1)) : method === pattern;
if (!chain?.jsonrpc || !['eth_call', 'eth_blockNumber'].every(method =>
chain.methods?.allow?.some(pattern => matches(method, pattern)) &&
!chain.methods?.deny?.some(pattern => matches(method, pattern)))) {
throw new Error('Required methods are unavailable');
}
const window = chain.state_window_blocks;
if (!Number.isSafeInteger(window) || window < 10) {
throw new Error('This example needs a declared state window of at least 10 blocks');
}
const rpcUrl = new URL('./eth_mainnet', chainsUrl).href;
let id = 0;
async function rpc(method, params) {
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: ++id, method, params }),
});
return { http: response.status, body: await response.json() };
}
const headResponse = await rpc('eth_blockNumber', []);
if (headResponse.http !== 200 || headResponse.body.error ||
!/^0x[0-9a-f]+$/i.test(headResponse.body.result ?? '')) {
throw new Error(`Cannot read head: ${JSON.stringify(headResponse)}`);
}
const head = BigInt(headResponse.body.result);
if (head <= BigInt(window)) throw new Error('Head is too low for an out-of-window block');
const hex = value => `0x${value.toString(16)}`;
const fixedBlock = hex(head - 10n);
const outsideBlock = hex(head - BigInt(window) - 1n);
const call = { to: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', data: '0x313ce567' };
for (const block of ['latest', fixedBlock, outsideBlock]) {
const reply = await rpc('eth_call', [call, block]);
console.log(JSON.stringify({ head: hex(head), block, ...reply }));
if (block === outsideBlock) {
if (reply.http !== 200 || reply.body.error?.code !== -32011 ||
reply.body.error?.data?.reason !== 'state_window') {
throw new Error('Expected state_window; inspect the actual response above');
}
} else if (reply.http !== 200 || reply.body.error ||
reply.body.result !== '0x0000000000000000000000000000000000000000000000000000000000000012') {
throw new Error('Expected the WETH decimals result; inspect the actual response above');
}
}Yukarıda kaydedilen yanıt public.url kullanır; betik ise bir API key kullanır. Anahtarsız bir okuma gerçekleştirmek için URL'yi doğrudan public.url alanından alın, anahtarı atlayın ve durum penceresinin yanı sıra public.history_blocks dahilinde bir blok seçin. Kimlik doğrulamasını değiştirmek, aynı sözleşme ve calldata için bile izin verilen geçmişi değiştirebilir.
Pencere dışı hatayı teşhis etme
Aynı anahtarsız uç noktada, 2026-10-08 (UTC) tarihinde yalnızca hedef bloğu 0x18ef650 (ve istek kimliğini) olarak değiştirerek örneklenen bir çağrı, error.code: -32011, error.data.reason: state_window ve error.data.retryable: false ile HTTP 200 döndürdü. Mesajı block reference is outside the public history window şeklindeydi. Bu genel geçmiş kaynaklı bir hatadır; kimlik doğrulamalı uç noktanın kendi durum penceresi vardır.
Mesajdaki belirli bir pencere numarasına güvenmek yerine arızayı tanımak için state_window hata kaydı içindeki şu alanları kullanın:
| Alan | Belgelenen değer veya anlamı |
|---|---|
| HTTP durumu | 200; HTTP başarılı olduğunda bile JSON-RPC error nesnesini inceleyin |
error.code | -32011 |
error.message | Kimlik doğrulamalı durum penceresi hataları en son desteklenen blok sayısını açıklar; genel geçmiş hataları farklı bir mesaj kullanabilir |
error.data.reason | state_window |
error.data.docs_url | Hata kataloğunun state_window açıklamasına bağlantı |
error.data.retryable | false: aynı isteği daha sonra göndermek eski durumu geri getirmez |
Görev geçerli değere ihtiyaç duyuyorsa daha yeni numaralandırılmış bir blok seçin veya latest kullanın. Bir eth_getLogs aralığını azaltmak geçmiş eth_call durumunu kurtarmaz. Diğer -32011 nedenleri farklı eylemlere sahiptir: range_not_indexed kapsanan bir aralık gerektirir; history_not_ready indeksleme yakalandıktan sonra yeniden denemeye izin verir. Yalnızca sayısal kodu değil, error.data.reason alanını inceleyin.
Temeldeki durum -32000 ile veya budanmış blok geçmişi 4444 ile de kullanılamayabilir; bkz. hata kataloğu. Eski bir bloğu değiştirmeden yeniden denemeyin veya bildirilen daha büyük bir pencerenin her yanıtı garanti ettiğini varsaymayın.
Sonraki sorguyu seçin
Eksiksiz bir iş yükü kontrol listesi ve kendi kendine testler için Bir RPC sağlayıcısı nasıl seçilir ile başlayın.
Tekrarlanan sözleşme okumaları için bir sağlayıcı seçerken, EVM okumaları için günlük ve döngü bütçelerini karşılaştırın. Önce gereken geçmiş blokları kontrol edin, ardından görevin günlük dağılımını ve aktarım hızını planlayın; bir kredi bütçesine sığmak durum kapsamını sağlamaz.
Geçmiş okumalar için sağlayıcıları karşılaştırırken, öncelikle her ikisinin de hedef bloğa hizmet verebildiğini doğrulayın. Tam istek aşım karşılaştırması, ekstra RU fiyatlarını yöntem tabanlı maliyetlerle karşılaştırır, dahil edilen kotayı ekstra kullanımdan ayırır ve tam ile arşiv faturalandırma sınıflarını açıklar.
Daha önceki indekslenmiş bloklar, işlemler, transferler veya diğer veri setleri için tablonun bildirilen Data API veri setlerini ve Data API referansını kontrol edin. İndekslenmiş kayıtlar keyfi geçmiş sözleşme yürütmesi sağlamaz veya her zincirin geçmiş bakiyelere sahip olduğu anlamına gelmez.
- Çağrı parametreleri ve dönüş kodlaması için eth_call yöntem referansı.
- Olay logu geçmişi için eth_getLogs blok aralığı ve parçalı sorgular.
- Cüzdan bağlantıları ve özel anahtarlar için özel cüzdan RPC kurulumu.
- Ağ kullanılabilirliği için desteklenen zincirler ve yöntem maliyetleri için CU fiyatlandırması.
Son güncelleme:
DEX günlük fiyatları
Data API'den günlük DEX OHLC fiyatlarını ve VWAP değerini sorgulayın, TypeScript ve Python'da kesin rasyonel kesirleri işleyin ve geçmiş verileri verimli şekilde geriye dönük doldurun.
Ücretsiz plan
Gerçek yöntem ağırlıklarına göre Ücretsiz Planın neleri kapsadığını, görev bazlı hesaplamalar ve yükseltme yollarıyla anlayın.