Solidity 1 [Akıllı Kontratlar]

berk cicek
7 min readMar 21, 2023

--

Akıllı Kontratlar (Smart Contract)

Akıllı kontratları kısaca bir protokol olarak tanımlayabiliriz. Bu protokol anonim kişiler arasında gerçekleşen işlemlerde belirli bazı şartların yerine getirilmesi ön koşulunu koyarak işlemlerin güvenilir bir şekilde devam etmesini sağlar. Akıllı kontratların kullanıcılar arasında güven sağlamasının en temel sebebi Akıllı kontratlar ile blokzincirinde gerçekleştirilen işlemlerde, geriye dönük işlemler yapılmamaktadır.Akıllı kontratlarla gerçekleştirilen tüm işlemler blokzinciri ağında kayıtlı kalır. İşlemlerin blokzinciri ağında gerçekleşmesi, kullanıcıların anonim olarak kalmasına olanak sağlar. Akıllı kontratların işlevsel olması için ağa katılan tüm katılımcıların şartları yerine getirmesi gerekmektedir. Akıllı kontratlar merkeziyetsizdir ve kullanıcılar arasında gerçekleştirilen sözleşmeler, herhangi bir otorite tarafından denetlenemez ve değiştirilemez.

Akıllı Kontratlar Nasıl Çalışır?

Akıllı sözleşmeler, (if-then) presibine göre çalışır. Akıllı sözleşmelerde anonim taraflar sözleşecekleri konu hakkında bazı şartlar berlirler ve şartları onayladıklarını gösteren kriptografik imzalarını sözleşmeye damgalarlar. Sonrasında bu akıllı sözleşme merkeziyetsiz ve herkese açık olan blok zinciri ağına yüklenerek tetiklenmeyi bekler. Yüksek seviyede yazılan akıllı sözleşmelerde silme ve güncelleme işlemleri akıllı sözleşmeye kodlanarak içeriğe müdahale edilmesine izin verilebilir. Bu yüzden burada dikkatli olmak son derece önemlidir.

EOA ve Akıllı Kontrat Hesapları

Ethereum mimarisi, iki farklı hesap türü sağlar: EOA’lar (Externally Owned Accounts) ve akıllı kontrat hesapları (Contract Accounts). Her iki hesap türü de Ethereum ağı üzerinde ödeme yapmak, aldıkları ödemeleri saklamak ve akıllı kontratlara veri sağlamak için kullanılabilir.

EOA’lar, özel anahtarlarıyla korunan ve ETH işlemlerini doğrulayan hesaplardır. EOA’lara sahip olan kullanıcılar, bu hesaplardan ETH gönderebilir veya alabilirler. EOA’lar, özel anahtarlarının korunmasından sorumlu olan kullanıcıların sahip olduğu hesaplardır.

Akıllı kontrat hesapları, özel anahtarlarla korunmazlar. Bunun yerine, akıllı kontrat kodları ve akıllı kontrat fonksiyonları tarafından kontrol edilirler. Akıllı kontratlar, önceden belirlenmiş koşullara ve kodlara uygun olarak çalışırlar ve ödemeleri kabul ederler.

EOA’lar ve akıllı kontrat hesapları arasındaki ana fark, korunma yöntemlerinde yatar. EOA’lar özel anahtarlarla korunurken, akıllı kontrat hesapları kodlarla korunur. Her iki hesap türü de Ethereum ağı üzerinde önemli bir rol oynar ve birbirleriyle etkileşim halinde çalışırlar.

EVM

EVM (Ethereum Virtual Machine — Ethereum Sanal Makinesi), Ethereum ağının merkezi olmayan uygulamalarının çalıştığı sanal bir bilgisayar sistemidir. Ethereum protokolünün en önemli parçalarından biridir ve akıllı kontratlar, DApp’ler (dağıtık uygulamalar) ve diğer Ethereum tabanlı uygulamaların çalıştırılması için gereklidir. EVM, validator veya node ismi verilen merkezi olmayan bileşenler tarafından çalıştırılır.

