La maggior parte delle volte, quando le persone iniziano a imparare a scrivere contratti intelligenti, la prima cosa di cui sentono parlare è Solidity ed Ethereum. È stata la prima cosa di cui ho sentito parlare anch'io. È ciò su cui si concentrano la maggior parte dei tutorial, e per una buona ragione. Solidity ha reso possibile scrivere programmi che vivono su una blockchain, ed Ethereum è diventato il luogo in cui molte persone hanno iniziato. Ma Solidity non è l'unico linguaggio di smart contract in circolazione. E Ethereum non è l'unica blockchain che supporta applicazioni decentralizzate. C'è anche , abbreviazione di . È stato creato da Telegram, ma ora è una catena pubblica guidata dalla comunità. È veloce, leggera e gestisce le cose in modo un po' diverso da come potresti essere abituato su Ethereum. Ciò include il modo in cui vengono scritti gli smart contract. Quando ho iniziato a esplorare la documentazione di TON, mi sono imbattuto in quattro linguaggi diversi per scrivere smart contract: . Non entrerò nei dettagli di tutti e quattro qui. TON The Open Network Tact, Tolk, FunC e Fift Questa guida si concentra sul linguaggio Tact e vedremo come utilizzarlo per creare un contratto di voto di base che consente agli utenti di esprimere voti e controllare i risultati on-chain. Perché ho deciso di imparare prima il tatto L'ecosistema TON supporta effettivamente più linguaggi, ognuno dei quali serve casi d'uso, livelli di astrazione ed esperienza di sviluppo diversi. Ecco una rapida panoramica di ciascuno di essi: è il linguaggio tradizionale per scrivere smart contract TON. È di basso livello e ti dà un controllo preciso su come funziona il tuo contratto sotto il cofano. È potente, ma significa anche che dovrai capire come funziona la TON Virtual Machine (TVM), inclusi concetti come manipolazione dello stack, layout della memoria ed esecuzione deterministica. La sintassi è in qualche modo simile a C, che può sembrare poco familiare se non hai mai lavorato con quello stile di linguaggio prima. FunC è in genere utilizzato insieme a FunC. È un linguaggio basato su stack che viene utilizzato principalmente per interagire direttamente con TVM e per distribuire, eseguire il debug ed eseguire calcoli on-chain. Di solito non è il linguaggio con cui si inizia per scrivere contratti intelligenti completi, ma è importante nel flusso di lavoro di sviluppo complessivo su TON. Fift è un'aggiunta più recente che è ancora in evoluzione. Da quanto ho capito, mira a migliorare gli strumenti e la compatibilità con linguaggi di livello superiore. È promettente, ma non è ancora ampiamente adottato o documentato. Tolk è un linguaggio di alto livello progettato specificamente per rendere lo sviluppo di smart contract TON più accessibile e user-friendly per gli sviluppatori. Tact semplifica molto la complessità di livello inferiore e ti consente di concentrarti sulla scrittura della tua logica in modo pulito e leggibile. La sintassi è più vicina a quella che vedresti in TypeScript o Solidity, il che rende molto più facile iniziare senza dover immergerti nei dettagli interni di TVM. Tact Tact fornisce un percorso più rapido per creare e distribuire contratti sulla blockchain TON. Capire come funziona il tatto Prima di iniziare a scrivere codice, è importante capire come sono strutturati gli smart contract Tact. Un tipico contratto Tact include alcuni componenti principali: Blocco : qui puoi definire il nome del contratto e dichiarare tutte le variabili di stato. contract block – Inizializza le variabili di stato del contratto e imposta le condizioni di avvio del contratto. Questo blocco viene eseguito una volta al momento della distribuzione. init blocchi – Sono come degli event listener. Gestiscono i messaggi in arrivo e definiscono come il tuo contratto reagisce a essi. receive Funzioni getter ( ): sono funzioni opzionali di sola lettura che consentono agli utenti o ad altri contratti di interrogare lo stato del contratto senza modificarlo. get fun Tact utilizza la comunicazione basata sui messaggi, che è il modo in cui funzionano tutte le interazioni su TON. Ogni contratto riceve un messaggio e lo elabora nel suo blocco . Questa struttura basata sui messaggi aiuta a organizzare la logica del contratto in modo modulare e gestibile. receive Applichiamo ora questo principio a un esempio concreto, creando un semplice contratto di voto. Creazione del primo contratto di voto con Tact (utilizzando TON Web IDE) In questa sezione, spiegheremo come implementare un sistema di voto di base utilizzando Tact. Questo contratto di voto consente agli utenti di votare per candidati predefiniti e tiene traccia del numero totale di voti ricevuti da ciascun candidato. Faremo tutto all'interno del TON Web IDE, uno strumento integrato nel browser che ti consente di scrivere, creare e testare i tuoi contratti senza dover installare nulla in locale. Passaggio 1: aprire TON Web IDE Vai su . https://ide.ton.org Fai clic su . Nel popup: Crea un nuovo progetto Assicurati che la lingua sia su . Tact Scegli come modello. Contratto vuoto Assegna al tuo progetto un nome simile a . VotingContract Fai clic . su + Crea Fase 2 – Scrittura del codice del contratto di voto Dopo aver creato il tuo progetto, apri il file . Vedrai una configurazione boilerplate: main.tact // Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } } è necessario affinché la distribuzione funzioni e non deve essere rimosso dal codice. import "@stdlib/deploy"; è il nome segnaposto. BlankContract Il blocco viene eseguito solo una volta quando il contratto viene distribuito e viene utilizzato per inizializzare le variabili di stato. init() Ora, tracciamo il nostro codice. Per prima cosa, definiamo la struttura del messaggio per il voto: // 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 } Questo è il messaggio Vote. Quando qualcuno vuole votare, invierà un messaggio al contratto che include un numero: 1 per Alice 2 per Bob Tact utilizza questa struttura per elaborare il voto in arrivo e decidere quale candidato otterrà il punto. Successivamente, imposteremo il nostro contratto e aggiungeremo due variabili di stato per tenere traccia dei voti di ciascun candidato: ... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; All'interno del contratto abbiamo definito due variabili: : memorizza il numero di voti ricevuti da Alice. votesAlice : memorizza il numero di voti ricevuti da Bob. votesBob Ora inizializzeremo quei conteggi dei voti a zero all'interno del blocco per impostare lo stato iniziale del contratto quando verrà distribuito per la prima volta. init init() { self.votesAlice = 0; self.votesBob = 0; } Il blocco viene eseguito , proprio quando il contratto viene distribuito, e imposta entrambi i conteggi dei voti a zero. init una sola volta Ora arriva la logica. Quando viene inviato un voto, vogliamo che il contratto verifichi a chi è destinato il voto e aumenti il conteggio corretto dei voti. // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } Quindi, quando si riceve un voto: Se è 1, aggiungiamo +1 a msg.candidate votesAlice Se è 2, aggiungiamo +1 a msg.candidate votesBob Infine, creeremo delle funzioni getter che consentiranno a chiunque di interrogare il conteggio dei voti per ciascun candidato senza modificare lo stato del contratto. // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } } Queste due funzioni getter ci permettono di controllare il numero di voti ricevuti da ogni candidato senza modificare nulla nel contratto. È un'operazione di sola lettura. Di seguito il codice completo del contratto di voto: 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; } } Fase 4 – Creare e distribuire il contratto Nella barra laterale sinistra, fare clic su Build & Deploy In , assicurati che sia selezionata . Ambiente l'opzione Sandbox Assicurati che sia selezionato e clicca su . Questo compilerà il tuo contratto e verificherà eventuali errori di sintassi o problemi nel tuo codice. main.tact Build Quindi, assicurati che sia selezionato nel menu a discesa, poiché è il tuo contratto effettivo, non il segnaposto predefinito. Se non lo vedi, premi per salvare il file in modo che l'IDE possa rilevare il contratto aggiornato. VotingContract Ctrl + S Quindi fai clic su . Se tutto funziona correttamente, vedrai un messaggio di conferma nei log che mostra che il tuo contratto è stato distribuito correttamente su Sandbox. ReDeploy Passaggio 5: interagire con il contratto Una volta distribuito, scorri verso il basso e vedrai due sezioni: , Getters: getVotesForAlice getVotesForBob Ricevitori: Vote nella sezione , inserisci nel campo di input e clicca su Hai appena votato per Alice! Puoi ripetere questa operazione per esprimere altri voti. Per esprimere un voto: Vota 1 candidate Invia. : fare clic su sotto e controllare il pannello per vedere il conteggio dei voti Per controllare il conteggio dei voti Chiama getVotesForAlice dei registri Fai lo stesso per Bob inviando nel campo , quindi controlla 2 candidate getVotesForBob Nel mio test, ho votato per Alice e per Bob , e le funzioni getter hanno dimostrato esattamente questo. 9 volte 6 volte 💭 Considerazioni finali: continua a costruire, continua a esplorare 🙌 Complimenti se hai letto tutto! Ora che hai visto come funziona un semplice contratto di voto in Tact, hai mosso il primo passo nello sviluppo di smart contract su TON. Questo contratto potrebbe essere basilare, ma la struttura e i concetti si applicano anche a logiche più complesse. Se vuoi continuare a sperimentare, prova ad estendere questo contratto o a esplorare altri template predefiniti da . Il TON Web IDE semplifica anche la sperimentazione di diversi casi d'uso e include anche dei template per aiutarti a creare e imparare più velocemente. https://tact-by-example.org/all Quindi vai avanti, modifica, testa, costruisci qualcosa di meglio.