# Bölüm 2 - SMART CONTRACT - Ethereum Ethereum'da ki hesaplar hakkında genel bilginiz yoksa veya neler olup bittiğini öğrenmek istiyorsanız, bir önceki yazıya bakın. [Bölüm 1](https://hackmd.io/@yigitraphy/Byyy8E3qC) ## Smart Contract Bir "akıllı sözleşme" basitçe Ethereum blokzincirinde çalışan bir programdır. Ethereum blokzincirinde ki özel adreste bulunan bir kod (sözleşmenin fonksiyonları) ve veri (sözleşmenin durumu) koleksiyonudur. ***Akıllı Sözleşmeler bir tür Ethereum hesabıdır.*** ### "Dijital Bir Otomat" ([Orijinal Makale](https://nakamotoinstitute.org/library/smart-contracts/)) Nick Szabo'nun açıkladığı gibi, bir akıllı sözleşme için en iyi metafor, muhtemelen bir otomattır. Doğru girdilerle, belli bir çıktı garanti edilir. Otomattan bir atıştırmalık için; > money + snack selection = snack dispensed Otomatlar, akıllı sözleşmelerle benzer sayılabilecek şekilde çalışırlar. 1. Bir ürün seçersiniz. 2. Otomat fiyat gösterir. 3. Fiyatı ödersiniz. 4. Otomat doğru miktarı ödediğinizi onaylar. 5. Otomat size ürünü verir. Otomat istediğiniz ürün sadece tüm gereksinimler karşılığında verecektir. Eğer ürün seçmezseniz veya yeterli parayı girmezseniz otomat ürününüzü vermeyecektir. ``` pragma solidity 0.8.7; contract VendingMachine { address public owner; // sözleşmenin sahibini temsil eden değişken mapping(address => uint) public cupcakeBalances; // cupcake stokları tutmak için mapping yapılmış constructor() { owner = msg.sender; // sözleşmeyi başlatan adres, işlemi başlatan kişiyi belirler cupcakeBalances[address(this)] = 100; } function refill(uint amount) public { require(msg.sender == owner, "Yalnızca sahip yeniden doldurabilir"); // sadece sahibin çağırabileceği fonksiyon, cupcake eklemeye yarar cupcakeBalances[address(this)] += amount; } function purchase(uint amount) public payable { // cupcake almak isteyenler tarafından çağrılır require(msg.value >= amount * 1 ether, "Yetersiz Bakiye"); // belirli ether ile ödeme yapması gerektiğini kontrol eder require(cupcakeBalances[address(this)] >= amount, "Stok yok"); // stokları kontrol eder cupcakeBalances[address(this)] -= amount; // satın alınan cupcake miktarını stoktan düşer cupcakeBalances[msg.sender] += amount; // alan kişinin hesabına cupcake ekler } } ``` > **require**: bu ifade bir koşulu kontrol eder ve eğer koşul sağlanmıyorsa durdurur, diğer türlü devam eder. > > require (koşul, "Hata mesajı") > *purchase* fonksiyonu, cupcakeleri satın almak isteyen kullanıcıların kullanabileceği bir fonksiyonu temsil eder. #### Basit bir örnek 'amount', bir fonksiyonun parametresidir ve genellikle bir miktarı temsil eder. *refill* fonksiyonu cupcake'leri doldurmak için kullanılacak miktarı ifade eder. Örnek: > vendingMachine = newvendingMachine(); > vendingMachine.refill(50); Bu çağrı da 'amount' değeri 50'dir. *"refill"* fonksiyonu 50 adet cupcake ekler. --- Notların devamı [Bölüm 3'de](https://hackmd.io/@yigitraphy/SJPULXJiC). Akıllı Sözleşmelerin Anatomisi ele alındı.