---
# System prepended metadata

title: Bölüm 3 - SMART CONTRACT (Akıllı Sözleşmelerin Anatomisi) - Ethereum

---

# 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. 

![](https://hackmd.io/_uploads/r1D7sXksA.png)


## 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) 