Web geliştirmede hata yaparsınız, fark edersiniz, düzeltirsiniz, dağıtırsınız. On dakika sürer.
Akıllı kontratta böyle bir şey yok. Zincire yayınladığınız kod oradadır ve değişmez. Hatanız da öyle.
Fark neden bu kadar büyük?
Değişmezlik. Kontrat yayınlandıktan sonra kodunu değiştiremezsiniz. Proxy desenleriyle güncellenebilir kontratlar yazılabilir ama bu da kendi risklerini getirir ve çoğu proje bunu baştan planlamaz.
Kod açıktır. Kontratınızın kodu herkese görünür. Saldırgan sizin kodunuzu satır satır inceleyerek zafiyet arar. Normal bir web uygulamasında sunucu kodunuzu göremez.
Doğrudan para. Hata bir arayüz sorunu değil, doğrudan fon kaybıdır. Blockchain'de geri alma yoktur; banka arayıp "iptal edin" diyemezsiniz.
En sık görülen hata sınıfları
Yeniden giriş (reentrancy): kontrat dışarıya para gönderirken alıcı kontrat aynı fonksiyonu tekrar çağırır ve bakiye güncellenmeden ikinci kez çeker. DAO saldırısının temeli buydu ve benzerleri hâlâ görülüyor.
Yetki kontrolü eksikliği: kritik bir fonksiyona sadece sahibin erişmesi gerekirken kontrol unutulur.
Fiyat oracle manipülasyonu, ön koşma (front-running), yanlış erişim belirteçleri...
Denetim maliyet değil, sigortadır
Ciddi bir denetim (audit) birkaç bin dolardan başlar ve pahalı görünür. Ama kontratınızda fon tutuyorsanız, karşılaştırma denetim ile geliştirme maliyeti arasında değil — denetim maliyeti ile kontratın tutacağı toplam para arasındadır.
Biz bu işin neresindeyiz?
Dürüst olalım: bugüne kadar üretime akıllı kontrat yazmadık. Web3 tarafında yaptığımız iş cüzdan entegrasyonu, dApp arayüzleri, kripto proje siteleri ve DeFi görev platformları — yani kontratın üstündeki katman.
Bunu neden yazdık? Çünkü arayüz yazarken kontratı okumak zorundasınız. Hangi fonksiyon ne yapıyor, hangi çağrı ne kadar gaz yakıyor, kullanıcı hangi adımda onay verecek — bunları bilmeden düzgün bir dApp arayüzü çıkmaz.
Kontrat tarafında iş yapacaksanız tavsiyemiz net: fon tutan bir kontratı denetimsiz yayınlamayın. "Biz dikkatli yazdık" yeterli bir güvence değil — DAO'yu yazanlar da dikkatliydi.