Rust ile Akıllı Sözleşmeler (Smart Contracts)

Kubilay kulaoğlu
Akbank Teknoloji
Published in
9 min readNov 8, 2022

Akıllı Sözleşme (Smart Contract) Nedir?

Akıllı sözleşme (Smart Contract), taraflar için kodlanarak oluşturulan sözleşmelerdir. Aslında bir blok zincirine yüklenmiş bağımsız bir programdır. Amerikalı bilgisayar bilimcisi Nick Szabo, 1994 yılında akıllı sözleşmeler kavramını öneren ilk kişidir. Szabo, akıllı sözleşmeleri, sözleşme şartlarını yerine getiren işlem protokolleri olarak tanımladı. Akıllı sözleşmeler kavramının ilk bakışta anlaşılmamasının en önemli sebebi Mikro Servis mimarisindeki isimlendirme probleminin buraya da sirayet etmesidir. İşte bu isimlendirme sonucunda da akıllı sözleşmeler isimlendirmesi genelde yanlış anlaşılmalara sebep vermektedir. Yukarıda da değimiz gibi aslında blok zinciri üzerine yüklenmiş programlardan bahsediyoruz. Peki, bu programlar bize neler getirebilir. Aklıma gelen ilk örnekler oy verme, herhangi bir malın satışı ve buna bağlı süreçlerin tamamlanmasını ele alabiliriz. Gelinmek istenen nokta ise kodlanabilir sözleşmeler yardımıyla merkezi bir otorite veya sisteme dâhil olmadan taraflar arasında güvenilir işlemlerin ve anlaşmaların yapılmasına izin vermektir. Yani tarafların tüm istekleri bu sözleşmelere kodlanır ve tüm isterler tamamlandığı zaman işlem veya işlemler onaylanır. Örnek vermek gerekirse bir araç aldığınızı düşünün aracın uzman incelemesi işlemi daha sonra araç trafik ve ruhsat işlemleri tamamlanıyor. Genel olarak tüm isterler tamamlanınca hesaplar arasında aracın bedelinin aktarımı tamamlanıyor. Bundan sonrada işlem tamamlanıyor. Yapılan işlemler dijital bir deftere kayıt edilerek değişmez hale geliyor. Bunda sonrada işlemler izin verilen tüm tarafların izleyebileceği şekilde şeffaf olarak sistemde yer almaktadır.

Akıllı sözleşmeler ile genel olarak neler yapabiliriz. Aşağıdaki başlıkları genel kullanım yöntemleri olarak kabul edebilirsiniz.

· Yukarıdaki örnekte olduğu gibi kullanıcılar arasındaki sözleşmeleri yönetebiliriz.

· Çok imzalı hesaplar olarak işlev görebilir. Yani bir fon harcaması yapılmadan önce belirli bir yüzde kişi kabul ederse işlem gerçekleşir.

· Diğer sözleşmeler ile etkileşimde bulunabiliriz.

· Tedarik zincirinin güvenli hale getirebiliriz.

· Üyelik, alan kaydı bilgileri, özel nitelikli kayıt vb. uygulamalarla ilgili bilgileri saklayabiliriz.

Bu yapı sayesinde birçok aracının ortadan kaldırılması hedeflenmektedir. Yukarıda bahsedilen güzelliklerine rağmen halen devletler ve kanunlar nezdindeki kullanım alanları tam olarak belli değildir. Teknolojinin hızlı ilerlemesine karşın toplumsal yapı ve kurumların buna tepkisi veya entegre olması daha yavaş olmaktadır. Devlet organları ve hukuk sistemi de devreye girdiği zaman kanunlar ve yönetmeliklerdeki boşluklar da tam olarak doldurulacaktır.

Peki, nedir bu akıllı sözleşmelerin faydaları;

· Yukarıda da bahsettiğimiz gibi koşullar sağlandığı zaman işlemler otomatik olarak yürütülür. Ek evrak işleri veya bu manuel doldurmalardan kaynaklı hatalar ortadan kalkar. Bu da hızlı ve verimli bir sisteme sahip olmamızı sağlar.

· Üçüncü bir taraf araya girmeden işlemler taraflar arasında şeffaf bir biçimde gerçekleşir ve paylaşılır. Böylece güvenilir bir sistem oluşturulmaktadır.

· Sistem blok zincirin üzerinde olduğundan işlem kayıtları değiştirilemez şekilde şifrelenir. Blok zincirin güvenlik mekanizması olduğu gibi burada da geçerlidir.

· Şifreleme işlemi korsanlar tarafından yapılan saldırıların başarılı olmasını oldukça zor hale getirir.

· Aracıların aradan kalması işlem ücretlerinden ve zamandan ciddi anlamda tasarruf sağlamaktadır.

