# İşlem izleri (traces): debug_traceTransaction ve Data API trace uç noktaları

> Source: https://docs.blockvectra.com/tr/guides/transaction-traces/

## Bir çağrı ağacını yeniden yapılandırmanın iki yolu

Bir işlem izi (transaction trace), bir yürütmenin yeniden yapılandırılmış çağrı ağacıdır: hangi sözleşmenin hangi girdiyle çağrıldığı, ne kadar gas tükettiği ve hangi alt çağrıları yaptığı. BlockVectra bunu iki arayüz üzerinden sunar:

* **JSON-RPC `debug_trace` yöntemleri** (`debug_traceTransaction` gibi) — zincirin düğümüne karşı JSON-RPC uç noktası üzerinden çalışır, böylece düğümün hala sahip olduğu güncel durumu izleyebilirler.
* **Data API izleri** — `GET /{chain}/transactions/{hash}/trace` ve `GET /{chain}/blocks/{number}/traces`, REST üzerinden saklanan, indekslenmiş çağrı ağaçlarını döndürür.

Her ikisi de aynı API key'i kullanır ve yöntem ağırlığına göre CU cinsinden ölçülür (aşağıdaki ağırlıklara bakın). Hangisinin uygun olduğu; tek bir işleme mi yoksa bir bloğun tamamına mı ihtiyacınız olduğuna, hedefin ne kadar güncel olduğuna ve tam bir bloğu sayfalama olmadan taramak isteyip istemediğinize bağlıdır.

## debug\_trace yöntemleri için geçerli limitler

`debug_trace` istekleri yalnızca zincirin yöntem politikasının izin verdiği yöntemler ve tracer'lar için kabul edilir:

