Në shumicën e rasteve, kur njerëzit fillojnë të mësojnë se si të shkruajnë kontrata inteligjente, gjëja e parë për të cilën dëgjojnë është Solidity dhe Ethereum. Kjo ishte edhe gjëja e parë që dëgjova. Kjo është ajo ku shumica e mësimeve fokusohen, dhe për arsye të mirë. Solidity bëri të mundur shkrimin e programeve që jetojnë në një blockchain dhe Ethereum u bë vendi ku filluan shumë njerëz.
Por Solidity nuk është e vetmja gjuhë e zgjuar e kontratës atje. Dhe Ethereum nuk është i vetmi blockchain që mbështet aplikacione të decentralizuara.
Ekziston edhe TON , shkurtim i The Open Network . Ai u krijua nga Telegram, por tani është një zinxhir publik, i drejtuar nga komuniteti. Është i shpejtë, i lehtë dhe i trajton gjërat pak më ndryshe nga sa mund të jeni mësuar në Ethereum. Kjo përfshin mënyrën se si shkruhen kontratat inteligjente. Kur fillova të eksploroja dokumentacionin TON, hasa në katër gjuhë të ndryshme për të shkruar kontrata inteligjente: Tact, Tolk, FunC dhe Fift . Nuk do të hyj thellë në të katër këtu.
Ky udhëzues fokusohet në gjuhën Takt dhe ne do të shohim se si ta përdorim atë për të ndërtuar një kontratë votimi bazë që lejon përdoruesit të votojnë dhe të kontrollojnë rezultatet në zinxhir.
Ekosistemi TON në fakt mbështet shumë gjuhë, secila shërben për raste të ndryshme përdorimi, nivele abstraksioni dhe përvojë të zhvilluesit. Këtu është një përmbledhje e shpejtë e secilit prej tyre:
Takti ofron dhe një rrugë më të shpejtë për ndërtimin dhe vendosjen e kontratave në zinxhirin bllokues TON.
Përpara se të fillojmë të shkruajmë kodin, është e rëndësishme të kuptojmë se si janë strukturuar kontratat inteligjente Tact. Një kontratë tipike Takti përfshin disa komponentë thelbësorë:
blloku contract
– Këtu ju përcaktoni emrin e kontratës tuaj dhe deklaroni çdo variabël të gjendjes.
blloku init
– Ai inicializon variablat e gjendjes së kontratës suaj dhe vendos kushtet e fillimit të kontratës. Ky bllok funksionon një herë në momentin e vendosjes.
receive
blloqe - Këta janë si dëgjuesit e ngjarjeve. Ata trajtojnë mesazhet hyrëse dhe përcaktojnë se si reagon kontrata juaj ndaj tyre.
Funksionet Getter ( get fun
) – Këto janë funksione opsionale vetëm për lexim që lejojnë përdoruesit ose kontratat e tjera të kërkojnë gjendjen e kontratës pa e ndryshuar atë.
Takti përdor komunikimin e bazuar në mesazhe, që është mënyra se si funksionojnë të gjitha ndërveprimet në TON. Çdo kontratë merr një mesazh dhe e përpunon atë në bllokun e vet receive
. Kjo strukturë e bazuar në mesazhe ndihmon në organizimin e logjikës së kontratës suaj në një mënyrë modulare dhe të mirëmbajtur.
Le ta zbatojmë këtë në një shembull real duke ndërtuar një kontratë të thjeshtë votimi.
Në këtë seksion, ne do të shohim se si të zbatojmë një sistem votimi bazë duke përdorur Tact. Kjo kontratë votimi do t'i lejojë përdoruesit të votojnë për kandidatët e paracaktuar dhe do të gjurmojë numrin total të votave që merr secili kandidat.
Ne do të bëjmë gjithçka brenda TON Web IDE, i cili është një mjet në shfletues ku mund të shkruani, ndërtoni dhe testoni kontratat tuaja pa instaluar asgjë në nivel lokal.
VotingContract
.
Pas krijimit të projektit tuaj, hapni skedarin main.tact
. Do të shihni një konfigurim të pllakës së bojlerit:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } }
import "@stdlib/deploy";
kërkohet për vendosjen në punë dhe nuk duhet të hiqet nga kodi.BlankContract
është emri i mbajtësit të vendit.init()
funksionon vetëm një herë kur vendoset kontrata dhe përdoret për të inicializuar variablat e gjendjes.
Tani, le të hartojmë kodin tonë.
Së pari, ne do të përcaktojmë strukturën e mesazhit për votim:
// 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 }
Ky është mesazhi Vote. Kur dikush dëshiron të votojë, ai do t'i dërgojë një mesazh kontratës që përfshin një numër:
Tact përdor këtë strukturë për të përpunuar votën e ardhshme dhe për të vendosur se cili kandidat merr pikë.
Më pas, ne do të vendosim kontratën tonë dhe do të shtojmë dy variabla të gjendjes për të mbajtur gjurmët e votave të secilit kandidat:
... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32;
Brenda kontratës, ne përcaktuam dy variabla:
votesAlice
: ruan numrin e votave që merr Alice.votesBob
: ruan numrin e votave që merr Bob.
Tani do t'i inicializojmë ato numërime votash në zero brenda bllokut init
për të vendosur gjendjen fillestare të kontratës kur ajo të vendoset për herë të parë.
init() { self.votesAlice = 0; self.votesBob = 0; }
Blloku init
funksionon vetëm një herë , pikërisht kur kontrata është vendosur dhe i vendos të dy numërimet e votave në zero.
Tani vjen logjika. Kur dërgohet një votë, ne duam që kontrata të kontrollojë se për kë është vota dhe të rrisë numërimin e saktë të votave.
// Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } }
Pra, kur merret një votë:
msg.candidate
është 1, ne i shtojmë +1 votesAlice
msg.candidate
është 2, ne i shtojmë +1 votesBob
Së fundi, ne do të krijojmë funksione marrës për të lejuar këdo që të kërkojë numërimin e votave për secilin kandidat pa ndryshuar gjendjen e kontratës.
// Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
Këto dy funksione marrës na lejojnë të kontrollojmë numrin e votave që ka marrë secili kandidat pa ndryshuar asgjë në kontratë. Është një operacion vetëm për lexim.
Më poshtë është kodi i plotë i kontratës së votimit:
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; } }
Pasi të vendoset, lëvizni poshtë dhe do të shihni dy seksione:
getVotesForAlice
, getVotesForBob
Vote
Për të votuar: Në seksionin Vote , futni 1
në fushën e hyrjes së candidate
dhe klikoni Dërgo. Ju sapo keni votuar për Alice! Ju mund ta përsërisni këtë për të hedhur më shumë vota.
Për të kontrolluar numërimin e votave : Klikoni Call nën getVotesForAlice
dhe kontrolloni panelin e regjistrave për të parë numërimin e votave
2
në fushën candidate
, më pas kontrolloni getVotesForBob
Në testin tim, votova për Alice 9 herë dhe Bob 6 herë , dhe funksionet e marrjes treguan pikërisht këtë.
🙌 Urime nëse e lexoni deri në fund!
Tani që keni parë se si funksionon një kontratë e thjeshtë votimi në Tact, ju keni bërë hapin tuaj të parë drejt zhvillimit të kontratës inteligjente në TON. Kjo kontratë mund të jetë bazë, por struktura dhe konceptet zbatohen edhe për logjikën më komplekse.
Nëse dëshiron të vazhdosh të eksperimentosh, provo ta zgjasësh këtë kontratë ose të eksplorosh modele të tjera të parandërtuara nga https://tact-by-example.org/all . TON Web IDE gjithashtu e bën të lehtë testimin e rasteve të ndryshme të përdorimit dhe vjen me shabllone gjithashtu për t'ju ndihmuar të ndërtoni dhe mësoni më shpejt.
Pra, shkoni përpara, shkulni, provoni, ndërtoni diçka më të mirë.