Ana içeriğe atla
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.
Hatayı doğrudan sendTransaction çağrısından aldıysanız, sorgulanacak bir imza yoktur. İşlem gönderilmeden önce reddedildi. Göndermeden önce reddedildi bölümüne gidin. İmzaları koddan kontrol etmek için onay bekleme tarifini 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:
Ş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

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:
  • 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.
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:
meta.err bir simülasyon hatasıyla aynı yapıdadır, meta.logMessages ise program loglarını içerir. Bunları 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:
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:
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 ü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ı 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 üzerinden sorun.