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