Akıllı sözleşmeler bedava değildir. Çalışabilmeleri için belli bir paraya ihtiyaç vardır. Çalışma süreleri de bu para miktarı ile sınırlıdır. İşlem ücreti olarak adlandırabileceğimiz bu para ne kadar sistem tüketildiğine göre hesaplanır. Bu ücret Ethereum sisteminde GAS olarak adlandırılmaktadır. Bu bedava olmayan kullanım modeli sayesinde belli ölçüde de olsa sitemin saldırılara ve başıboş programlara karşı güvenliği de sağlanmaktadır.

Bu kadar açıklamanın yeterli olduğunu düşünüyorum. Şimdi Rust programlama dili ile akıllı sözleşmeler yazma işine başlayabiliriz.

Neden Rust

Akıllı sözleşmeler tarafına baktığımız da Ethereum ile birlikte Solidity’nin ağırlığını görüyoruz. Farklı blok zincirler kendi dillerini ve Rust dilini kullanıyorlar. Geliştirici kaynaklarına baktığımızda Solidity’nin genel kullanım bir dil olmaması ve uzman geliştirici bulunamaması bir sorun teşkil ediyor. Solidity’in özellikle EVM (Ethereum Virtual Machine ) üzerinde birikimi olan uzman geliştirici ihtiyacı vardır. Rust tarafına bakıldığında ise durum biraz daha iyi görünüyor. Fakat orada da geliştirici sayısı henüz istenilen durumda değildir. Lakin Rust dilinin birçok ortamda kullanılabilir olması geliştirici sayısını daha artıracak olarak görünmektedir. Yani Solidity’e göre kıyaslandığında Rust sadece blok zincir sistemine özgü değildir.

Fakat neden akıllı sözleşmeler tarafında Rust ile ilerlemeyi düşünüyorsunuz sorusunu aşağıdaki gibi yanıtlayabiliriz.

Rust ideal bir akıllı sözleşme dilidir. Tip ve bellek güvenlidir. Yüksek optimizasyon ile birlikte en kısa çalışma süresine sahiptir. Enerji tüketimi düşük bir dildir. Bu da blok zincir içindeki akıllı sözleşmelerin maliyetlerini düşürmektedir.

Dilde cargo + crates.io eko sistemi sayesinde üretkenlik üst boyuttadır. Ekosistemde sunulan tüm desteklerden ücretsiz olarak yararlanabilirsiniz. WebAssembly için üst seviye destek vermektedir. Birçok yayında Web 3 ‘ün en önemli geliştirme dilleri arasında gösterilmektedir.

Küçük boyutlu uygulamalar geliştirebilirsiniz. Alan kısıtlı olan blok zinciri dünyasında boyut önemlidir. Kendine özgü olan derleyicisi bunun için özel bir yardımcıdır.

Yapabileceğimiz işleri sıralamak istersek aşağıdaki uygulama tipleri ön plana çıkmaktadır.

· Blok zincirler

· Tarayıcılar

· İşletim Sistemleri

· Güvenlik Ürünleri

Rust dilini detaylı olarak açıklamayacağım. Bu konuyla ilgili olarak linkteki makale serime bakabilirsiniz.

Şimdi kolları sıvayalım ve ilk akıllı sözleşme uygulamamız için gerekli alt yapıları oluşturmaya başlayalım. Rust makale serilerinde olduğu gibi işletim sistemi olarak bizim yerli Linux sürümümüz olan Pardus işletim sistemi üzerinde çalışmalarımızı yapacağız. Neden Pardus derseniz. Kendi açık kaynak kodlu projelerimize destek vermemiz gerektiğini düşünüyorum. Pardus kullanmak istemeyenler Ubuntu serisi bir sistem ile de makaleyi takip devam edebilirler. Windows kullanmak isteyenler ise WSL kurulumu ile devam edebilirler.

Akıllı Sözleşmeler tarafında gelişimler devam etmekle beraber. Bu kısımda öne çıkan projeleri aşağıdaki gibi sıralayabiliriz.

1. Ethereum

2. Solana

3. Polkadot

4. Hyperledger

Tabii ki projeler bu kadar ile sınırlı değil, gelişen ve gelişmekte olan birçok proje var. Ama şu an piyasanın çoğuna etki eden Ethereum’dur. Onun hemen arkasından gelen ve Web 3 tarafında yerini sağlamlaştırmaya çalışan projeler ise Solana ve Polkadot olarak görünüyor. Aslında bu alanda bir savaş var demek pekte yanlış olmaz. Çünkü her proje dediğimiz gibi Web 3 tarafındaki en çok tercih edilen proje olmak istiyor.