Kendi içinde kapalı bir sisteme sahiptir yani EVM içerisinde akıllı kontrat çalıştırılırken dış dünyadaki bir web servisi veya web sayfasını çağıramazsınız. Sistem tamamen deterministik olarak çalışmaktadır.

Sonuç olarak, EVM, Ethereum ağının temel bileşenlerinden biridir ve akıllı kontratların, DApp’lerin ve diğer Ethereum tabanlı uygulamaların çalıştırılması için gereklidir. EVM, merkezi olmayan doğası ve Turing tam tasarımı ile Ethereum ağının gücünü artırır ve Ethereum ekosisteminin büyümesini sağlar.

Transaction

Transaction, Ethereum ağındaki bir hesap (EOA veya akıllı kontrat) tarafından gerçekleştirilen bir işlem veya etkinliktir. Bir işlem, bir hesaptan diğerine ETH gönderme, akıllı kontratlara veri gönderme, akıllı kontratlardan veri alıp alma ve diğer ağ etkinliklerini içerebilir.Her işlem, (hash) ile benzersiz bir şekilde tanımlanır ve ağda yayınlanır. İşlem gönderen, işlemi yayınlayarak tüm ağa iletebilir. İşlem, ağda onaylandıktan sonra, blok zincirinde kalıcı hale gelir.

İşlem gönderirken, kullanıcılar belirli bir gas limiti ve gas fiyatı belirleyebilirler. Gas limiti, işlemin ne kadar gas kullanabileceğini belirler. Gas fiyatı ise işlemi işleme koyacak olan madencilere verilecek olan ödüldür. Gas limiti ve gas fiyatı işlemin ne kadar hızlı bir şekilde işleneceğini belirler.

Ethereum ağındaki transaction işlemleri genellikle üç amaçla kullanılır:

  1. ETH Transferi
  2. Akıllı Kontrat Oluşturma: “to” adres değerine sıfır verilerek bir akıllı kontratın oluşturulması için kullanılır.
  3. Akıllı Kontrat İşlemleri: Bir akıllı kontratın fonksiyonlarının çağrılması veya çalıştırılması için kullanılır. Bu işlem, bir kontrata veri göndermek ve bir kontrattan veri almak için kullanılabilir.

Her transaction işlemi, gönderen hesap tarafından imzalanır ve madencilere gönderilir. Madenciler işlemi doğrular, ağdaki diğer node’larla senkronize eder ve işlemi blok zincirinde kalıcı hale getirirler.

Akıllı kontrat oluşturma işleminin taslağı;

Akıllı kontrat çağırma işlemi taslağı;

Solidity

Solidity, blok zinciri uygulamaları için özel olarak tasarlanmış bir programlama dilidir. Bu dili kullanarak, blok zinciri üzerinde çalışan akıllı kontratlar yazabilirsiniz.Solidity ile Ethereum ve 150 den fazla EVM uyumlu blockchain üzerinde akıllı kontrat geliştirilebilir.Solidity Ethereum Sanal Makinası (ESM) (Ethereum Virtual Machine) hedeflenerek dizayn edilmiş bir curly-bracket dilidir. C++, Python ve JavaScript gibi dillerden ilham alınarak oluşturulmuştur. Kontratlar, durum değişkenlerinde kalıcı verileri ve bu veriler üzerinde işlemler yapan fonksiyonlar barındırırlar.

Solidity’le kullanıcılar için oylama, crowdfunding, blind auctions ve çoklu-imza cüzdanları gibi kullanımlara yönelik akıllı sözleşmeler oluşturabilinir.

Bir akıllı sözleşmenin fonksiyonları diğer akıllı sözleşmelerde de kullanılabilir. Bu durumda, bir akıllı sözleşmenin fonksiyonu başka bir akıllı sözleşmenin içinde çağrılabilir.

