# Bölüm 3 - SMART CONTRACT (Akıllı Sözleşmelerin Anatomisi) - Ethereum
Bu yazı serisi SMART CONTRACT notlarının 3. bölümüdür. Neler olup bittiğini merak ediyorsanız veya hesaplar ve temel düzeyde smart contract bilginiz yoksa ilk 2 bölüme bakabilirsiniz. [1.bölüm](https://hackmd.io/@yigitraphy/Byyy8E3qC) , [2. Bölüm](https://hackmd.io/@yigitraphy/rJ4ulvhqR)
### Veri:
Her sözleşme verisi bir lokasyona atanmalıdır. Ya ***storage*** ya da ***memory***. Bir akıllı sözleşme de depolamayı değiştirmek pahalıdır, bundan dolayı verinizin nerede yaşayacağını düşünmelisiniz.
## Storage
Kalıcı veriden **storage**(depolama) olarak bahsedilir ve durum değişkenleri tarafından temsil edilir. Bu değerler kalıcı olarak blok zincirinde depolanır. Sözleşmenin derlendiğinde blok zincirinde ne kadar depolamaya ihtiyaç duyacağını takip edebilmesi için türünü deklare etmelisin.
```
contract SimpleStorage {
uint storedData; // durum değişkeni
}
```
## Memory
Sadece bir sözleşme fonksiyonunun yürütümü esnasında depolanan değerlere **memory**(bellek) değişkenleri denir. Bunlar blok zincirinde kalıcı şekilde depolanmadıkları için kullanımları çok daha ucuzdur.
### Ortam Değişkenleri (Enviroment Variables)
Sözleşmede tanımlanan değişkenlere ek olarak, bazı özel global değişkenler bulunmaktadır.

## Fonksiyonlar
En basit şekilde, fonksiyonlar gelen işlemlere yanıt olarak bilgi alabilir veya düzenleyebilir.
İki tip fonksiyon çağrısı bulunur.
**internal:** Bunlar bir EVM çağrısı oluşturmazlar internal fonksiyonlar ve durum değişkenleri sadece içten erişilebilir (yani mevcut sözleşmeden veya ondan türemiş sözleşmelerden).
**external:** Bunlar EVM çağrısı oluştururlar. external fonksiyonlar sözleşme arayüzünün bir parçasıdır, bu da diğer sözleşmelerden ve işlemler aracılığıyla çağrılabilecek anlamına gelir. Bir external fonksiyon olan **f** içten çağrılmaz (yani f() çalışmaz ama this.f() çalışır).
Ayrıca public ve private olabilirler.
- ***public*** fonksiyonları, sözleşmenin içinden veya mesajlar aracılığıyla çağrılabilir.
- ***private*** fonksiyonları sadece tanımlandıkları sözleşmede mevcuttular ve türetilmiş sözcüklerden olmazlar.
---
Bir sözleşmenin durum değişkenini güncellemek:
`
function update_name(string value) public {
dapp_name = value;
}`
- string türünün value parametresi subsequent fonksiona geçirilir.
(subsequent function: bir işlemin ardından çağrılacak veya gerçekleştirilecek bir fonksiyon)
- public olarak deklare edilir, bu da herkesin ona erişebileceği anlamına gelir. (deklare: tanımlamak veya bildirmek)
- view olarak deklare edilmez, yani sözleşme durumunu değiştirebilir.
(**"view"**, bir fonksiyonun durumunu değiştirmeyen, sadece okuma işlemleri gerçekleştiren bir fonksiyon olduğunu belirtir)
## Yapıcı Fonksiyonlar
***constructor*** fonksiyonları sadece sözleşme ilk dağıtıldığında tek sefer yürütülür.
```
constructor() public {
owner = msg.sender;
}
```
## Yerleşik Fonksiyonlar
Sözleşmenizde tanımladığınız değişkenler ve fonksiyonlara ek olarak, bazı özel yerleşik fonksiyonlar bulunmaktadır.
```
address.send()
```
Bu sözleşmenin başka hesaplara ETH göndermesini sağlar.
## Fonksiyon Yazmak
Fonksiyon şunlara ihtiyaç duyar;
- parametre değişkeni ve türü (eğer kabul ediyorsa).
- internal/external deklarasyonu.
- pure/view/payable deklarasyonu.
- dönüş türü (eğer bir değer dönüyorsa).
**pure:** Bir fonksiyonun hiçbir durumu değiştirmeyeceğini ve hiçbir dış etkileşimde bulunmayacağını belirtir. Yani sadece parametreleri kullanarak değer hesaplayan ve herhangi bir durum değişikliği yapmayan fonksiyonlara *"pure"* özelliği atanır.
**view:** Bir fonksiyonun hiçbir durum değiştirmeyeceğini belirtir(sadece okuma yapar).
**payable:** Bir fonksiyonu alabilme(kabul edebilme) yeteneğini belirtir.
Notların devamı : [Bölüm 4 (Akıllı Sözleşmelerde Birim Testi Yapmaya Yönelik Yönerge)](https://hackmd.io/@yigitraphy/S1c7rC1s0)