Saltar al contenido principal
Change page

Anatomía de los contratos inteligentes

Última actualización de la página: 15 de abril de 2026

Un contrato inteligente es un programa que se ejecuta en una dirección en Ethereum. Están formados por datos y funciones, que se pueden ejecutar al recibir una transacción. A continuación encontrarás una visión general de lo que compone un contrato inteligente.

Requisitos previos

Asegúrese de haber leído primero sobre los contratos inteligentes. Este documento asume que ya estás familiarizado con lenguajes de programación como JavaScript o Python.

Datos

Cualquier dato del contrato debe asignarse a una ubicación: ya sea a storage o memory. Es costoso modificar el almacenamiento en un contrato inteligente, por lo que debes considerar dónde deben ubicarse sus datos.

Almacenamiento

Los datos persistentes se denominan almacenamiento y se representan por variables de estado. Estos valores se almacenan permanentemente en la blockchain. Necesitas declarar el tipo de dato para que el contrato pueda llevar un seguimiento de la cantidad de almacenamiento en la blockchain que se necesitará cuando compile.

// Ejemplo de Solidity
contract SimpleStorage {
    uint storedData; // Variable de estado
    // ...
}
# ejemplo de Vyper
storedData: int128

Si ya has utilizado lenguajes de programación orientados a objetos, probablemente estarás familiarizado con la mayoría de tipos de datos. Sin embargo, address debería ser nuevo para usted si es nuevo en el desarrollo de Ethereum.

Un tipo address puede contener una dirección de Ethereum que equivale a 20 bytes o 160 bits. Devuelve en notación hexadecimal con un 0x al inicio.

Otros tipos de variables incluyen:

  • booleano
  • entero
  • números de punto fijo
  • matrices de bytes de punto fijo
  • matrices de bytes de tamaño dinámico
  • literales racionales y enteros
  • literales de cadena
  • literales hexadecimales
  • enums

Para más explicación, echa un vistazo a la documentación:

Memoria

Los valores que sólo se almacenan durante la vida útil de la ejecución de una función de contrato se llaman variables de memoria. Dado que estos no se almacenan permanentemente en la blockchain, son mucho más baratos de usar.

Obtenga más información sobre cómo la EVM almacena los datos (almacenamiento, memoria y pila) en los documentos de Solidity (opens in a new tab).

Variables de entorno

Además de las variables que se definen en su contrato, hay algunas variables globales especiales. Se utilizan principalmente para proporcionar información acerca de la cadena de bloques o la transacción actual.

Ejemplos:

PropiedadVariable de estadoDescripción
block.timestampuint256Marca de tiempo del bloque actual
msg.senderdirecciónRemitente del mensaje (llamada actual)

Funciones

De una forma simplista, las funciones pueden obtener información o establecer información en respuesta a las transacciones entrantes.

Existen dos tipos de llamadas de funciones:

  • internal: estas no crean una llamada a la EVM
    • Solo se puede acceder a las funciones y variables de estado internas desde dentro (es decir, desde el contrato actual o los contratos que se deriven de él)
  • external: estas sí crean una llamada a la EVM
    • Las funciones externas forman parte de la interfaz del contrato, lo que significa que se pueden llamar desde otros contratos y a través de transacciones. Una función externa f no se puede llamar internamente (es decir, f() no funciona, pero this.f() sí).

También pueden ser public o private

  • Las funciones public se pueden llamar internamente desde el contrato o externamente a través de mensajes
  • Las funciones private solo son visibles para el contrato en el que se definen y no para los contratos derivados

Tanto las funciones como las variables de estado pueden hacerse públicas o privadas.

Aquí se ejemplifica una función para actualizar una variable de estado en un contrato:

// ejemplo de Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • El parámetro value de tipo string se pasa a la función: update_name
  • Se declara como public, lo que significa que cualquiera puede acceder a ella
  • No se declara como view, por lo que puede modificar el estado del contrato

Funciones de vista

Estas funciones no modifican el estado de los datos del contrato. Ejemplos comunes son las funciones "getter", que se pueden utilizar para recibir el saldo o balance de un usuario, por ejemplo.

// Ejemplo de Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Qué se considera modificar un estado:

  1. Escribir a variables de estado.
  2. Emisión de eventos (opens in a new tab).
  3. Creación de otros contratos (opens in a new tab).
  4. Uso de selfdestruct.
  5. Enviae ethers mediante llamadas.
  6. Llamar a cualquier función no marcada como view o pure.
  7. Usar llamadas de bajo nivel.
  8. Utilizando un ensamblaje en línea que contiene ciertos códigos de operador.

Funciones constructoras

Las funciones constructor solo se ejecutan una vez cuando el contrato se implementa por primera vez. Al igual que constructor en muchos lenguajes de programación basados en clases, estas funciones a menudo inicializan las variables de estado con sus valores especificados.

# Ejemplo en Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Funciones incorporadas

Además de las variables y funciones que define en su contrato, hay algunas funciones especiales integradas. El ejemplo más obvio es:

  • address.send() – Solidity
  • send(address) – Vyper

Esto permite que los contratos envíen ETH a otras cuentas.

Escribir funciones

Su función necesita:

  • parámetro de la variable y tipo de variable (si acepta parámetros)
  • declaraciónde variable interna/externa
  • declaración de variable de tipo pure/view/payable
  • devuelve el tipo (valor, en caso de devolución)

Un contrato completo podría verse así. Aquí la función constructor proporciona un valor inicial para la variable dapp_name.

Eventos y registros

Los eventos permiten que su contrato inteligente se comunique con su interfaz o frontend, u otras aplicaciones de suscripción. Una vez que una transacción es validada y se agrega a un bloque, los contratos inteligentes pueden emitir eventos y registrar información, que la frontend puede procesar y utilizar.

Ejemplos anotados

Estos son algunos ejemplos escritos en Solidity. Si le gustaría jugar con el código, puede interactuar con ellos en Remix (opens in a new tab).

Hola, mundo

Token

Activo digital único

Lecturas adicionales

Revise la documentación de Solidity y Vyper para ver una descripción más completa de los contratos inteligentes:

¿Te resultó útil este artículo?