Ana içeriğe geç

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

solidityakıllı sözleşmelergüvenlik
Orta düzey
Trailofbits
Güvenli sözleşmeler oluşturmak(opens in a new tab)
6 Eylül 2020
4 dakikalık okuma minute read

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

Tasarım rehberi

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

Belgeler ve özellikler

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 dahil şema ve yapısal diyagramlar. Slither yazıcıları(opens in a new tab), bu şemaların oluşturulmasına yardımcı olabilir.
  • Kod belgeleri ile Natspec formatı(opens in a new tab) Solidity için kullanılabilir.

Zincir üstü ve zincir dışı hesaplama

  • Zincir dışı bırakabileceğiniz kadar kod saklayın. 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 gönderimizde(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, kodumuzu nasıl yapılandırdığınızı etkileyecektir. Genel olarak, şunları öneririz:

  • Yükseltilebilirlik yerine sözleşme geçişini(opens in a new tab) tercih etme. Geçiş sistemi, dezavantajları olmaksızın yükseltilebilir sistemle aynı avantajların çoğuna sahiptir.
  • delegatecallproxy yerine veri ayrımı modelini kullanma. Projenizin net bir soyutlama ayrımı vardır, veri ayrımı 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 sağlamaya çalışın. Daima amacınıza uyan en basit çözümü kullanın. Ekibinizin herhangi bir üyesi çözümünüzü anlayabilmelidir.

Fonksiyon kompozisyonu

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.

  • Ya birden çok sözleşme aracılığıyla ya da benzer fonksiyonları aynı grupta toplayarak (örneğin kimlik doğrulama, aritmetik vb.) sisteminizin mantığını bölün.
  • Açık bir amaç ile küçük işlevler yazın. Bu, incelemeyi kolaylaştıracak ve ayrı bileşenlerin test edilmesini sağlayacaktır.

Kalıtım

  • Kalıtımı yönetilebilir seviyede 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 önemli işlemleri kaydedin. Olaylar, geliştirme sırasında sözleşmede hata ayıklamaya ve dağıtımdan sonra sözleşmeyi izlemeye yardımcı olur.

Bilinen hatalardan kaçının

Bağımlılıklar

  • İyi test edilmiş kütüphaneleri kullanın. İyi test edilmiş kütüphanelerden kod içe aktarmak, hatalı kod yazma olasılığınızı azaltır. Eğer 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 kaynak kullanıyorsanı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) özel kontrolleri ve özellikleri yazın. Otomatikleştirilmiş araçlar sözleşmenizin güvenli olduğundan emin olmaya 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 bütünleşir, özel Slither algılayıcılarına erişim sağlar ve Echidna'dan özel özellik kontrolleri ç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 dengeli 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 bildirilen herhangi bir sorun olup olmadığını kontrol edin. Bununla birlikte, Solidity'nin hızlı bir yayın döngüsü ve bir 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 derleme kullanmayın. Derleme, EVM uzmanlığı gerektirir. Sarı kağıtta ustalaş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. Kayıtları izleyin ve 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)'e ekleyin. Bu liste, bir güvenlik açığı tespit edilirse üçüncü tarafların sizinle iletişim kurmasına yardımcı olur.
  • Ayrıcalıklı kullanıcıların cüzdanlarını güvence altına alın. en iyi yönetim uygulamalarımızı(opens in a new tab) takip edin.
  • Olay planına bir karşılık geliştirin. Akıllı sözleşmelerinizin güvenliğinin ihlal edilebileceğini unutmayın. Sözleşmeleriniz hata içermese bile bir saldırgan, sözleşme sahibinin anahtarlarının kontrolünü ele geçirebilir.

Son düzenleme: @kaanmetu(opens in a new tab), 19 Ocak 2024

Bu rehber yararlı oldu mu?