La mayoría de las veces, cuando la gente empieza a aprender a escribir contratos inteligentes, lo primero que oyen es Solidity y Ethereum. Yo también lo oí primero. Es en lo que se centran la mayoría de los tutoriales, y con razón. Solidity hizo posible escribir programas que residen en una cadena de bloques, y Ethereum se convirtió en el punto de partida de mucha gente. Pero Solidity no es el único lenguaje de contratos inteligentes disponible. Y Ethereum no es la única blockchain que admite aplicaciones descentralizadas. También existe , abreviatura de . Fue creada por Telegram, pero ahora es una cadena pública impulsada por la comunidad. Es rápida, ligera y gestiona las cosas de forma ligeramente diferente a lo que podrías estar acostumbrado en Ethereum. Esto incluye la forma en que se escriben los contratos inteligentes. Cuando empecé a explorar la documentación de TON, encontré cuatro lenguajes diferentes para escribir contratos inteligentes: . No los analizaré en profundidad aquí. TON The Open Network Tact, Tolk, FunC y Fift Esta guía se centra en el lenguaje Tact y veremos cómo usarlo para crear un contrato de votación básico que permita a los usuarios emitir votos y verificar los resultados en la cadena. ¿Por qué decidí aprender el tacto primero? El ecosistema TON admite varios lenguajes, cada uno con diferentes casos de uso, niveles de abstracción y experiencia de desarrollo. A continuación, se presenta una breve descripción de cada uno: es el lenguaje tradicional para escribir contratos inteligentes de TON. Es de bajo nivel y te brinda control preciso sobre el funcionamiento interno de tu contrato. Es potente, pero también implica que necesitarás comprender el funcionamiento de la Máquina Virtual de TON (TVM), incluyendo conceptos como la manipulación de la pila, la distribución de memoria y la ejecución determinista. La sintaxis es similar a la de C, lo que puede resultar desconocido si no has trabajado con ese lenguaje antes. FunC se usa habitualmente junto con FunC. Es un lenguaje basado en pila que se usa principalmente para interactuar directamente con TVM y para implementar, depurar y realizar cálculos en cadena. No suele ser el lenguaje con el que se empieza a escribir contratos inteligentes completos, pero es importante en el flujo de trabajo general de desarrollo en TON. Fift es una incorporación más reciente que aún está en desarrollo. Por lo que he podido ver, su objetivo es mejorar las herramientas y la compatibilidad con lenguajes de alto nivel. Es prometedor, pero aún no está tan ampliamente adoptado ni documentado. Tolk es un lenguaje de alto nivel diseñado específicamente para que el desarrollo de contratos inteligentes TON sea más accesible y fácil de usar para los desarrolladores. Tact simplifica en gran medida la complejidad de bajo nivel y permite centrarse en escribir la lógica de forma clara y legible. La sintaxis es similar a la de TypeScript o Solidity, lo que facilita mucho los primeros pasos sin necesidad de profundizar en los aspectos internos de TVM. Tact Tact proporciona una ruta más rápida para crear e implementar contratos en la cadena de bloques TON. Entendiendo cómo funciona el tacto Antes de empezar a escribir código, es importante comprender cómo se estructuran los contratos inteligentes de Tact. Un contrato típico de Tact incluye algunos componentes principales: bloque : aquí es donde define el nombre de su contrato y declara cualquier variable de estado. contract Bloque : Inicializa las variables de estado del contrato y establece sus condiciones iniciales. Este bloque se ejecuta una vez al momento de la implementación. init Bloques : son como detectores de eventos. Gestionan los mensajes entrantes y definen cómo reacciona el contrato a ellos. receive Funciones getter ( ): son funciones opcionales de solo lectura que permiten a los usuarios u otros contratos consultar el estado del contrato sin cambiarlo. get fun Tact utiliza la comunicación basada en mensajes, que es como funcionan todas las interacciones en TON. Cada contrato recibe un mensaje y lo procesa en su propio bloque . Esta estructura basada en mensajes ayuda a organizar la lógica de sus contratos de forma modular y fácil de mantener. receive Apliquemos ahora esto en un ejemplo real construyendo un contrato de votación simple. Construyendo su primer contrato de votación con Tact (usando el IDE web de TON) En esta sección, explicaremos cómo implementar un sistema de votación básico con Tact. Este contrato de votación permite a los usuarios votar por candidatos predefinidos y registra el número total de votos que recibe cada candidato. Haremos todo dentro de TON Web IDE, que es una herramienta en el navegador donde puedes escribir, crear y probar tus contratos sin instalar nada localmente. Paso 1 – Abra el IDE web de TON Vaya a . https://ide.ton.org Haz clic en . En la ventana emergente: "Crear un nuevo proyecto" Asegúrese de que el idioma esté en . Tact Elija como su plantilla. Contrato en blanco Ponle a tu proyecto un nombre como . VotingContract Haga clic . en + Crear Paso 2 – Redacción del código del contrato de votación Después de crear el proyecto, abra el archivo . Verá una configuración estándar: main.tact // Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } } Se requiere para que la implementación funcione y no debe eliminarse del código. import "@stdlib/deploy"; es el nombre del marcador de posición. BlankContract El bloque se ejecuta solo una vez cuando se implementa el contrato y se utiliza para inicializar variables de estado. init() Ahora, vamos a mapear nuestro propio código. Primero, definiremos la estructura del mensaje para la votación: // 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 } Este es el mensaje de votación. Cuando alguien quiera votar, enviará un mensaje al contrato con un número: 1 para Alicia 2 para Bob Tact utiliza esta estructura para procesar el voto entrante y decidir qué candidato obtiene el punto. A continuación, configuraremos nuestro contrato y agregaremos dos variables de estado para realizar un seguimiento de los votos de cada candidato: ... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; Dentro del contrato definimos dos variables: : almacena el número de votos que recibe Alice. votesAlice : almacena la cantidad de votos que recibe Bob. votesBob Ahora inicializaremos esos recuentos de votos a cero dentro del bloque para establecer el estado inicial del contrato cuando se implementa por primera vez. init init() { self.votesAlice = 0; self.votesBob = 0; } El bloque se ejecuta , justo cuando se implementa el contrato y establece ambos recuentos de votos en cero. init solo una vez Ahora viene la lógica. Cuando se envía un voto, queremos que el contrato verifique a quién va dirigido y aumente el recuento de votos correctos. // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } Entonces, cuando se recibe un voto: Si es 1, sumamos +1 a msg.candidate votesAlice Si es 2, sumamos +1 a msg.candidate votesBob Por último, crearemos funciones getter para permitir que cualquiera pueda consultar el recuento de votos de cada candidato sin cambiar el estado del contrato. // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } } Estas dos funciones getter nos permiten comprobar el número de votos que ha recibido cada candidato sin modificar el contrato. Es una operación de solo lectura. A continuación se muestra el código completo del contrato de votación: 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; } } Paso 4 – Crear e implementar el contrato En la barra lateral izquierda, haga clic en Construir e implementar En , asegúrese de que esté seleccionada . Entorno la opción Sandbox Asegúrate de que esté seleccionado y haz clic en . Esto compilará tu contrato y comprobará si hay errores de sintaxis o problemas en tu código. main.tact "Compilar" A continuación, asegúrese de que esté seleccionado en el menú desplegable, ya que se trata de su contrato actual, no del marcador de posición predeterminado. Si no lo ve, presione para guardar el archivo y que el IDE pueda detectar el contrato actualizado. VotingContract Ctrl + S Luego, haz clic en . Si todo funciona correctamente, verás un mensaje de confirmación en los registros que indica que tu contrato se implementó correctamente en Sandbox. "ReImplementar" Paso 5 – Interactuar con el contrato Una vez implementado, desplácese hacia abajo y verá dos secciones: , Captadores: getVotesForAlice getVotesForBob Receptores: Vote En la sección , introduce en el campo de entrada y haz clic en " ¡Acabas de votar por Alice! Puedes repetir el proceso para emitir más votos. Para votar: "Votar" 1 candidate Enviar". : haga clic en en y verifique el panel para ver el recuento de votos Para comprobar el recuento de votos Llamar getVotesForAlice de registros Haz lo mismo para Bob enviando en el campo , luego marca 2 candidate getVotesForBob En mi prueba, voté por Alice y por Bob , y las funciones getter mostraron exactamente eso. 9 veces 6 veces 💭 Reflexiones finales: seguir construyendo, seguir explorando ¡Felicitaciones si leíste todo el libro! Ahora que has visto cómo funciona un contrato de votación simple en Tact, has dado el primer paso en el desarrollo de contratos inteligentes en TON. Este contrato puede ser básico, pero su estructura y conceptos también se aplican a lógicas más complejas. Si quieres seguir experimentando, intenta ampliar este contrato o explorar otras plantillas prediseñadas en . El IDE web de TON también facilita la prueba de diferentes casos de uso e incluye plantillas para ayudarte a desarrollar y aprender más rápido. https://tact-by-example.org/all Así que adelante, modifique, pruebe y construya algo mejor.