Ana içeriğe geç

Akıllı sözleşme güvenlik yönergeleri

solidity
akıllı kontratlar
güvenlik
Orta düzey
Trailofbits
6 Eylül 2020
4 dakikalık okuma

Daha güvenli akıllı sözleşmeler oluşturmak için bu üst düzey önerileri izleyin.

Tasarım yönergeleri

Herhangi bir kod satırı yazmadan önce sözleşmenin tasarımı önceden tartışılmalıdır.

Dokümantasyon ve spesifikasyonlar

Belgeler farklı seviyelerde yazılabilir ve sözleşmeler uygulanırken güncellenmelidir:

  • Sözleşmelerin ne yaptığını ve kod tabanındaki varsayımları açıklayan, sistemin sade bir İngilizce açıklaması.
  • Sözleşme etkileşimleri ve sistemin durum makinesi de dâhil olmak üzere şema ve mimari diyagramlar. Slither yazıcıları (opens in a new tab) bu şemaların oluşturulmasına yardımcı olabilir.
  • Kapsamlı kod dokümantasyonu, Solidity için Natspec formatı (opens in a new tab) kullanılabilir.

Zincir üstü ve zincir dışı hesaplama

  • Olabildiğince çok kodu zincir dışında tutun. Zincir üstü katmanı küçük tutun. Verileri zincir dışı kodla, zincir üstünde doğrulamanın basit olacağı şekilde ön işleme tabi tutun. Sıralı bir listeye mi ihtiyacınız var? Listeyi zincir dışı sıralayın, ardından yalnızca zincirdeki sırasını kontrol edin.

Yükseltilebilirlik

Blog yazımızda (opens in a new tab) farklı yükseltilebilirlik çözümlerini tartıştık. Herhangi bir kod yazmadan önce yükseltilebilirliği desteklemek için bilinçli bir seçim yapın. Karar, kodunuzu nasıl yapılandırdığınızı etkileyecektir. Genel olarak, şunları öneririz:

  • Sözleşme geçişini (opens in a new tab) yükseltilebilirliğe tercih etmek. Geçiş sistemleri, yükseltilebilir olanlarla aynı avantajların çoğuna, dezavantajları olmaksızın sahiptir.
  • delegatecallproxy yerine veri ayırma modelini kullanmak. Projenizin net bir soyutlama ayrımı varsa, veri ayırma kullanılarak yükseltilebilirlik yalnızca birkaç ayarlama gerektirecektir. Delegecallproxy, EVM uzmanlığı gerektirir ve yüksek oranda hataya açıktır.
  • Dağıtımdan önce taşıma/yükseltme prosedürünü belgeleyin. Herhangi bir yönerge olmadan stres altında tepki vermeniz gerekiyorsa hata yaparsınız. İzlenecek prosedürü önceden yazın. Şunları içermeli:
    • Yeni sözleşmeleri başlatan çağrılar
    • Anahtarlar nerede saklanır ve bunlara nasıl erişilir
    • Dağıtımın nasıl kontrol edileceği! Bir dağıtım sonrası komut dosyası geliştirin ve test edin.

Uygulama yönergeleri

Sadelik için çabalayın. Daima amacınıza uyan en basit çözümü kullanın. Ekibinizin herhangi bir üyesi çözümünüzü anlayabilmelidir.

Fonksiyon bileşimi

Kod tabanınızın mimarisi, kodunuzun gözden geçirilmesini kolaylaştırmalıdır. Doğruluğu hakkında mantık kurma yeteneğini azaltan mimari seçimlerden kaçının.

  • Sisteminizin mantığını, ya birden çok sözleşme aracılığıyla ya da benzer fonksiyonları (örneğin; kimlik doğrulama, aritmetik...) bir araya getirerek bölün.
  • Açık bir amaca sahip küçük fonksiyonlar yazın. Bu, daha kolay gözden geçirmeyi kolaylaştıracak ve bireysel bileşenlerin test edilmesine olanak tanıyacaktır.