Ben yapıyı anlamanız ve bir Akıllı Sözleşmenin nasıl yüklendiğini nasıl yürütüldüğünü görmeniz için bir örnek kullanacağım. Bu kısımda Solana Projesini tercih ediyorum. Açıkçası diğer projelere göre kullanımı daha rahat olacaktır. Programı sıfırdan yazıyor olmayacağız. Basit bir örneği ayağa kaldıracağız. Asıl amacımız sistemin nasıl ayağa kaldırıldığını ve program yapısını görmek olacaktır.

Solana Networküne Rust programları nasıl deploy edilir?

Basit şekilde Solana ağı aşağıda gördüğünüz şekildedir. Solana blok zinciri, bir tarih kanıtı mekanizması kullanır. Bu algoritma, Solana’nın zincirindeki bir sonraki bloğu tanımlamak için zaman damgalarını kullanır. Diğer birçok projeden bu zaman kanıtı algoritmasını kullanmasıyla ayrılmaktadır. Bu durum da zincire ölçeklenebilirlik ve hız katmaktadır. Solana’nın Ethereum ile bir yarışta olduğunu yazmıştık. Akıllı sözleşmeler tarafında aralarındaki en büyük fark çalışma prensipleridir. Geleneksel EVM (Ethereum Virtual Machine) tabanlı zincirlerde, sözleşme kodu ve durum, zincir üzerinde dağıtılan tek bir sözleşmede birleştirilir. Solana ile bir akıllı sözleşme salt okunurdur ve yalnızca program mantığını içerir. Solana ve EVM tabanlı akıllı sözleşmeler arasındaki en önemli fark; Ethereum’daki hesaplar, Solana’daki hesaplarla aynı olmayışıdır. Solana hesapları, insanların cüzdanlarına referans olan Ethereum hesaplarının aksine verileri cüzdan bilgileri dâhil depolayabilir. Konu hakkında ilgili makaleyi inceleyebilirsiniz.

Solana, merkezi olmayan uygulamalar tarafından Solana blok zinciri ile etkileşim kurmak için kullanılabilecek bir CLI ve JSON RPC API sunar. Solana’nın güzel bir dokümantasyonu bulunuyor. İlgili dokümana Buradan ulaşabilirsiniz.

Solana ile akıllı sözleşme uygulaması geliştirme kısmına geçmeden önce aşağıdaki uygulamaların makinalarımıza kurulu olması gerekmektedir.

· NodeJS v14 veya üstü ve NPM

o NodeJs sürümüzü eski ve Linux ortamında belli bir sürüme geçmek istiyorsanız. Bu linkten faydalanabilirsiniz.

· Rust

· Solana CLI

· Git

· build-essential

o (sudo apt-get install build-essential) C ve C++ için gerekli olan kütüphaneleri yüklüyor olacağız.

· Curl

o (sudo apt-get install curl) curl komutunu kullanmamız gereken durumlar için yüklememiz gerekiyor.

Genel kurulumlarımızı yaptıktan sonra Solana tarafından hazırlanan örnek uygulama ile Solana ağına bağlanmayı, uygulamamızı yüklemeyi ve istemci tarafından çağrılmasını sağlayacağız. Uygulama basit olarak belli bir hesap için programın kaç kez çalıştırıldığını bize dönüyor. Bunu da konsola yazıyor olacağız.

Öncelikle git üzerinden Solana deneme uygulamasını klonunu alalım.

git clone https://github.com/solana-labs/example-helloworld

cd example-helloworld

Solana’nın sürüm kontrolünü yaptıktan sonra proje ayarları ile devam edeceğiz.

solana — version

Yukarıdaki komuta sonuç almaz iseniz aşağıda verdiğim komutu çalıştırmanız gerekebilir.

export PATH=”/root/.local/share/solana/install/active_release/bin:$PATH”

Solanının sürümünü aldıktan sonra sistemi Solana geliştirici ağına bağlanacak şekilde düzenlememiz gerekiyor. Hangi blok zinciri ile çalışırsanız çalışın. Bu ayarları doğru şekilde yapmalısınız. Yoksa yaptığınız işlemin size ciddi maliyetleri olabilir.

solana config set --url https://api.devnet.solana.com

Ardından, hesabınız için yeni bir anahtar çifti oluşturmanız gerekir. Bu, Solana geliştirici ağında bulunan akıllı sözleşmeler (programlarla) etkileşim kurmak için gereklidir. Ben şifre kısmını boş olarak geçtim.

solana-keygen new --force

Bir hesap oluşturduğunuza göre, bazı SOL jetonlarını almak için airdrop programını kullanabiliriz. Aşağıdaki komut, yeni oluşturulan hesabınıza SOL jetonları ister:

solana airdrop 2