* **İzin verilen tracer'lar**: `tracer` parametresi yalnızca yerleşik yerel tracer'ları kabul eder — `callTracer`, `flatCallTracer`, `prestateTracer`, `4byteTracer`, `noopTracer` veya varsayılan yapı günlükleyicisini kullanmak için atlanabilir. Başka herhangi bir değer `-32602 tracer not allowed` JSON-RPC hatasıyla reddedilir (faturalandırılmaz).
* **Trace zaman aşımı**: `timeout` parametresi geçerli bir süre ve en fazla 30 saniye olmalıdır; aksi takdirde istek `-32602 trace timeout not allowed` ile reddedilir (faturalandırılmaz).
* **Düğüm eşitleme koruması**: Bir zincirin düğümü eşitlenmemişken, `eth_chainId` hariç her yöntem — `debug_trace` yöntemleri dahil — `-32010` döndürür (faturalandırılmaz).
* **Durum penceresi**: `debug_traceCall`, `debug_traceBlockByNumber`, `debug_traceTransaction` ve `debug_traceBlockByHash`, zincirin durum penceresi içinde olması gereken bir bloğu hedefler. Pencereden daha eski bir hedef veya `safe`, `finalized` ya da `earliest` etiketini kullanan bir hedef `-32011` döndürür (faturalandırılmaz).
* **Karma ve blok aramaları**: Hatalı biçimlendirilmiş veya bilinmeyen bir karma `-32000 transaction not found` / `block not found` döndürür; geçici bir arıza `-32603 upstream unavailable` döndürür (yeniden denenebilir). Faturalandırılmaz.
* **Zincir başına yöntem politikası**: Bir zincirin hangi `debug_trace` yöntemlerine izin verdiği, genel `GET /v1/chains` yanıtı tarafından yayınlanır. Bir yöntem listesini koda sabitlemek yerine çalışma zamanında okuyun; zincirler [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/) sayfasında listelenmiştir ve yöntem referansı [JSON-RPC yöntemleri](https://docs.blockvectra.com/tr/api/json-rpc/methods/) sayfasındadır.

### callTracer ile debug\_traceTransaction isteme

Aşağıdaki çağrı, bir çağrı ağacı istemek için `tracer` parametresini ekler:

**cURL**

```bash
export BLOCKVECTRA_API_KEY=rgw_your_api_key

# Add "tracer" to request a call tree with one of the allowed native tracers.
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": "debug_traceTransaction",
    "params": [
      "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
      { "tracer": "callTracer" }
    ]
  }'
```


  **TypeScript**

```ts
const RPC_ENDPOINT = "https://api.blockvectra.com/v1/robinhood_mainnet";

const res = await fetch(RPC_ENDPOINT, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": process.env.BLOCKVECTRA_API_KEY!,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "debug_traceTransaction",
    params: [
      "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
      { tracer: "callTracer" },
    ],
  }),
});

const body = (await res.json()) as {
  result?: unknown;
  error?: { code: number; message: string };
};

if (body.error) {
  throw new Error(`debug_traceTransaction error ${body.error.code}: ${body.error.message}`);
}
console.log(body.result);

// npx tsx example.mts
```


  **Python**

```python
import os
import requests

RPC_ENDPOINT = "https://api.blockvectra.com/v1/robinhood_mainnet"

res = requests.post(
    RPC_ENDPOINT,
    headers={
        "Content-Type": "application/json",
        "x-api-key": os.environ["BLOCKVECTRA_API_KEY"],
    },
    json={
        "jsonrpc": "2.0",
        "id": 1,
        "method": "debug_traceTransaction",
        "params": [
            "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
            {"tracer": "callTracer"},
        ],
    },
)
res.raise_for_status()
body = res.json()

if "error" in body:
    err = body["error"]
    raise RuntimeError(f"debug_traceTransaction error {err.get('code')}: {err.get('message')}")
print(body["result"])
```


## Data API trace uç noktalarının sağladıkları

Data API, iki kapsam için saklanan çağrı ağaçlarını döndürür. Hiçbiri sayfalanmaz: `next_cursor` hiçbir zaman mevcut değildir.

* `GET /{chain}/transactions/{hash}/trace` — işlem karmasına göre aranan tek bir işlemin çağrı çerçevesi.
* `GET /{chain}/blocks/{number}/traces` — bir bloktaki işlem başına bir çağrı ağacı, `tx_index` sırasına göre. İşlem içermeyen bir blok `data: []` döndürür.

Yanıt zarfı şöyledir:

* `TxTraceEnvelope`: `data` doğrudan bir `CallFrame` ve buna ek olarak `meta` içerir.
* `BlockTracesEnvelope`: `data`, her biri `txHash` ve `result` `CallFrame` içeren bir `BlockTraceItem` dizisi ve buna ek olarak `meta` içerir.

Her iki trace uç noktası da standart Ethereum `callTracer` biçimini döndürür. Bu, Data API'nin parasal güvenlik kodlamasının bir istisnasıdır: başka yerlerde `2^53` değerini aşabilecek bir değer ondalık dize olarak serileştirilir; bu iki uç noktada `value`, `gas` ve `gasUsed` ondalık dizeler değil, `0x` ön ekli onaltılık miktarlardır. Her `CallFrame`; `type`, `from`, `gas`, `gasUsed` ve `input` taşır; `type`, `CALL`, `DELEGATECALL`, `STATICCALL`, `CREATE`, `CREATE2` veya `SELFDESTRUCT` değerlerinden biridir. Bir `CREATE`/`CREATE2` çerçevesinin hedefi için `to` yoktur ve bir `STATICCALL` çerçevesi için `value` yoktur. İsteğe bağlı üyeler `output` (çağrı veri döndürmediğinde yoktur), `error` (başarılı olduğunda yoktur), `revertReason` (yalnızca bir `Error(string)` revert durumunda bulunur) ve `calls` (çağrı sırasına göre iç içe geçmiş alt çağrılar) şeklindedir. Çerçevenin ek üyeleri korunur.

Şekli somutlaştırmak için `CallFrame` alan iskeleti aşağıda verilmiştir:

```jsonc
{
  "type": "CALL | DELEGATECALL | STATICCALL | CREATE | CREATE2 | SELFDESTRUCT",
  "from": "0x…",                      // 20-byte address
  "to": "0x…",                        // absent for a CREATE/CREATE2 target
  "value": "0x…",                     // 0x-prefixed hex quantity; absent for STATICCALL
  "gas": "0x…",                       // 0x-prefixed hex quantity
  "gasUsed": "0x…",                   // 0x-prefixed hex quantity
  "input": "0x…",
  "output": "0x…",                    // absent when the call returned no data
  "error": "…",                       // absent on success
  "revertReason": "…",                // absent unless the call reverted with Error(string)
  "calls": []                         // nested sub-calls in call order; absent for a leaf frame
}
```

### Parametreler

* `{chain}` (yol parametresi, zorunlu): zincir tanımlayıcısı, `GET /chains` içindeki bir kaydın `chain` değeri. Eşleştirme tamdır ve büyük/küçük harfe duyarlıdır; takma adlar ve sayısal zincir kimlikleri kabul edilmez.
* `{hash}` (yol parametresi, işlem izi için zorunlu): 32 baytlık işlem karması, `0x` ön eki isteğe bağlıdır, her iki basamak harf durumu da kabul edilir.
* `{number}` (yol parametresi, blok izleri için zorunlu): negatif olmayan blok yüksekliği.

### Kapsam ve kesinlik

* Her iki uç nokta da `traces` yeteneğine aittir. Bu yeteneğe sahip olmayan bir zincir `422 no_coverage` döndürür. Bu veri kümesini sağlayan zincirler [Desteklenen Zincirler](https://docs.blockvectra.com/tr/chains/) sayfasına ve veri kümesi dizinine tabidir.
* Trace verileri, bir zincirin indekslenmiş geçmişinin geri kalanından daha sonra başlayabilir. `GET /chains`, bu sınırı `coverage.traces_from_block` olarak bildirir; bundan önceki veya izlenemeyen bir aralıktaki bir istek `422 no_coverage` döndürür.
* İşlem izleri için: karma bulunamazsa `404 not_found` döndürür (yeni gönderilen veya çıkarılan bir işlem için bunu kalıcı olarak değerlendirmeden önce birkaç saniye sonra yeniden deneyin); karma `as_of_block` değerinden daha yüksek bir bloğa çözümlenirse bunun yerine `409 not_indexed_yet` döndürür.
* Blok izleri uç noktası bir blok numarası alır. `as_of_block` üzerindeki bir `{number}`, `indexed_through` ile `409 not_indexed_yet` döndürür; `as_of_block` hizasındaki veya altındaki bir `{number}` hemen sunulur.
* İşlemleri olan ancak henüz trace verisi olmayan yeni bir blok, `Retry-After` başlığıyla birlikte `503 unavailable` döndürür.

### Data API'den bir trace isteme

**cURL**

```bash
export BLOCKVECTRA_API_KEY=rgw_your_api_key

# One transaction's call frame.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/transactions/0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd/trace" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"

# One call tree per transaction in a block.
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/79900000/traces" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const hash = "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd";

const txRes = await fetch(
  `https://api.blockvectra.com/v1/data/robinhood_mainnet/transactions/${hash}/trace`,
  { headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! } },
);
const txBody = await txRes.json();
console.log(txBody.data, txBody.meta);