Kalıtım

  • Kalıtımı yönetilebilir tutun. Mantığı bölmek için kalıtım kullanılmalıdır, ancak projeniz kalıtım ağacının derinliğini ve genişliğini en aza indirmeyi hedeflemelidir.
  • Sözleşmelerin hiyerarşisini kontrol etmek için Slither'ın kalıtım yazıcısını (opens in a new tab) kullanın. Kalıtım yazıcısı, hiyerarşinin boyutunu gözden geçirmenize yardımcı olur.

Olaylar

  • Tüm kritik işlemleri günlüğe kaydedin. Olaylar, geliştirme sırasında sözleşmede hata ayıklamaya ve dağıtım sonrasında onu izlemeye yardımcı olacaktır.

Bilinen tuzaklardan kaçının

Bağımlılıklar

  • İyi test edilmiş kütüphaneler kullanın. İyi test edilmiş kütüphanelerden kod içe aktarmak, hatalı kod yazma olasılığınızı azaltır. Bir ERC20 sözleşmesi yazmak istiyorsanız, OpenZeppelin (opens in a new tab) kullanın.
  • Bir bağımlılık yöneticisi kullanın; kodu kopyalayıp yapıştırmaktan kaçının. Harici bir kaynağa güveniyorsanız, onu orijinal kaynakla güncel tutmalısınız.

Test ve doğrulama

  • Kapsamlı birim testleri yazın. Yüksek kaliteli yazılım oluşturmak için kapsamlı bir test paketi çok önemlidir.
  • Slither (opens in a new tab), Echidna (opens in a new tab) ve Manticore (opens in a new tab) için özel denetimler ve özellikler yazın. Otomatikleştirilmiş araçlar, sözleşmenizin güvenli olmasını sağlamaya yardımcı olacaktır. Etkili kontrollerin ve özelliklerin nasıl yazılacağını öğrenmek için bu kılavuzun geri kalanını gözden geçirin.
  • crytic.io (opens in a new tab) kullanın. Crytic, GitHub ile entegre olur, özel Slither dedektörlerine erişim sağlar ve Echidna'dan özel özellik denetimleri çalıştırır.

Solidity

  • 0.4 ve 0.6 yerine Solidity 0.5'i tercih edin. Bize göre Solidity 0.5, 0.4'ten daha güvenli ve daha iyi yerleşik uygulamalara sahip. Solidity 0.6'nın üretim için fazla dengesiz olduğu tespit edildi ve olgunlaşması için zamana ihtiyacı var.
  • Derlemek için kararlı bir sürüm kullanın; uyarıları kontrol etmek için en son sürümü kullanın. Kodunuzun en son derleyici sürümüyle ilgili bildirilmiş bir sorunu olmadığını kontrol edin. Ancak Solidity'nin hızlı bir sürüm döngüsü ve derleyici hataları geçmişi vardır, bu nedenle dağıtım için en son sürümü önermiyoruz (bkz. Slither'ın solc sürüm önerisi (opens in a new tab)).
  • Satır içi assembly kullanmayın. Assembly, EVM uzmanlığı gerektirir. Yellow Paper'da uzmanlaşmadıysanız EVM kodu yazmayın.

Dağıtım yönergeleri

Sözleşme geliştirilip dağıtıldıktan sonra:

  • Sözleşmelerinizi izleyin. Günlükleri izleyin ve bir sözleşme veya cüzdan güvenliğinin ihlal edilmesi durumunda tepki vermeye hazır olun.
  • İletişim bilgilerinizi blockchain-security-contacts (opens in a new tab) listesine ekleyin. Bu liste, bir güvenlik açığı keşfedildiğinde üçüncü tarafların sizinle iletişime geçmesine yardımcı olur.
  • Ayrıcalıklı kullanıcıların cüzdanlarını güvenceye alın. Anahtarları donanım cüzdanlarında saklıyorsanız, en iyi uygulamalarımızı (opens in a new tab) takip edin.
  • Bir olaya müdahale planınız olsun. Akıllı sözleşmelerinizin güvenliğinin ihlal edilebileceğini göz önünde bulundurun. Sözleşmeleriniz hata içermese bile bir saldırgan, sözleşme sahibinin anahtarlarının kontrolünü ele geçirebilir.

Sayfanın son güncellenmesi: 30 Eylül 2025

Bu rehber yararlı oldu mu?