# **Bölüm 7 - SMART CONTRACT (Akıllı Sözleşme Güvenliği - Part 2) - Ethereum**
Bu yazı Smart Contract - Ethereum notlarının 7. 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 6](https://hackmd.io/@yigitraphy/BkxxyIk2R)
## Acil Durdurmalar
Dağıtım sonrasında kodunuzda bir güvenlik açığı ortaya çıkarsa, sözleşme adresinde çalışan kod değiştirilemeyeceği için bu açığı kapatmak imkansızdır. Ayrıca yükseltme mekanizmaları (örneğin vekil desenleri) uygulamak zaman alabilir (genelde farklı taraflardan onay alınması gerekir), bu da saldırganlara daha fazla zarar vermek için daha fazla zaman tanır.
Nükleer seçenek ise bir sözleşmede güvenlik açığı bulunan fonksiyonlara gelecek çağrıları engelleyen bir "acil durdurma" fonksiyonunu uygulamaya koymaktır. Acil durdurmalar genelde şu bileşenlerden oluşur;
1. Akıllı sözleşmenin durdurulmuş bir durumda olup olmadığını gösteren global bir *Boole* değişkeni. Bu değişken, sözleşme oluşturulurken *false* olarak ayarlanmıştır ancak sözleşme durdurulduğunda *true* şekline döner.
2. Yürütülürken *Boole* değişkenine başvuran fonksiyonlar. Bu fonksiyonlar, akıllı sözleşme durdurulmamışsa erişilebilir durumdadır ve acil durdurma özelliği tetiklendiğinde erişilemez hale gelir.
3. Acil durdurma fonksiyonuna olan erişimi olan, Boole değişkenini *true* yapan varlık. Bu fonksiyona yapılan çağrılar, kötü niyetli eylemleri önlemek için güvenilir bir adres ile (örneğin sözleşme sahibi) sınırlandırılabilir.
Sözleşmenin acil durdurmayı etkinleştirmesinin ardından belirli fonksiyonlar çağrılabilir niteliğini kaybeder. Bu, seçili fonksiyonların global değişkene başvuran bir niteliyici ile paketlenmesi yoluyla gerçekleşir.
```
contract EmergencyStop {
bool isStopped = false;
modifier stoppedInEmergency {
require (!isStopped);
_;
}
modifier onlyAuthorized { // msg.sender yetkilendirilmesi buradan kontrol edilir
_;
}
function stopContract() public onlyAuthorized {
isStopped = true;
}
function resumeContract() public onlyAuthorized {
isStopped = false;
}
function deposit() public payable stoppedInEmergency { // burada para yatırma mantığı işliyor
}
function emergencyWithdraw() public onlyWhenStopped {
}
```
Bu örnek, acil durdurmaların temel özelliklerini göstermektedir.
* ***isStopped***, başlangıçta false olan ve sözleşme acil durum moduna geçtiğinde değişerek *true* olan bir *Boole* değerdir.
* ***onlyWhenStopped*** ve ***stoppedInEmergency*** fonksiyon niteliyicileri, *isStopped* değişkenini kontrol eder. *stoppedInEmergency*, sözleşmenin güvenlik açığı olduğunda (örneğin *deposit()*) erişilemez olması gereken fonksiyonları kontrol etmek için kullanılır. Basitçe, bu fonksiyonlara yapılan çağrılar döndürülür.
***onlyWhenStopped***, sadece bir acil durum esnasında çağrılabilir olması gereken fonksiyonlar (örneğin *emergencyWithDraw()*) için kullanılır. Bu tarz fonksiyonlar durumun çözüme kavuşturulmasına yardımcı olabilir ve bundan dolayı "*List of prohibited functions (yasaklı fonksiyonlar)*" listesinden çıkarılmıştır.
---
## Olay İzleme
Events(Olaylar), akıllı sözleşme fonlsiyonlarına yapılan çağrıları takip etmenize ve durum değişkenlerindeki değişiklikleri izlemenize olanak tanır. Akıllı sözleşmeyi, bir tarafın güvenlik açısından kritik bir eylem (örneğin fon çekme) gerçekleştirildiğinde bir event yayımlayacak şekilde programlamak ideal kabul edilir.
Events(Olayları) günlüğe kaydetmek ve bunları zincir dışında izlemek, sözleşme işlemleri hakkında bilgi sağlar ve kötü niyetli eylemlerin daha hızlı tespitine yardımcı olur. Bu, ekibin hızlı bir şekilde hacklere yanıt verebilmesi ve kullanıcıların üzerindeki etkiyi azaltmak için fonksiyonları duraklatmak veya yükseltme yapma gibi önlemler alabilmesi anlamına gelir.
Ayrıca, sözleşmelerle etkileşimde bulunduğunda otomatik olarak uyarıları ileten hazır bir izleme aracında tercih edilebilir.
## 6. Güvenli Yönetişim Sistemleri Tasarlamak
Zincir üstünde yönetişimle ilgili sorunları önlemenin bir yolu, bir zaman kilidi kullanmaktır. Zaman kilidi, bir akıllı sözleşmenin belirli bir süre geçene kadar belirli eylemleri gerçekleştirmesini engeller.
## 7. Kodun Karmaşıklık Düzeyini Minimuma İndirgemek
Geleneksel yazılım geliştiriceleri, yazılım tasarımına gereksiz karmaşıklık eklememeyi tavsiye eden **"KISS" ("keep it simple, stupid - basit tut, aptal") prensibini** iyi bilir. Bu, uzun süredir kabul gören "**karmaşık sistemler karmaşık şekillerde başarısız olur"** düşüncesine uygundur ve bu sistemler maliyetli hatalara daha yakındır.