Artık hesabımız ve paramız da olduğuna göre uygulamamızı derleyip Solana sistemine yükleyebiliriz.

npm run build:program-rust

Şimdi Solana sistemine kodu yükleyelim.

solana program deploy dist/program/helloworld.so

İstemci uygulaması

Solana sistemine akıllı sözleşmemizi yükledik. Yukarıdaki Solana ağ çizimimizi hatırlarsanız. Artık bir istemci ile onu çağırmamız gerekiyor. Öncelikle uygulama için gerekli olan paketlerin yüklenmesini sağlayalım.

npm install

Programınızın başarıyla çalıştırıldığını görmelisiniz. Her başarılı çalıştırma ile sayının +1 şeklinde artığını göreceksiniz.

npm run start

Programı çalıştırıp sonuçları aldığımıza göre şimdi de kısaca kaynak kod kısmının üzerinden geçebiliriz.

Herhangi bir araçla veya metin editörü ile aşağıdaki dizindeki Rust kodunu açalım. Bu kod parçacığı ile genel olarak akıllı sözleşme yazılışına bakabiliriz.

Gideceğimiz dizin: example-helloworld/src/program-rust/src/lib.rs

Gelin koda birlikte bakalım. İlk blok standart Solana program tanımlarını içeriyor. Burada önemli olan kısım 19. satırda programımıza giriş noktasının tanımlanması kısmıdır. Burasını programın çalışacağı main girdisi gibi veya daha doğru bir şekilde dışarıya açık hale getirilecek olan giriş noktası olarak düşünebilirsiniz.

process_instruction işlevi, programın ortak anahtarı olan program_id’yi ve merhaba demek için hesap bilgisini içeren accountInfo’yu kabul eder. ProgramResult, programın ana mantığının bulunduğu yerdir. Örneği düzgün olarak çalıştırdıysanız. Şimdi kodlar üzerinde oynamaya başlayın. Birkaç değişiklik yaparak yeniden yükleyin. Bu yapıyı anlamanızı kolaylaştıracaktır.

Programın istemci tarafında çalışan kısmına da ufaktan bir göz atalım. Bu kısmı kodları “example-helloworld/src/client” altında bulunmaktadır. Bu kısımda geliştirilirken Typescript ile Solana web3.js SDK ve Solana RPC API kullanılmıştır. Uygulamanın giriş kısmı main.ts içinde yer almaktadır. Bu kısımda basit bir akış ile programın nasıl ilerlediğini görebilirsiniz.

Yukarıda gördüğünüz gibi akış basit bir şekilde gösterilmiştir. Şimdi bu fonksiyonların kullanımını incelemek için “hello_world.ts“ dosyasını açmamız gerekiyor.

İlk olarak establishConnection metodunu çağırıyoruz. Bu şekilde cluster tarafına bağlantıyı sağlıyoruz.

Ardından, işlemler için ödeme yapılabilecek bir hesap olduğundan emin olmak için establishPayer işlevini çağırır ve gerekirse bir hesap oluşturur. Hesapta yeterli bir meblağ bulunmaz ise de air drop çağrımı yapıyoruz.

‘checkProgram’ işlemi ile önce programın anahtar çiftini ./dist/program/helloworld-keypair.json’dan sisteme yüklüyoruz. Program hesabını getirmek ortak anahtarı kullanılarak program çağrılır. Program yoksa, istemci bir hatayla durur. Program mevcutsa, yeni bir hesap açacak ve durum bilgisini burada saklayacaktır. Bizim durum bilgimiz ise programın kaç kere çalıştırıldığı bilgisidir.

Sistem ‘sayHello’ fonksiyonunu çağırarak programa bir ‘hello’ işlemi oluşturur ve gönderir. İşlem, çağrılacak helloworld programı hesabının genel (public) anahtarını ve müşterinin merhaba demek istediği hesabı tutan bir işlem (transaction) içerir. İşlem her gerçekleştirdiğinde, program hedef hesabın veri deposunu bir sayı artırır.

reportGreetings fonksiyonu ile hesabın sayHello işlemi ile kaç kere çağrıldığı bilgisi sorgulanır.

Gördüğünüz gibi akıllı sözleşmeri oluşturmak aslında o kadar da zor değil.Daha önceden de değdiğim gibi bu örneği değiştirerek bilgi seviyenizi artırabilirsiniz.

Doğru tasarım ve gerekli bilgi ile sizlerde bir çok soruna çözüm oluşturabilirsiniz. İleri ki dönemlerde akıllı sözleşmeler hayatımızda daha çok var olacaktır. Şimdiden bu konular üzerine çalışarak bir çok kişiden bir adım önde olabilirsiniz. Bir sonraki makalede görüşmek üzere sağlıcakla kalın.

--

--