const blockRes = await fetch("https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/79900000/traces", {
  headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
});
const blockBody = await blockRes.json();
console.log(blockBody.data.map((item: { txHash: string }) => item.txHash));

// npx tsx example.mts
```


  **Python**

```python
import os
import requests

hash_ = "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
headers = {"x-api-key": os.environ["BLOCKVECTRA_API_KEY"]}

tx = requests.get(
    f"https://api.blockvectra.com/v1/data/robinhood_mainnet/transactions/{hash_}/trace",
    headers=headers,
)
tx.raise_for_status()
tx_body = tx.json()
print(tx_body["data"], tx_body["meta"])

block = requests.get(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/blocks/79900000/traces",
    headers=headers,
)
block.raise_for_status()
block_body = block.json()
print([item["txHash"] for item in block_body["data"]])
```


## Hangisi kullanılmalı

| Tipik görev                                                                    | Daha uygun olan                          | Nedeni                                                                                                                 |
| ------------------------------------------------------------------------------ | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Gerçekleştikten hemen sonra tek bir işlemi yeniden yapılandırma                | `debug_traceTransaction`                 | Düğümün mevcut durumuna karşı çalışır; kullanılabilirlik zincirin yöntem politikasını takip eder.                      |
| Tek bir işlemin saklanan çağrı ağacını okuma                                   | `GET /{chain}/transactions/{hash}/trace` | İşlemin `CallFrame` değerini REST üzerinden doğrudan döndürür; `as_of_block` seviyesine kadar sunulur.                 |
| Bir bloktaki her çağrı ağacını tek bir istekte okuma                           | `GET /{chain}/blocks/{number}/traces`    | Tüm bloğu sayfalanmamış olarak, `tx_index` sırasına göre döndürür; `as_of_block` seviyesine kadar sunulur.             |
| Düğümün hala sahip olduğu ancak veri kümesinin henüz saklamadığı durumu izleme | `debug_trace` yöntemleri                 | Data API, saklanan verileri `as_of_block` seviyesine kadar sunar; düğüm henüz yazılmamış bloklar için yanıt verebilir. |

## Çağrı başına CU

Her yöntem kendi CU ağırlığına göre faturalandırılır. Aşağıdaki ağırlıklar platform planları API'sinden okunur:

**Çağrı başına CU ağırlığı**

| Yöntem | Çağrı başına CU |
| --- | --- |
| `debug_traceBlockByHash` | 100 |
| `debug_traceBlockByNumber` | 100 |
| `debug_traceCall` | 100 |
| `debug_traceTransaction` | 100 |
| `trace_block` | 100 |
| `trace_call` | 100 |
| `trace_get` | 100 |
| `trace_replayTransaction` | 100 |
| `trace_transaction` | 100 |
| `data.block_traces` | 200 |
| `data.transaction_trace` | 200 |

Reddedilen istekler faturalandırılmaz. Faturalandırma kurallarının tamamı için [Neler faturalandırılmaz: hata kodları ve faturalandırma kuralları](https://docs.blockvectra.com/tr/guides/billing-rules/) sayfasına bakın.

## Sonraki adımlar

* Hesabınızın neleri içerdiğini kontrol etmek için [ücretsiz planı ve fiyatlandırmayı inceleyin](https://blockvectra.com/tr/pricing/#free).
* Bir API key oluşturmak için [konsolda oturum açın](https://console.blockvectra.com/login/?next=%2Fkeys%2F).
