# **Bölüm 6 - SMART CONTRACT (Akıllı Sözleşme Güvenliği - Part 1) - Ethereum**
Bu yazı Smart Contract - Ethereum notlarının 6. bölümüdür. Temel Smart Contract bilgisi için veya neler olup bittiğini merak ediyorsanız önceki bölümleri bir göz atın. [Bölüm 5](https://hackmd.io/@yigitraphy/S16BV6loA)
# Akıllı Sözleşme Güvenliği
Akıllı sözleşmeler son derece esnektir ve blokzincirlere kod temelinde değiştirilemez mantık çalıştırırken büyük miktarlarda değer ve veriyi de kontrol etme özelliğine de sahiptir. Bu, güven gerektirmeyen ve merkeziyetsiz uygulamalar ekosistemi yaratmıştır ve bu uygulamalar geleneksel sistemlere oranla birçok avantaja sahiptir.
# Güvenli Ethereum Sözleşmeleri Oluşturma
## 1. Uygun Erişim Kontrollerini Tasarlayın
Akıllı sözleşmelerde, public veya external olarak işaretlenmiş olan fonksiyonlar herhangi bir harici olarak EOA'lar veya sözleşme hesabı tarafından çağrılabilir.
Akıllı sözleşme fonksiyonlarının izinsiz kullanımı engellemek için güvenli erişim kontrolleri uygulamak şarttır.
**Sahiplenebilir Desen ve Rol Tabanlı kontrol, akıllı sözleşmelerde erişim kontrolü uygulamaya yönelik iki kullanışlı desendir.**
### Sahiplenebilir Desen
Sahiplenebilir Desen'de, sözleşme oluşturma sürecinde bir adres sözleşmenin "sahibi" olarak ayarlanır. Korunan fonksiyonlara OnlyOwner niteliyicisi atanır; bu niteliyici, sözleşmenin fonksiyonu yürütmeden önce çağıran adresin kimliğini doğrulamasını sağlar. Korunan fonksiyonlara sözleşme sahibinin dışındaki diğer adreslerden yapılan çağrılar hep geri döndürülerek istenmeyen erişim engellenir.
#### Adımlar:
* **Sahip Belirleme:** Sözleşme oluşturulurken veya sonradan sahibini belirlemek için bir fonksiyon tanımlar. Bu fonksiyon, yalnızca sözleşmenin oluşturulduğu veya güncellendiği adres tarafından çağrılabilir. Bu adres, sözleşmenin sahibi olarak atanır.
* **OnlyOwner Niteliği:** Sözleşmede ki belirli fonksiyonlara yalnızca sahibin erişebilmesi için bir "OnlyOwner" niteliği tanımlanır. Bu nitelik, sözleşmenin sahibi olmayan adreslerin belirli fonksiyonları çağırmasını sağlar. Bu da sözleşmenin kritik fonksiyonlarının sadece sahibin kontrolünde olmasını sağlar.
* **OnlyOwner Doğrulaması:** OnlyOwner niteliği atanmış fonksiyonlar çağrıldığında öncelikle çağıran adresin sahip olup olmadığını kontrol eder. Eğer çağıran adres sahibi değilse, işlem geri çevrilir veya bir haya mesajı gönderilir.
### Rol Tabanlı Erişim
Bir akıllı sözleşmede tek bir adresi Owner olarak kaydetmek, merkezileşme riskini beraberinde getirir ve tek bir başarısızlık noktasını temsil eder. Sahibini hesap anahtarlarını açığa çıkarırsın, saldırganlar sahip olunan sözleşmeye saldırabilir.
Rol tabanlı erişim kontrolünde, hassas fonksiyonlara erişim bir grup güvenilir katılımcıya değıtır. Örnek olarak, bir hesap jeton basmaktan sorumlu olabilir, diğer hesapta yükseltmeler gerçekleştirir veya sözleşmeyi duraklatır.
Güvenli erişim kontrolü uygulamaya yönelik diğer bir yaklaşım ise sözleşmeyi yönetmek için ***çoklu imza hesap*** kullanmaktır. Çoklu İmzalı Hesaplar, sıradan bir EOA'nın aksine birden fazla varlığa aittir ve işlemleri yürütmek için belirlenen minimum sayıda hesaptan (örneğin 5 hesaptan 3'ü) imza alınmasını şart koşar.
## 2. Sözleşme Operasyonlarını Korumak için require(), assert() ve revert() ifadelerini kullanmak
Belirtildiği gibi, akıllı sözleşmenizdeki herkese açık fonksiyonları blokzincire dağıtıldıktan sonra herkes çağırabilir. Harici hesapların bir sözleşme ile nasıl etkileşime geçeceğini önceden bilemeyeceğiniz için dağıtmadan önce sorumlu işlemlere karşı dahili önlemleri uygulamaya koymak idealdir. Akıllı sözleşmelerde yürütmenin bazı gereklilikleri başarıyla karşılayamadığı durumlarda istisnaları tetiklemek ve durum değişkenlerini geri almak için doğru davranışları require(), assert(), revert() ifadelerini kullanarak uygulatabilirsiniz.
***require() :*** fonksiyonların başlangıcında tanımlanır ve önceden belirlenmiş koşulların çağrılan fonksiyon yürütülmeden önce karşılanmasını sağlar. **Bir *require* ifadesi, bir fonksiyona devam etmeden önce kullanıcı girdilerini doğrulamak, durum değişkenlerini kontrol etmek veya çağıran hesabın kimliğini doğrulamak için kullanılabilir.**
***assert() :*** **Dahili hataları tespit etmek ve kodunuzda "değişmez" ihalali olup olmadığını kontrol etmke için kullanılır.** Bir değişmez, bir sözleşmenin durumu ile ilgili olarak tüm fonksiyon yürütmeleri için doğru olması gereken mantıksal bir çıkarımdır. **assert() kullanmak sözleşmenin asla güvenlik açığı olan bir duruma gelmemesini ve gelirse de durum değişkenlerin de yapılan tüm değişikliklerin geri alınmasını sağlar.**
## 3. Akıllı Sözleşmeleri Test Edin ve Kod Doğruluğunu Onaylayın
EVM'de çalışan kodun değiştirilemez, akıllı sözleşmelerin geliştirme aşamasında daha yüksek seviyede bir kalite kontrol ihtiyaç duyulduğunu gösterir.
Sık kullanılan yöntem, sözleşmenin kullanıcılardan alması beklenen taklit verileri kullanarak küçük birim testleri yazmaktır. (izole şekilde yapıldığında) birim testi yapmak maalesef akıllı sözleşme güvenliğini geliştirmekte minimal seviyede etkilidir.
## 4. Akıllı Sözleşme Sırasında En İyi Uygulamalar
* Tüm kodu Git gibi bir sürüm denetim sisteminde depolamak.
* Tüm kod değişikliklerini çekme istekleri aracılığıyla yapmak.
* Çekme isteklerinin en az 1 denetçisi olabilir.
* Akıllı sözleşmeleri test etmek, derlemek ve dağıtmak için bir geliştirme ortamı kullanmak.
* Kodu Mythril ve Slither gibi temel kod analizi araçlarından geçirebilirsiniz. İdeal olarak, bu her çökme isteği birleştirmesinden önce yapılmalı ve çıktılarda ki farklar karşılaştırılmalıdır.
* Kodun hatasız bir şekilde derlendiğinden ve Solidity derleyicisinden herhangi bir uyarı vermediğinden emin olunmalı.
* Kodunuzu düzgün biçimde belgelendirmek ve sözleşme yapısı hakkındaki detayları anlaşılabilir bir dille açıklamak.
## 5. Güçlü Olağanüstü Durum Kurtarma Planları Uygulamak
Güvenli erişim kontrolleri tasarlamak, fonksiyon değiştiricileri uygulamak ve diğer öneriler, akıllı sözleşme güvenliğini arttırabilir ancak kötü niyetli saldırıların gerçekleşme ihtimalini sıfıra indirgeyemez. Güvenli akıllı sözleşmeler olışturmak, "başarısızlığa hazırlanmayı" ve saldırılara karşı etkili bir şekilde cevap vermek için bir geri dönüş planına sahip olmayı gerektirir.
Notların Devamı: [Bölüm 7 - SMART CONTRACT (Akıllı Sözleşme Güvenliği - Part 2)](https://hackmd.io/@yigitraphy/SkorgHz00)