Lenguajes de contrato inteligente
Última actualización de la página: 22 de octubre de 2025
Un gran aspecto de Ethereum es que los contratos inteligentes pueden programarse utilizando lenguajes relativamente fáciles para el programador. Si tienes experiencia con Python o con cualquier lenguaje de llavesopens in a new tab, puedes encontrar un lenguaje con una sintaxis familiar.
Los dos lenguajes más activos y soportados son:
- Solidity
- Vyper
Remix IDE proporciona un entorno de desarrollo integral para crear y probar contratos tanto en Solidity como en Vyper. Prueba el IDE Remix en el navegadoropens in a new tab para empezar a programar.
Es posible que los desarrolladores con más experiencia quieran utilizar Yul, un lenguaje intermedio para la Máquina Virtual de Ethereum, o Yul+, una extensión de Yul.
Si es curioso y le gustaría ayudar a testear nuevos lenguajes que aún se encuentran en gran desarrollo, puede experimentar con Fe, un lenguaje emergente de contratos inteligentes que aún está en sus inicios.
Requisitos previos
El conocimiento previo de lenguajes de programación, especialmente de JavaScript o Python, puede ayudarlo a entender las diferencias en los lenguajes de los contratos inteligentes. También recomendamos que entienda los lenguajes de los contratos inteligentes como concepto antes de profundizar en las comparaciones de lenguajes. Introducción a los contratos inteligentes.
Solidity
- Lenguaje orientado a objeto de alto nivel para implementar contratos inteligentes.
- Lenguaje de llaves más influenciado por C++.
- Escrito estáticamente (el tipo de una variable se conoce en el momento de compilación).
- Admite:
- Herencia (puede extende otros contratos).
- Bibliotecas (puede crear código reutilizable que puede invocar de diferentes contratos, como funciones estáticas en una clase estática en otros lenguajes de programación orientados a objetos).
- Tipos complejos definidos por el usuario.
Enlaces importantes
- Documentaciónopens in a new tab
- Portal del lenguaje Solidityopens in a new tab
- Solidity by Exampleopens in a new tab
- GitHubopens in a new tab
- Sala de chat de Gitter sobre Solidityopens in a new tab conectada a la sala de chat de Matrix sobre Solidityopens in a new tab
- Hoja de referenciaopens in a new tab
- Blog de Solidityopens in a new tab
- Twitter de Solidityopens in a new tab
Contrato de ejemplo
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // La palabra clave "public" hace que las variables6 // sean accesibles desde otros contratos7 address public minter;8 mapping (address => uint) public balances;910 // Los eventos permiten a los clientes reaccionar a los cambios específicos11 // del contrato que declares12 event Sent(address from, address to, uint amount);1314 // El código del constructor solo se ejecuta cuando se crea15 // el contrato16 constructor() {17 minter = msg.sender;18 }1920 // Envía una cantidad de monedas recién creadas a una dirección21 // Solo puede ser llamado por el creador del contrato22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Envía una cantidad de monedas existentes29 // desde cualquier persona que llame a una dirección30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Saldo insuficiente.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Mostrar todoEste ejemplo debería darle una idea de cómo es la sintaxis de un contrato Solidity. Para una descripción más detallada de las funciones y variables, consulta la documentaciónopens in a new tab.
Vyper
- Lenguaje de programación Pythonic
- Escritura fuerte
- Código de compilador pequeño y comprensible
- Generación eficiente de bytecode
- Deliberadamente tiene menos funciones que Solidity con el objetivo de hacer que los contratos sean más seguros y más fáciles de auditar. Vyper no admite:
- Modificadores
- Herencia
- Ensamblado en línea
- Sobrecarga de funciones
- Sobrecarga de operadores
- Llamadas recurrentes
- Bucles de longitud infinita
- Puntos fijos binarios
Para obtener más información, lee los fundamentos de Vyperopens in a new tab.
Enlaces importantes
- Documentaciónopens in a new tab
- Vyper by Exampleopens in a new tab
- More Vyper by Exampleopens in a new tab
- GitHubopens in a new tab
- Chat de Discord de la comunidad de Vyperopens in a new tab
- Hoja de referenciaopens in a new tab
- Marcos de desarrollo y herramientas para contratos inteligentes de Vyper
- VyperPunk: aprende a proteger y hackear contratos inteligentes de Vyperopens in a new tab
- Vyper Hub para el desarrolloopens in a new tab
- Ejemplos de contratos inteligentes de grandes éxitos de Vyperopens in a new tab
- Recursos seleccionados de Awesome Vyperopens in a new tab
Ejemplo
1# Subasta abierta23# Parámetros de la subasta45# El beneficiario recibe el dinero del mejor postor67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# Estado actual de la subasta1213highestBidder: public(address)14highestBid: public(uint256)1516# Se establece en «true» al final, no permite ningún cambio1718ended: public(bool)1920# Realiza un seguimiento de las pujas reembolsadas para que podamos seguir el patrón de retirada2122pendingReturns: public(HashMap[address, uint256])2324# Crea una subasta simple con un tiempo de puja de `_bidding_time`2526# segundos en nombre de2728# la dirección del beneficiario `_beneficiary`.2930@external31def __init__(_beneficiary: address, _bidding_time: uint256):32 self.beneficiary = _beneficiary33 self.auctionStart = block.timestamp34 self.auctionEnd = self.auctionStart + _bidding_time3536# Puja en la subasta con el valor enviado3738# junto con esta transacción.3940# El valor solo se reembolsará si4142# no se gana la subasta.4344@external45@payable46def bid():47 # Comprueba si el período de pujas ha terminado.48 assert block.timestamp < self.auctionEnd49 # Comprueba si la puja es lo suficientemente alta50 assert msg.value > self.highestBid51 # Realiza un seguimiento del reembolso para el anterior mejor postor52 self.pendingReturns[self.highestBidder] += self.highestBid53 # Realiza un seguimiento de la nueva puja más alta54 self.highestBidder = msg.sender55 self.highestBid = msg.value5657# Retira una puja previamente reembolsada. El patrón de retirada se utiliza5859# aquí para evitar un problema de seguridad. Si los reembolsos se enviaran6061# directamente como parte de la puja, un contrato de puja malicioso podría bloquear6263# esos reembolsos y, por lo tanto, bloquear la entrada de nuevas pujas más altas.6465@external66def withdraw():67 pending_amount: uint256 = self.pendingReturns[msg.sender]68 self.pendingReturns[msg.sender] = 069 send(msg.sender, pending_amount)7071# Finaliza la subasta y envía la puja más alta7273# al beneficiario.7475@external76def endAuction():77 # Es una buena guía para estructurar las funciones que interactúan78 # con otros contratos (es decir, llaman a funciones o envían ether)79 # en tres fases:80 # 1. Comprobación de condiciones81 # 2. Realización de acciones (que pueden cambiar las condiciones)82 # 3. Interacción con otros contratos83 # Si estas fases se mezclan, el otro contrato podría volver a llamar84 # al contrato actual y modificar el estado o causar85 # que los efectos (pago de ether) se realicen varias veces.86 # Si las funciones llamadas internamente incluyen interacción con87 # contratos externos, también deben considerarse interacción con88 # contratos externos.8990 # 1. Condiciones91 # Comprueba si se ha alcanzado el tiempo de finalización de la subasta92 assert block.timestamp >= self.auctionEnd93 # Comprueba si esta función ya ha sido llamada94 assert not self.ended9596 # 2. Efectos97 self.ended = True9899 # 3. Interacción100 send(self.beneficiary, self.highestBid)Mostrar todoEste ejemplo debería darle una idea de cómo es la sintaxis de contratos de Vyper. Para una descripción más detallada de las funciones y variables, consulta la documentaciónopens in a new tab.
Yul y Yul+
Si es nuevo en Ethereum y aún no ha hecho ninguna codificación con lenguajes de contrato inteligente, le recomendamos empezar con Solidity o Vyper. Solo póngase con Yul o Yul+ una vez que esté familiarizado con las prácticas recomendadas de seguridad de los contratos inteligentes y los detalles de trabajar con la EVM.
Yul
- Lenguaje intermedio para Ethereum.
- Admite la EVM y Ewasmopens in a new tab, un WebAssembly con sabor a Ethereum, y está diseñado para ser un denominador común utilizable de ambas plataformas.
- Buen objetivo para etapas de optimización de alto nivel que pueden beneficiar a las plataformas EVM y Ewasm por igual.
Yul+
- Una extensión de bajo nivel y alta eficiencia para Yul.
- Diseñado inicialmente para un contrato de paquetes acumulativos optimistas.
- Yul+ se puede considerar una propuesta de actualización experimental de Yul, que le añade nuevas funciones.
Enlaces importantes
- Documentación de Yulopens in a new tab
- Documentación de Yul+opens in a new tab
- Publicación de introducción a Yul+opens in a new tab
Contrato de ejemplo
El siguiente ejemplo sencillo implementa una power function. Se puede compilar usando solc --strict-assembly --bin input.yul. El ejemplo debe
almacenarse en el archivo input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}Mostrar todoSi ya tiene mucha experiencia con los contratos inteligentes, puede encontrar una implementación completa de ERC20 en Yul aquíopens in a new tab.
Fe
- Lenguaje escrito estáticamente para la Máquina Virtual de Ethereum (EVM).
- Inspirado en Python y Rust.
- Pretende ser fácil de aprender, incluso para desarrolladores que son nuevos en el ecosistema de Ethereum.
- El desarrollo de Fe se encuentra aún en sus inicios; el lenguaje tuvo su lanzamiento alpha en enero de 2021.
Enlaces importantes
- GitHubopens in a new tab
- Anuncio de Feopens in a new tab
- Hoja de ruta de Fe para 2021opens in a new tab
- Chat de Discord de Feopens in a new tab
- Twitter de Feopens in a new tab
Contrato de ejemplo
El siguiente es un contrato simple implementado en Fe.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Mostrar todoCómo elegir
Como sucede con cualquier otro lenguaje de programación, se trata principalmente de elegir la herramienta adecuada para el trabajo correcto, así como las preferencias personales.
Estas son algunas cosas que debe tener en cuenta si aún no ha probado ninguno de los lenguajes:
¿Qué tiene de genial Solidity?
- Si es principiante, encontrará muchos tutoriales y herramientas de aprendizaje por ahí. Obtén más información sobre esto en la sección Aprende programando.
- Buenas herramientas de desarrollador disponibles.
- Solidity tiene una gran comunidad de desarrolladores, lo que significa que muy probablemente encontrará rápidamente las respuestas a sus preguntas.
¿Qué tiene de genial Vyper?
- Es una fantástica forma de comenzar para aquellos desarrolladores de Python que deseen escribir contratos inteligentes.
- Vyper dispone de una menor cantidad de funciones que lo convierten en la opción ideal para elaborar prototipos de ideas rápidamente.
- Vyper pretende ser una herramienta fácil de auditar y ofrecer el nivel máximo de legibilidad para las personas.
¿Qué tienen de genial Yul y Yul+?
- Lenguaje simple y funcional de bajo nivel.
- Le permite aproximarse mucho más a la EVM sin procesar, lo que puede ayudarlo a optimizar el uso de gas en los contratos.
Comparaciones de lenguajes
Para comparaciones de sintaxis básica, el ciclo de vida del contrato, interfaces, operadores, estructuras de datos, funciones, flujo de control y más, consulta esta hoja de referencia de Auditlessopens in a new tab