Kadalasan, kapag nagsimulang matuto ang mga tao kung paano magsulat ng mga matalinong kontrata, ang unang bagay na maririnig nila ay Solidity at Ethereum. Yun din ang una kong narinig. Ito ang pinagtutuunan ng pansin ng karamihan sa mga tutorial, at sa magandang dahilan. Ang solidity ay naging posible na magsulat ng mga programa na nakatira sa isang blockchain, at ang Ethereum ay naging lugar kung saan nagsimula ang maraming tao. Ngunit ang Solidity ay hindi lamang ang matalinong wika ng kontrata sa labas. At ang Ethereum ay hindi lamang ang blockchain na sumusuporta sa mga desentralisadong aplikasyon. Mayroon ding , maikli para . Nilikha ito ng Telegram, ngunit isa na itong pampubliko, chain na hinimok ng komunidad. Ito ay mabilis, magaan, at pinangangasiwaan ang mga bagay na medyo naiiba sa kung ano ang maaaring nakasanayan mo sa Ethereum. Kasama diyan kung paano isinusulat ang mga smart contract. Noong sinimulan kong tuklasin ang dokumentasyon ng TON, nakatagpo ako ng apat na magkakaibang wika para sa pagsusulat ng mga matalinong kontrata: . Hindi ako magpapalalim sa apat dito. TON sa The Open Network Tact, Tolk, FunC, at Fift Nakatuon ang gabay na ito sa wikang Tact, at makikita natin kung paano ito gamitin upang bumuo ng isang pangunahing kontrata sa pagboto na nagbibigay-daan sa mga user na bumoto at suriin ang mga resulta nang on-chain. Kung Bakit Ako Nagpasya na Matuto muna ng Tact Ang TON ecosystem ay aktwal na sumusuporta sa maraming wika, bawat isa ay naghahatid ng iba't ibang mga kaso ng paggamit, antas ng abstraction, at karanasan ng developer. Narito ang isang mabilis na pangkalahatang-ideya ng bawat isa sa kanila: ay ang tradisyunal na wika para sa pagsusulat ng mga smart contract ng TON. Ito ay mababa ang antas at nagbibigay sa iyo ng tumpak na kontrol sa kung paano gumagana ang iyong kontrata sa ilalim ng hood. Makapangyarihan ito, ngunit nangangahulugan din ito na kakailanganin mong maunawaan kung paano gumagana ang TON Virtual Machine (TVM), kabilang ang mga konsepto tulad ng pagmamanipula ng stack, layout ng memorya, at deterministikong pagpapatupad. Ang syntax ay medyo katulad ng C, na maaaring hindi pamilyar kung hindi mo pa nagagawa ang istilo ng wikang iyon dati. Ang FunC Karaniwang ginagamit ang kasama ng FunC. Ito ay isang stack-based na wika na kadalasang ginagamit para sa direktang pakikipag-ugnayan sa TVM at ginagamit para sa pag-deploy, pag-debug, at pagsasagawa ng on-chain na mga kalkulasyon. Karaniwang hindi ito ang wikang sinisimulan mo para sa pagsusulat ng mga buong smart na kontrata, ngunit mahalaga ito sa pangkalahatang daloy ng trabaho sa pag-unlad sa TON. Fift ay isang mas bagong karagdagan na umuunlad pa rin. Mula sa kung ano ang aking nakalap, ito ay naglalayong pagbutihin ang tooling at pagiging tugma sa mas mataas na antas ng mga wika. Nangangako ito, ngunit hindi pa gaanong pinagtibay o naidokumento. Ang Tolk ay isang mataas na antas ng wika na partikular na idinisenyo upang gawing mas naa-access at madaling gamitin ang developer ng TON smart contract development. Pinapasimple ng Tact ang maraming mas mababang antas ng pagiging kumplikado at hinahayaan kang tumuon sa pagsulat ng iyong lohika sa isang malinis, nababasang paraan. Ang syntax ay mas malapit sa kung ano ang makikita mo sa TypeScript o Solidity, na ginagawang mas madali upang makapagsimula nang hindi nangangailangan ng malalim na pagsisid sa mga internal ng TVM. Ang Tact Ang Tact ay nagbibigay at isang mas mabilis na landas para sa pagbuo at pag-deploy ng mga kontrata sa TON blockchain. Pag-unawa sa Paano Gumagana ang Takte Bago tayo magsimulang magsulat ng code, mahalagang maunawaan kung paano nakaayos ang mga kontrata ng Tact smart. Kasama sa karaniwang kontrata ng Tact ang ilang pangunahing bahagi: block – Dito mo tutukuyin ang pangalan ng iyong kontrata at magdedeklara ng anumang mga variable ng estado. contract block – Sinisimulan nito ang mga variable ng estado ng iyong kontrata at itinatakda ang mga kondisyon ng pagsisimula ng kontrata. Ang block na ito ay tumatakbo nang isang beses sa oras ng pag-deploy. init ng mga bloke - Ito ay tulad ng mga tagapakinig ng kaganapan. Pinangangasiwaan nila ang mga papasok na mensahe at tinutukoy kung paano tumugon ang iyong kontrata sa kanila. receive Getter functions ( ) – Ito ay mga opsyonal na read-only na function na nagbibigay-daan sa mga user o iba pang kontrata na i-query ang estado ng kontrata nang hindi ito binabago. get fun Gumagamit ang Tact ng komunikasyong nakabatay sa mensahe, na kung paano gumagana ang lahat ng pakikipag-ugnayan sa TON. Ang bawat kontrata ay tumatanggap ng mensahe at pinoproseso ito sa sarili nitong block. Ang istrukturang ito na nakabatay sa mensahe ay nakakatulong na ayusin ang iyong lohika ng kontrata sa isang modular, mapanatili na paraan. receive Ilapat natin ito ngayon sa isang tunay na halimbawa sa pamamagitan ng pagbuo ng isang simpleng kontrata sa pagboto. Pagbuo ng Iyong Unang Kontrata sa Pagboto gamit ang Tact (Gamit ang TON Web IDE) Sa seksyong ito, tatalakayin natin kung paano ipatupad ang isang pangunahing sistema ng pagboto gamit ang Tact. Ang kontrata sa pagboto na ito ay magbibigay-daan sa mga user na bumoto para sa mga paunang natukoy na kandidato at subaybayan ang kabuuang bilang ng mga boto na natatanggap ng bawat kandidato. Gagawin namin ang lahat sa loob ng TON Web IDE, na isang in-browser na tool kung saan maaari mong isulat, buuin, at subukan ang iyong mga kontrata nang walang lokal na pag-install. Hakbang 1 – Buksan ang TON Web IDE Pumunta sa . https://ide.ton.org I-click . Sa popup: ang Gumawa ng bagong proyekto Siguraduhin na ang wika ay nasa . Tact Piliin ang bilang iyong template. Blangkong Kontrata Pangalanan ang iyong proyekto tulad ng . VotingContract I-click ang . + Lumikha Hakbang 2 – Pagsulat ng Kodigo sa Kontrata sa Pagboto Pagkatapos gawin ang iyong proyekto, buksan ang file. Makakakita ka ng setup ng boilerplate: main.tact // Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } } ay kinakailangan para gumana ang deployment at hindi dapat alisin sa code. import "@stdlib/deploy"; ay ang pangalan ng placeholder. BlankContract Ang block ay tumatakbo nang isang beses lamang kapag ang kontrata ay na-deploy at ginagamit upang simulan ang mga variable ng estado. init() Ngayon, imapa natin ang sarili nating code. Una, tutukuyin natin ang istraktura ng mensahe para sa pagboto: // 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 } Ito ang mensahe ng Bumoto. Kapag may gustong bumoto, magpapadala sila ng mensahe sa kontrata na may kasamang numero: 1 para kay Alice 2 para kay Bob Ginagamit ng Tact ang istrukturang ito upang iproseso ang papasok na boto at magpasya kung sinong kandidato ang makakakuha ng punto. Susunod, ise-set up namin ang aming kontrata at magdagdag ng dalawang variable ng estado upang masubaybayan ang mga boto ng bawat kandidato: ... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; Sa loob ng kontrata, tinukoy namin ang dalawang variable: : iniimbak ang bilang ng mga boto na natatanggap ni Alice. votesAlice : iniimbak ang bilang ng mga boto na natatanggap ni Bob. votesBob Sisimulan na namin ngayon ang mga bilang ng boto sa zero sa loob ng block upang itakda ang panimulang estado ng kontrata kapag ito ay unang na-deploy. init init() { self.votesAlice = 0; self.votesBob = 0; } tatakbo ang block , kapag na-deploy na ang kontrata at itinatakda nito ang parehong bilang ng boto sa zero. Isang beses lang init Ngayon ay dumating ang lohika. Kapag nagpadala ng boto, gusto naming suriin ng kontrata kung para kanino ang boto at dagdagan ang tamang bilang ng boto. // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } Kaya kapag natanggap ang isang boto: Kung 1 ang , nagdaragdag kami ng +1 sa msg.candidate votesAlice Kung 2 ang , nagdaragdag kami ng +1 sa msg.candidate votesBob Panghuli, gagawa kami ng mga function ng getter upang hayaan ang sinuman na magtanong sa bilang ng boto para sa bawat kandidato nang hindi binabago ang estado ng kontrata. // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } } Ang dalawang getter function na ito ay hayaan nating suriin ang bilang ng mga boto na natanggap ng bawat kandidato nang hindi binabago ang anuman sa kontrata. Isa itong read-only na operasyon. Nasa ibaba ang buong code ng kontrata sa pagboto: 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; } } Hakbang 4 – Buuin at I-deploy ang Kontrata Sa kaliwang sidebar, mag-click sa Build & Deploy Sa ilalim ng , tiyaking napili ang . Environment Sandbox Tiyaking napili ang at i-click . Isasama nito ang iyong kontrata at titingnan kung may mga error o isyu sa syntax sa iyong code. main.tact ang Build Susunod, tiyaking napili ang sa dropdown dahil iyon ang iyong aktwal na kontrata, hindi ang default na placeholder. Kung hindi mo ito nakikita, pindutin upang i-save ang iyong file upang matukoy ng IDE ang na-update na kontrata. VotingContract ang Ctrl + S Pagkatapos ay i-click . Kung gumagana nang tama ang lahat, makakakita ka ng mensahe ng kumpirmasyon sa mga log na nagpapakita na matagumpay na na-deploy ang iyong kontrata sa Sandbox. ang ReDeploy Hakbang 5 – Makipag-ugnayan sa Kontrata Kapag na-deploy na, mag-scroll pababa at makakakita ka ng dalawang seksyon: , Getters: getVotesForAlice getVotesForBob Mga Receiver: Vote Sa seksyong , ilagay sa field ng input at i-click Binoto mo lang si Alice! Maaari mong ulitin ito para bumoto pa. Para bumoto: Bumoto 1 candidate ang Ipadala. : I-click sa ilalim ng at tingnan ang panel upang makita ang bilang ng boto Upang suriin ang bilang ng boto ang Tumawag getVotesForAlice ng mga log Gawin ang parehong para kay Bob sa pamamagitan ng pagpapadala sa field , pagkatapos ay suriin 2 candidate getVotesForBob Sa aking test run, bumoto ako para kay Alice at Bob , at ang mga function ng getter ay eksaktong ipinakita iyon. ng 9 na beses 6 na beses 💭 Mga Pangwakas na Kaisipan: Ipagpatuloy ang Pagbuo, Ipagpatuloy ang Paggalugad 🙌 Congrats kung nabasa mo ng todo! Ngayong nakita mo na kung paano gumagana ang isang simpleng kontrata sa pagboto sa Tact, ginawa mo na ang iyong unang hakbang sa pagbuo ng matalinong kontrata sa TON. Maaaring basic ang kontratang ito, ngunit nalalapat din ang istruktura at mga konsepto sa mas kumplikadong lohika. Kung gusto mong patuloy na mag-eksperimento, subukang palawigin ang kontratang ito o i-explore ang iba pang mga prebuilt na template mula sa . Pinapadali din ng TON Web IDE na subukan ang iba't ibang kaso ng paggamit at mayroon din itong mga template upang matulungan kang bumuo at matuto nang mas mabilis. https://tact-by-example.org/all Kaya sige, sabunutan, subukan, bumuo ng mas mahusay.