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:
data.logsgenellikle neyin yanlış gittiğini açık bir dille söyler. Burada ödeyicinin 0.06 SOL’ü var ve 1,000 SOL göndermeye çalıştı.data.errhangi talimatın başarısız olduğunu söyler. Sıfırdan sayıldığı içinInstructionError: [0, ...]ilk talimattır.- Ö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 gelenCustom: 1baş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, yani0x1770değeri6000, bir Anchor programındaki ilk özel hatadır.
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: truegüncel bir blockhash koyar, böylece aynı işlemi blockhash’inin süresi dolduktan sonra da simüle etmeye devam edebilirsiniz.sigVerify: trueile birlikte kullanılamaz.sigVerify: falseimza kontrollerini atlar, böylece imzasız veya kısmen imzalı bir işlemi simüle edebilirsiniz.
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.
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: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.