Ir al contenido principal
Change page

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.

Contrato de ejemplo

1// SPDX-License-Identifier: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // La palabra clave "public" hace que las variables
6 // sean accesibles desde otros contratos
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Los eventos permiten a los clientes reaccionar a los cambios específicos
11 // del contrato que declares
12 event Sent(address from, address to, uint amount);
13
14 // El código del constructor solo se ejecuta cuando se crea
15 // el contrato
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Envía una cantidad de monedas recién creadas a una dirección
21 // Solo puede ser llamado por el creador del contrato
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Envía una cantidad de monedas existentes
29 // desde cualquier persona que llame a una dirección
30 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 todo

Este 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.

Ejemplo

1# Subasta abierta
2
3# Parámetros de la subasta
4
5# El beneficiario recibe el dinero del mejor postor
6
7beneficiary: public(address)
8auctionStart: public(uint256)
9auctionEnd: public(uint256)
10
11# Estado actual de la subasta
12
13highestBidder: public(address)
14highestBid: public(uint256)
15
16# Se establece en «true» al final, no permite ningún cambio
17
18ended: public(bool)
19
20# Realiza un seguimiento de las pujas reembolsadas para que podamos seguir el patrón de retirada
21
22pendingReturns: public(HashMap[address, uint256])
23
24# Crea una subasta simple con un tiempo de puja de `_bidding_time`
25
26# segundos en nombre de
27
28# la dirección del beneficiario `_beneficiary`.
29
30@external
31def __init__(_beneficiary: address, _bidding_time: uint256):
32 self.beneficiary = _beneficiary
33 self.auctionStart = block.timestamp
34 self.auctionEnd = self.auctionStart + _bidding_time
35
36# Puja en la subasta con el valor enviado
37
38# junto con esta transacción.
39
40# El valor solo se reembolsará si
41
42# no se gana la subasta.
43
44@external
45@payable
46def bid():
47 # Comprueba si el período de pujas ha terminado.
48 assert block.timestamp < self.auctionEnd
49 # Comprueba si la puja es lo suficientemente alta
50 assert msg.value > self.highestBid
51 # Realiza un seguimiento del reembolso para el anterior mejor postor
52 self.pendingReturns[self.highestBidder] += self.highestBid
53 # Realiza un seguimiento de la nueva puja más alta
54 self.highestBidder = msg.sender
55 self.highestBid = msg.value
56
57# Retira una puja previamente reembolsada. El patrón de retirada se utiliza
58
59# aquí para evitar un problema de seguridad. Si los reembolsos se enviaran
60
61# directamente como parte de la puja, un contrato de puja malicioso podría bloquear
62
63# esos reembolsos y, por lo tanto, bloquear la entrada de nuevas pujas más altas.
64
65@external
66def withdraw():
67 pending_amount: uint256 = self.pendingReturns[msg.sender]
68 self.pendingReturns[msg.sender] = 0
69 send(msg.sender, pending_amount)
70
71# Finaliza la subasta y envía la puja más alta
72
73# al beneficiario.
74
75@external
76def endAuction():
77 # Es una buena guía para estructurar las funciones que interactúan
78 # con otros contratos (es decir, llaman a funciones o envían ether)
79 # en tres fases:
80 # 1. Comprobación de condiciones
81 # 2. Realización de acciones (que pueden cambiar las condiciones)
82 # 3. Interacción con otros contratos
83 # Si estas fases se mezclan, el otro contrato podría volver a llamar
84 # al contrato actual y modificar el estado o causar
85 # que los efectos (pago de ether) se realicen varias veces.
86 # Si las funciones llamadas internamente incluyen interacción con
87 # contratos externos, también deben considerarse interacción con
88 # contratos externos.
89
90 # 1. Condiciones
91 # Comprueba si se ha alcanzado el tiempo de finalización de la subasta
92 assert block.timestamp >= self.auctionEnd
93 # Comprueba si esta función ya ha sido llamada
94 assert not self.ended
95
96 # 2. Efectos
97 self.ended = True
98
99 # 3. Interacción
100 send(self.beneficiary, self.highestBid)
Mostrar todo

Este 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.

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) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
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 todo

Si 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.

Contrato de ejemplo

El siguiente es un contrato simple implementado en Fe.

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 pub def get_msg(addr: address) -> BookMsg:
15 return self.guest_book[addr].to_mem()
16
Mostrar todo

Có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

Lecturas adicionales

¿Le ha resultado útil este artículo?