Ancak bu fonksiyon çağrısı gerçekleştiğinde, fonksiyonu çağıran akıllı sözleşmenin bağlamı değişir. Yani, fonksiyon çağrısı yapan akıllı sözleşme, artık kendi durum değişkenlerine erişemeyecek duruma gelir. Bunun yerine, çağrılan akıllı sözleşmenin durum değişkenlerine(state variable) erişebilir. Bu durum değişikliği, çağıran akıllı sözleşmenin bağlamının çağrılan akıllı sözleşmenin bağlamına bağlanması ile gerçekleşir.

Bu nedenle, bir akıllı sözleşmenin fonksiyonu çağrıldığında, çağrılan akıllı sözleşmenin durum değişkenlerine erişmek mümkün olurken, çağıran akıllı sözleşmenin durum değişkenlerine erişmek mümkün olmayabilir.

Ethereum özelinde, diğer yazılım dillerinde bulunan “schedule jobs” konseptine benzer şekilde, bir işlevi çalıştırmayı tetikleyen “cron” yapısı bulunmamaktadır. Bu işlemler manuel olarak tetiklenmelidir.

Cron, Unix ve Unix benzeri işletim sistemlerinde belirli bir zamanda bir komut veya işlemi çalıştırmak için kullanılan bir zamanlama aracıdır. Cron, belirli bir zaman aralığında, örneğin her gün veya her saat başı, belirli bir gün veya ayda, belirli bir haftanın gününde veya belirli bir saatte çalıştırılacak komutları ve işlemleri ayarlamak için kullanılır.

pekala temel konulara değindik şimdi de solidityle ilgili ön bilgilere değineceğiz.

bytecode ve opcode

Bytecode, bir programlama dilinde yazılan kodun, makine dilindeki karşılığıdır. Örneğin, Solidity gibi bir yüksek seviyeli bir dilde yazılmış olan bir akıllı kontrat kodu, bytecode’a derlendikten sonra EVM (Ethereum Virtual Machine) tarafından anlaşılabilir hale gelir. Bytecode, EVM tarafından yürütülebilir ve sonuçları blok zincirindeki bir akıllı kontrata kaydedilebilir. Opcode’lar (operation codes), EVM’in yürütebileceği işlemlerdir. Her Opcode, belirli bir görevi yerine getirir. Örneğin, ADD Opcode’u, iki sayıyı toplar. EVM, bir bytecode programını yürüttüğünde, her Opcode işlemini yürütür ve sonucu blok zincirindeki bir akıllı kontrata kaydeder.

Akıllı kontrat derlendiğinde aşağıdaki bytecode çıktısını üretir.

608060405234801561001057600080fd5b5061017c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806319ff1d2114610030575b600080fd5b61003861004e565b60405161004591906100c4565b60405180910390f35b60606040518060400160405280600781526020017f4d65726861626100000000000000000000000000000000000000000000000000815250905090565b6000610096826100e6565b6100a081856100f1565b93506100b0818560208601610102565b6100b981610135565b840191505092915050565b600060208201905081810360008301526100de818461008b565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610120578082015181840152602081019050610105565b8381111561012f576000848401525b50505050565b6000601f19601f830116905091905056fea264697066735822122071eaf23c56253c69e9856650f4ed4dd0ecfe05a064fb57ff44d450040f26d59664736f6c63430008070033

Bu değer akıllı kontrat kodumuzun derlenmiş binary verisinin hexadecimal formatına çevrilmiş halidir. Bu veri Ethereum Blockchain’e gönderilecek yani yayınlanacak veridir. EVM bu veriyi alır ve çalıştırır.

ABI (Application Binary Interface)

Abi (Application Binary Interface), Ethereum akıllı kontratlarının dışarıya açık programlama arayüzüdür. Abi, akıllı kontratların nasıl kullanılacağını, hangi fonksiyonlara sahip olduğunu ve fonksiyonların nasıl çağrılacağını tanımlar.

