# Desteklenen Pencereler Dahilinde Geçmiş EVM Durumunu Sorgulama

> Source: https://docs.blockvectra.com/tr/guides/evm-historical-state/

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](https://api.blockvectra.com/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](https://api.blockvectra.com/v1/chains) ve [GET /v1/status](https://api.blockvectra.com/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](https://api.blockvectra.com/v1/chains) · Örnekleme Zamanı (UTC): 2026-10-09

[GET /v1/status](https://api.blockvectra.com/v1/status) · Örnekleme Zamanı (UTC): 2026-10-09

## 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:

```json
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "eth_call",
  "params": [
    { "to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "data": "0x313ce567" },
    "0x18efa2f"
  ]
}
```

Yanıt:

```json
{
  "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.

```js
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ı](https://docs.blockvectra.com/en/errors/#state_window) 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](https://docs.blockvectra.com/en/errors/#range_not_indexed) kapsanan bir aralık gerektirir; [history\_not\_ready](https://docs.blockvectra.com/en/errors/#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](https://docs.blockvectra.com/en/errors/). 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](https://docs.blockvectra.com/en/guides/choose-rpc-provider/) 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](https://docs.blockvectra.com/en/guides/infura-alternative/). Ö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ı](https://docs.blockvectra.com/en/guides/chainstack-alternative/), 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ı](https://docs.blockvectra.com/en/api/data/) 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ı](https://docs.blockvectra.com/en/api/json-rpc/methods/eth_call/).
* [Olay logu geçmişi için eth\_getLogs blok aralığı ve parçalı sorgular](https://docs.blockvectra.com/en/guides/getlogs-block-range/).
* [Cüzdan bağlantıları ve özel anahtarlar için özel cüzdan RPC kurulumu](https://docs.blockvectra.com/en/guides/wallet-custom-rpc/).
* [Ağ kullanılabilirliği için desteklenen zincirler](https://docs.blockvectra.com/en/chains/) ve [yöntem maliyetleri için CU fiyatlandırması](https://docs.blockvectra.com/en/guides/reading-cu-pricing/).
