Çoğu zaman, insanlar akıllı sözleşmeler yazmayı öğrenmeye başladıklarında duydukları ilk şey Solidity ve Ethereum'dur. Ben de ilk duyduğum şey buydu. Çoğu eğitimin odaklandığı şey budur ve bunun iyi bir nedeni vardır. Solidity, bir blok zincirinde yaşayan programlar yazmayı mümkün kıldı ve Ethereum birçok insanın başladığı yer oldu.
Ancak Solidity, piyasadaki tek akıllı sözleşme dili değildir. Ve Ethereum, merkezi olmayan uygulamaları destekleyen tek blok zinciri değildir.
Ayrıca The Open Network'ün kısaltması olan TON da var. Telegram tarafından yaratıldı, ancak artık herkese açık, topluluk odaklı bir zincir. Hızlı, hafif ve Ethereum'da alışkın olduğunuzdan biraz farklı şekilde işleri hallediyor. Buna akıllı sözleşmelerin nasıl yazıldığı da dahil. TON belgelerini incelemeye başladığımda akıllı sözleşmeler yazmak için dört farklı dille karşılaştım: Tact, Tolk, FunC ve Fift . Burada dördünü de derinlemesine incelemeyeceğim.
Bu rehber Tact diline odaklanıyor ve kullanıcıların oy kullanmasını ve sonuçları zincir üzerinde kontrol etmesini sağlayan temel bir oylama sözleşmesinin nasıl oluşturulacağını göreceğiz.
TON ekosistemi aslında birden fazla dili destekler, her biri farklı kullanım durumlarına, soyutlama düzeylerine ve geliştirici deneyimine hizmet eder. İşte her birinin kısa bir özeti:
Tact, TON blok zincirinde sözleşmelerin oluşturulması ve dağıtılması için daha hızlı bir yol sağlar.
Kod yazmaya başlamadan önce, Tact akıllı sözleşmelerinin nasıl yapılandırıldığını anlamak önemlidir. Tipik bir Tact sözleşmesi birkaç temel bileşen içerir:
contract
bloğu – Burada sözleşmenizin adını tanımlayabilir ve tüm durum değişkenlerini bildirebilirsiniz.
init
bloğu – Sözleşmenizin durum değişkenlerini başlatır ve sözleşmenin başlangıç koşullarını ayarlar. Bu blok dağıtım sırasında bir kez çalışır.
blokları receive
– Bunlar olay dinleyicileri gibidir. Gelen mesajları işler ve sözleşmenizin bunlara nasıl tepki vereceğini tanımlarlar.
Getter fonksiyonları ( get fun
) – Bunlar, kullanıcıların veya diğer sözleşmelerin sözleşmenin durumunu değiştirmeden sorgulamasına izin veren isteğe bağlı salt okunur fonksiyonlardır.
Tact, TON'daki tüm etkileşimlerin işleyiş biçimi olan mesaj tabanlı iletişimi kullanır. Her sözleşme bir mesaj alır ve bunu kendi receive
bloğunda işler. Bu mesaj tabanlı yapı, sözleşme mantığınızı modüler ve sürdürülebilir bir şekilde düzenlemenize yardımcı olur.
Şimdi bunu gerçek bir örnekte basit bir oylama sözleşmesi oluşturarak uygulayalım.
Bu bölümde, Tact kullanarak temel bir oylama sisteminin nasıl uygulanacağını ele alacağız. Bu oylama sözleşmesi kullanıcıların önceden tanımlanmış adaylara oy vermesine ve her adayın aldığı toplam oy sayısını izlemesine olanak tanır.
Her şeyi, yerel olarak hiçbir şey yüklemeden sözleşmelerinizi yazabileceğiniz, derleyebileceğiniz ve test edebileceğiniz tarayıcı içi bir araç olan TON Web IDE'nin içinde yapacağız.
VotingContract
gibi bir isim verin.
Projenizi oluşturduktan sonra main.tact
dosyasını açın. Bir kalıp kurulumu göreceksiniz:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } }
import "@stdlib/deploy";
gereklidir ve koddan kaldırılmamalıdır.BlankContract
yer tutucu adıdır.init()
bloğu yalnızca sözleşme dağıtıldığında bir kez çalışır ve durum değişkenlerini başlatmak için kullanılır.
Şimdi kendi kodumuzu haritalandıralım.
Öncelikle oylama için mesaj yapısını tanımlayalım:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob }
Bu, Oylama mesajıdır. Birisi oy vermek istediğinde, sözleşmeye bir numara içeren bir mesaj gönderecektir:
Tact, gelen oyu işlemek ve hangi adayın puanı alacağına karar vermek için bu yapıyı kullanır.
Daha sonra sözleşmemizi oluşturacağız ve her adayın oylarını takip etmek için iki durum değişkeni ekleyeceğiz:
... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32;
Sözleşme içerisinde iki değişken tanımladık:
votesAlice
: Alice'in aldığı oy sayısını saklar.votesBob
: Bob'un aldığı oy sayısını depolar.
Şimdi, sözleşme ilk dağıtıldığında başlangıç durumunu ayarlamak için init
bloğunun içindeki oy sayımlarını sıfırlayacağız.
init() { self.votesAlice = 0; self.votesBob = 0; }
init
bloğu yalnızca bir kez , sözleşme dağıtıldığında çalışır ve her iki oy sayısını da sıfırlar.
Şimdi mantık geliyor. Bir oy gönderildiğinde, sözleşmenin oyun kime ait olduğunu kontrol etmesini ve doğru oy sayısını artırmasını istiyoruz.
// Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } }
Yani bir oy alındığında:
msg.candidate
1 ise, votesAlice
+1 ekliyoruzmsg.candidate
2 ise, votesBob
+1 ekliyoruz
Son olarak, sözleşme durumunu değiştirmeden her adayın oy sayısını sorgulamaya izin veren getter fonksiyonları oluşturacağız.
// Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
Bu iki getter fonksiyonu, sözleşmede hiçbir şeyi değiştirmeden her adayın aldığı oy sayısını kontrol etmemizi sağlar. Bu salt okunur bir işlemdir.
Aşağıda tam oylama sözleşmesi kodu yer almaktadır:
import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob } contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; init() { self.votesAlice = 0; self.votesBob = 0; } // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
Dağıtıldıktan sonra aşağı kaydırın ve iki bölüm göreceksiniz:
getVotesForAlice
, getVotesForBob
Vote
Oy kullanmak için: Oy Ver bölümünde, candidate
giriş alanına 1
girin ve Gönder'e tıklayın. Az önce Alice'e oy verdiniz! Daha fazla oy kullanmak için bunu tekrarlayabilirsiniz.
Oy sayısını kontrol etmek için : getVotesForAlice
altında Çağrı'ya tıklayın ve oy sayısını görmek için günlük panelini kontrol edin
candidate
alanına 2
gönderin, ardından getVotesForBob
işaretleyin Test çalışmamda Alice'e 9 kez , Bob'a ise 6 kez oy verdim ve getter fonksiyonları tam olarak bunu gösterdi.
🙌 Eğer sonuna kadar okuduysanız tebrikler!
Artık Tact'te basit bir oylama sözleşmesinin nasıl çalıştığını gördüğünüze göre, TON'da akıllı sözleşme geliştirmeye ilk adımınızı attınız. Bu sözleşme temel olabilir, ancak yapı ve kavramlar daha karmaşık mantık için de geçerlidir.
Deney yapmaya devam etmek istiyorsanız, bu sözleşmeyi genişletmeyi veya https://tact-by-example.org/all adresinden önceden oluşturulmuş diğer şablonları keşfetmeyi deneyin. TON Web IDE ayrıca farklı kullanım durumlarını denemeyi kolaylaştırır ve daha hızlı oluşturmanıza ve öğrenmenize yardımcı olmak için şablonlarla birlikte gelir.
O halde devam edin, ince ayar yapın, test edin, daha iyisini inşa edin.