Abi, bir JSON dosyası olarak tanımlanır ve akıllı kontratın adı, adresi, fonksiyonları ve fonksiyonların girdi ve çıktı parametreleri gibi bilgileri içerir. Abi dosyası, bir akıllı kontratın işlevselliğine erişmek için kullanılır ve özellikle Web3.js gibi Ethereum istemci kütüphaneleri tarafından kullanılır.

Akıllı kontrat örneği:

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Deneme {
function kuberyum() public pure returns(string memory) {
return "Selam Cuberium";
}
}

ABI çıktısı:

[
{
"inputs": [],
"name": "kuberyum",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
}
]

Akıllı Kontar Var Etmek

Akıllı kontrat oluşturmak, test etmek ve dağıtmak için farklı yöntemler kullanılabilinir. Bu seride oluşturduğumuz akıllı sözleşmelerin simülesi ve test edilmesini Remix IDE UI bileşenlerini kullanarak yapacağız.

REMİX IDE

1- Yazdığımız kontratları öncelikle menüden Compiler kısmına gidip pragma version seçimi yaparak hatasız derlememiz mümkündür.

2- Deploy&Run Transaction’a geçerek, kontratı yükleyeceğimiz ortam bilgileri, owner gibi özellikleri belirttikten sonra Deploy butonu ile kontrat oluşturma sürecini tamamlarız.

HARDHAT

Hardhat, Ethereum akıllı sözleşmeleri geliştirmek için kullanılan bir yazılım geliştirme kitidir. Hardhat kullanarak, Solidity diliyle yazılmış akıllı sözleşmeleri oluşturabilir, test edebilir ve dağıtabiliriz.

Hardhat kullanarak akıllı sözleşme oluşturma adımları şu şekildedir:

1- Hardhat kurulumu: Hardhat’i kurmak için, Node.js yüklü olmalıdır. Node.js yüklü olduğundan emin olduktan sonra, terminalde aşağıdaki komutu çalıştırın:

npm install --save-dev hardhat

2- Proje oluşturma: Hardhat ile çalışmak için bir proje oluşturmanız gerekiyor. Bu projeyi oluşturmak için, terminalde boş bir klasöre gidin ve aşağıdaki komutu çalıştırın:

npx hardhat

Oluşturulan proje, geliştirme ve test aşamalarında kullanabileceğiniz bir dizi araç sağlar.

3- Akıllı sözleşme oluşturma: Hardhat ile bir akıllı sözleşme oluşturmak için,(Bu komut, örnek bir akıllı sözleşme oluşturmanıza yardımcı olur. Oluşturulan örnek sözleşme, Solidity dili kullanılarak yazılmıştır ve proje klasöründe “contracts” klasörü altında yer alır.) terminalde aşağıdaki komutu çalıştırın:

npx hardhat generate sample

4- Akıllı sözleşme derleme: Oluşturduğunuz akıllı sözleşmeyi derlemek için, terminalde aşağıdaki komutu çalıştırın:

npx hardhat compile

Bu komut, Solidity dili kullanılarak yazılmış tüm akıllı sözleşmeleri derler ve proje klasöründe “artifacts” klasörü altında derlenmiş sözleşme dosyaları oluşturur.

5- Akıllı sözleşme testleri: Hardhat, oluşturduğunuz akıllı sözleşmeleri test etmenize olanak tanır. Test dosyalarını “test” klasörü altında oluşturabilirsiniz. Örnek bir test dosyası oluşturmak için, “test/sample-test.js” dosyasını kopyalayabilirsiniz.

Hardhat ile oluşturduğunuz akıllı sözleşmeleri Ethereum ağına dağıtmak için, öncelikle bir Ethereum öncelikle bir Ethereum ağına bağlanmanız gerekiyor.

Bu yazının kaynakları ve bu başlıkların detaylı dokümanları

👨‍💻github : berkicekk

💻linkedin : berkicekk

🦉Twitter: berkicekkk

SiberVatan Cuberium Katkılarıya

--

--

berk cicek
berk cicek

Written by berk cicek

Bulent Ecevit University | CENG Student (4) Cuberium | Team Lead (Siber Vatan) | Blockchain Researcher

No responses yet