> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# İşlem Hata Ayıklama

> Bir Solana işleminin neden başarısız olduğunu, gönderilmeden önce reddedildiğini veya hiç zincire girmediğini bulun: simülasyon hatalarını ve program loglarını okuma, blockhash süresinin dolması, kodlama hataları ve öncelik ücretleri.

Bir işlem üç sonuçtan birine varır ve her biri farklı bir çözüm gerektirir. Herhangi bir şeyi değiştirmeden önce hangisi olduğunu bulun.

## Adım 1: ne olduğunu öğrenin

Kümeye imzayı sorun. `searchTransactionHistory`, sorgunun her yaştaki işlem için çalışmasını sağlar.

```bash theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
curl -s https://fra.rpc.orbitflare.com \
  -H "x-api-key: $ORBITFLARE_LICENSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["SIGNATURE"],{"searchTransactionHistory":true}]}'
```

| Sonuç | Anlamı | Bakılacak yer |
| - | - | - |
| `"confirmationStatus": "confirmed"` veya `"finalized"` ile birlikte `"err": null` | Zincire girdi ve başarılı oldu | Ayıklanacak bir şey yok. Sonuç yine de yanlışsa, talimatlar beklediğinizden farklı bir şey yapmıştır |
| `"err": { ... }` | Zincire girdi ve **başarısız oldu**. Ücret alındı ve başka hiçbir şey değişmedi | [Zincire girdi ama başarısız oldu](#zincire-girdi-ama-başarısız-oldu) |
| `null` | Küme bu işlemi hiç görmedi | [Hiç zincire girmedi](#hiç-zincire-girmedi) |

Hatayı doğrudan `sendTransaction` çağrısından aldıysanız, sorgulanacak bir imza yoktur. İşlem gönderilmeden önce reddedildi. [Göndermeden önce reddedildi](#göndermeden-önce-reddedildi) bölümüne gidin.

İmzaları koddan kontrol etmek için [onay bekleme tarifini](/tr/recipes#bir-işlemin-onaylanmasını-bekleyin) kullanın.

## Göndermeden önce reddedildi

`sendTransaction` varsayılan olarak işlemi önce simüle eder ve simülasyon başarısız olursa göndermeyi reddeder. Nedeni ve program loglarıyla birlikte `-32002` hatası alırsınız:

```json theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
{
  "code": -32002,
  "message": "Transaction simulation failed: Error processing Instruction 0: custom program error: 0x1",
  "data": {
    "err": { "InstructionError": [0, { "Custom": 1 }] },
    "logs": [
      "Program 11111111111111111111111111111111 invoke [1]",
      "Transfer: insufficient lamports 60773561, need 1000000000000",
      "Program 11111111111111111111111111111111 failed: custom program error: 0x1"
    ],
    "unitsConsumed": 150
  }
}
```

Şu sırayla okuyun:

1. **`data.logs`** genellikle neyin yanlış gittiğini açık bir dille söyler. Burada ödeyicinin 0.06 SOL'ü var ve 1,000 SOL göndermeye çalıştı.
2. **`data.err`** hangi talimatın başarısız olduğunu söyler. Sıfırdan sayıldığı için `InstructionError: [0, ...]` ilk talimattır.
3. **Özel hata kodu** Solana'ya değil, başarısız olan programa aittir. System Program'dan gelen `Custom: 1` "yetersiz bakiye" anlamına gelir, ancak başka bir programdan gelen `Custom: 1` başka bir şey ifade eder. Numarayı o programın hata listesinde (IDL'sinde veya kaynak kodunda) arayın. Mesaj bunu onaltılık gösterir, yani `0x1770` değeri `6000`, bir Anchor programındaki ilk özel hatadır.

Reddedilmenin bir maliyeti yoktur. İşlem RPC düğümünden hiç çıkmadı.

### Yaygın reddetmeler

| Hata | Neden | Çözüm |
| - | - | - |
| `Transaction simulation failed: Blockhash not found` | Blockhash'in süresi dolmuş, başka bir kümeye ait ya da uydurulmuş | İmzalamadan hemen önce `getLatestBlockhash` ile yenisini alın |
| `Transaction simulation failed: Attempt to debit an account but found no record of a prior credit` | Ücret ödeyici bu kümede hiç SOL tutmadı | Ücret ödeyiciye bakiye yükleyin. Devnet'te, devnet bakiyesi olmayan bir mainnet cüzdanı kullanmadığınızı kontrol edin |
| System Program'dan `custom program error: 0x1` | Transfer ve ücretler için yeterli lamport yok | İşlemin oluşturduğu hesapların kirası dahil bakiyeyi kontrol edin |
| `exceeded CUs meter at BPF instruction` | Compute unit limiti çok düşük | Simüle edin, `unitsConsumed` değerini okuyun ve limiti bunun yaklaşık %10 üzerine ayarlayın |
| `invalid base58 encoding: InvalidCharacter` | base64 baytları kodlamayı belirtmeden gönderdiniz. `sendTransaction` base58 varsayar | İkinci parametre olarak `{"encoding": "base64"}` gönderin |
| `failed to deserialize ... VersionedTransaction: io error: failed to fill whole buffer` | Baytlar eksiksiz bir işlem değil: kesilmiş, iki kez kodlanmış veya imzasız | İmzalı işlemi bir kez serileştirin ve bir kez kodlayın |

## simulateTransaction ile hata ayıklama

Hiçbir şey göndermeden logları görmek istediğinizde simüle edin. Hata ayıklarken iki seçenek bunu çok daha kullanışlı hale getirir:

```bash theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
curl -s https://fra.rpc.orbitflare.com \
  -H "x-api-key: $ORBITFLARE_LICENSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"simulateTransaction","params":["BASE64_TX",{"encoding":"base64","replaceRecentBlockhash":true,"sigVerify":false}]}'
```

* **`replaceRecentBlockhash: true`** güncel bir blockhash koyar, böylece aynı işlemi blockhash'inin süresi dolduktan sonra da simüle etmeye devam edebilirsiniz. `sigVerify: true` ile birlikte kullanılamaz.
* **`sigVerify: false`** imza kontrollerini atlar, böylece imzasız veya kısmen imzalı bir işlemi simüle edebilirsiniz.

Sonuç, simülasyon başarılı olduğunda bile `err`, `logs` ve `unitsConsumed` içerir. Doğru bir compute unit limiti ayarlamak için `unitsConsumed` kullanın: sıkı bir limit, birim başına ödediğiniz öncelik ücretinin daha etkili olmasını sağlar.

> [!WARNING]
>
> Hata ayıklarken `skipPreflight: true` kullanmayın. İşlemi simüle etmeden gönderir; böylece bozuk bir işlem zincire girer, başarısız olur ve ücret alınır, hata da ancak daha sonra `getSignatureStatuses` içinde görünür. İşlemin çalıştığı bilindiğinde ve hıza ihtiyacınız olduğunda açın.

## Zincire girdi ama başarısız oldu

İşlem zincirde, ücret ödendi ve değişikliklerinin hiçbiri uygulanmadı. Kaydın tamamını alın:

```bash theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
curl -s https://fra.rpc.orbitflare.com \
  -H "x-api-key: $ORBITFLARE_LICENSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["SIGNATURE",{"encoding":"json","maxSupportedTransactionVersion":1}]}'
```

`meta.err` bir simülasyon hatasıyla aynı yapıdadır, `meta.logMessages` ise program loglarını içerir. Bunları [Göndermeden önce reddedildi](#göndermeden-önce-reddedildi) bölümünde anlatıldığı gibi okuyun.

Sorunsuz simüle edilen bir işlem, arada durum değiştiği için zincirde yine de başarısız olabilir. Olağan nedenler bir swap'taki slippage, başka birinin kapattığı veya değiştirdiği bir hesap ya da zaten kullanılmış bir nonce'tur. Doğrulamak için güncel duruma karşı yeniden simüle edin, ardından tolerans ekleyin: daha geniş slippage, yeni bir fiyat teklifi veya işlemi yeniden oluşturan bir yeniden deneme.

## Hiç zincire girmedi

`getSignatureStatuses` `null` döndürür: işlem RPC düğümü tarafından kabul edildi ama hiçbir lider onu bloğa almadı. Hiçbir ücret alınmadı.

### Blockhash'in süresi doldu

Bir işlem, blockhash'inden sonra yalnızca **150 blok** boyunca geçerlidir. Slotlar yaklaşık 215 ms sürdüğüne göre bu kabaca 30 ila 35 saniyedir. Bu süre geçtikten sonra işlem asla zincire giremez, bu yüzden beklemeyi bırakın ve işlemi yeniden oluşturun.

Bir blockhash'in hâlâ kullanılabilir olup olmadığını kontrol edin:

```bash theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
curl -s https://fra.rpc.orbitflare.com \
  -H "x-api-key: $ORBITFLARE_LICENSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"isBlockhashValid","params":["BLOCKHASH",{"commitment":"processed"}]}'
```

`getLatestBlockhash` çağrısının blockhash ile birlikte döndürdüğü `lastValidBlockHeight` değerini kaydedin. Bunu `getBlockHeight` ile karşılaştırın: blok yüksekliği daha düşük olduğu sürece aynı imzalı işlemi yeniden göndermeye devam edin. Daha yüksek olduğunda işlem artık geçersizdir.

### Öncelik ücreti çok düşüktü

Bloklar yoğun olduğunda liderler onları compute unit başına en çok ödeyen işlemlerle doldurur. Dokunduğunuz hesaplar için son zamanlarda nelerin zincire girdiğini kontrol edin:

```bash theme={"theme":{"light":"github-light","dark":"github-dark-default"}}
curl -s https://fra.rpc.orbitflare.com \
  -H "x-api-key: $ORBITFLARE_LICENSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"getRecentPrioritizationFees","params":[["ACCOUNT_YOUR_TX_WRITES"]]}'
```

Son sonuçlardan bir değer seçin, `SetComputeUnitPrice` ile ayarlayın ve simülasyondan elde ettiğiniz doğru bir `SetComputeUnitLimit` ile eşleştirin.

### Yolda düşürüldü

Gönderilen bir işlem, özellikle yoğunluk sırasında RPC düğümü ile lider arasında kaybolabilir. Aynı imzalı baytları, işlem onaylanana veya blockhash'in süresi dolana kadar birkaç saniyede bir yeniden gönderin. Yeniden göndermek güvenlidir: aynı imza yalnızca bir kez zincire girebilir.

Hızlı zincire girmenin önemli olduğu işlemler için [Apex](/tr/apex/overview) üzerinden gönderin. Apex her işlemi aynı anda birkaç yoldan yaklaşan liderlere gönderir ve işlem zincire girene veya süresi dolana kadar yeniden denemeye devam eder. Kendi hataları [Apex hataları ve hız sınırları](/tr/apex/errors-and-rate-limits) sayfasında listelenir.

## Hâlâ çözemediyseniz

İmzayı (hiç imza almadıysa base64 işlemi), `data.logs` dahil hatanın tamamını, gönderdiğiniz bölgeyi ve preflight'ın açık olup olmadığını toplayın. Ardından [Discord](https://discord.gg/orbitflare) üzerinden sorun.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.