ETH Kipu
  • Ethereum Developer Pack
  • Módulo 1
    • Intro a Smart Contracts
      • Fundamentos de Blockchain
        • Antecedentes
        • Bitcoin
        • Qué es Blockchain
        • Conceptos Clave en Blockchain
        • Cómo funciona la Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • El nuevo Internet
        • Web 3
        • Elementos Fundamentales
        • Impacto de Ethereum en Diversos Sectores
      • Wallets
        • Componentes de una wallet
        • Tipos de Wallet
        • Códigos mnemónicos
      • Ethereum 101
        • Smart Contracts
        • Cuentas
          • Tipos de cuentas
          • Contenido de cuentas
        • Transacciones
          • Componentes
          • Ciclo de vida
        • Gas
        • Solidity
        • EVM
          • La máquina de estados
          • Opcodes
          • Cómo funciona la EVM
          • Clientes de ejecución
          • DApps
      • Blockchain Explorer
        • Funciones de un blockchain explorer
        • Beneficios de utilizar un blockchain explorer
      • Remix
        • Características de Remix
        • Workspaces o espacios de trabajo
        • Cargar y compilar un contrato
        • Desplegar en la máquina virtual de Remix (Remix VM)
        • Interactuando con funciones
        • Desplegar en una red pública
      • Crea tu primer Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Datos
      • Funciones
      • Variables
        • Ejercicio 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Ejercicio 3
      • Convenciones de nomenclatura
      • Tipos de almacenamiento para variables
      • Estructuras de Control
        • Ejercicio 4
      • Modificadores
      • Eventos
        • Ejercicio 5
      • Tipos de Referencia
        • Arrays
          • Ejercicio 6
        • Mappings
          • Ejercicio 7
        • Structs
          • Ejercicio 8
      • Address Payable
      • Cómo reciben Ether los contratos y funciones
      • Transferencias de Ether
      • Conceptos Avanzados
        • Codificación ABI
        • Hashing
        • This
        • Herencia
        • Abstract
        • Interface
        • Llamadas entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • Estándares, Librerías y Patrones
      • Buenas Prácticas de Diseño
      • Patrones de Diseño
      • EIP y ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crea un Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Toolkit para desarrollo en Ethereum
      • Requisitos para el módulo 4
        • Terminal
        • Git y Github
        • Node.js y npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Ejercicio
        • Hardhat
          • Despliegue de un contrato en Hardhat
          • Despliegue de un contrato en una red pública
        • Scaffold-ETH
          • Características
          • Cómo instalar Scaffold-ETH
  • Módulo 5
    • Seguridad, Pruebas y Auditoría
      • Pruebas
        • Importancia de realizar pruebas
        • Métodos para probar contratos inteligentes
          • Pruebas automatizadas
          • Pruebas manuales
        • Conceptos importantes en testing
        • Herramientas para testing
        • Testing con Hardhat
        • Recursos adicionales
      • Seguridad
        • Una mentalidad distinta de diseño
        • Principales vulnerabilidades en smart contracts
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Ruptura de invariantes)
          • Mishandling of ETH (Mal manejo de ETH)
          • Denial of Service (DoS - Denegación de Servicio)
          • Integer overflow and underflow (desbordamiento y subdesbordamiento de enteros)
          • Phishing y Typosquatting
        • Recursos adicionales
      • Auditoría de smart contracts
        • Proceso de Auditoría
        • Herramientas
        • Cómo prepararse para una auditoría
        • El test Rekt
        • Retos
        • Recursos adicionales
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Visibilidad de funciones
  • Indicadores de mutabilidad o comportamiento
  • Estructura de una función en Solidity
  • Otros aspectos relevantes de las funciones

Was this helpful?

  1. Módulo 2
  2. Fundamentos de Solidity

Funciones

En Solidity, las funciones son las unidades ejecutables de código. Cada función es un procedimiento o método que puede ser llamado interna o externamente para realizar alguna tarea o calcular y devolver valores.

Visibilidad de funciones

La visibilidad de una función indica desde donde puede ser llamada. Existen cuatro tipos de visibilidades.

  • Public: Accesible desde dentro y fuera del contrato. Si no se especifica la visibilidad de una función, por defecto es public.

  • External: Solo accesible desde fuera del contrato. No pueden ser llamadas internamente (directamente) dentro del mismo contrato. Sin embargo, pueden ser invocadas internamente usando this.functionName().

    Su uso correcto puede llevar a ahorros significativos de gas. Si sabemos que la función sólo será llamada desde fuera, es más eficiente utilizar external. Son ideales para funciones que deben ser expuestas como parte de la interfaz del contrato (ABI - Application Binary Interface).

  • Internal: Accesible solo desde dentro del contrato y sus contratos derivados. Son útiles para compartir funcionalidades entre contratos en una jerarquía de herencia.

  • Private: Solo accesible desde dentro del contrato en el que está definida. Son útiles para lógica interna que no se supone que sea accesible para otros contratos o entidades externas.

A continuación se muestra la forma en que se indica la visibilidad de las funciones en un contrato.

contract MyContract {
uint private data;

function publicFunction() public {
    // accesible desde cualquier parte
}

function privateFunction() private {
    // solo accesible dentro de este contrato
}

function internalFunction() internal {
    // accesible dentro de este contrato y contratos heredados
}

function externalFunction() external {
    // solo accesible desde fuera del contrato
}

}

🚨 La elección adecuada de la visibilidad de las funciones es crucial para la seguridad y la optimización del gas. Por ejemplo, funciones que no necesitan ser expuestas deben marcarse como private o internal.

🚨 La visibilidad incorrecta puede llevar a vulnerabilidades. Por ejemplo, una función que modifica el estado del contrato y está marcada erróneamente como public puede ser explotada.

Indicadores de mutabilidad o comportamiento

Sirven para indicar si la función hace cambios en el almacenamiento persistente (storage) del contrato, también indica si la función puede recibir Ether.

Se utilizan tres indicadores en este caso:

  • Pure: Indica que la función no accede ni modifica el storage del contrato.

  • View: Similar a pure, pero puede leer el storage del contrato sin modificarlo.

  • Payable: Permite que la función reciba Ether junto con una llamada a la función.

Estructura de una función en Solidity

Estos son los elementos que conforman una función:

  • Palabra Clave function: Toda función comienza con la palabra clave function, indicando el inicio de una definición de función.

  • Nombre de la Función: Seguido de function, se coloca el nombre de la función. Debe ser único dentro del contrato y seguir las convenciones de nomenclatura de Solidity (generalmente camelCase).

  • Parámetros (Opcionales): Entre paréntesis, se definen los parámetros de entrada de la función, si los hay. Cada parámetro consta de un tipo de dato seguido de un nombre de variable. Los parámetros están separados por comas.

  • Visibilidad de la Función: A continuación, se especifica la visibilidad de la función (public, private, internal, external). Esto determina cómo y desde dónde se puede acceder a la función.

  • Modificadores (Opcionales): Los modificadores son palabras clave o nombres de modificadores personalizados que afectan el comportamiento de la función: .pure,view,payable .

  • Valores de Retorno (Opcionales): Después de los modificadores, se puede especificar el tipo de valor o valores que la función devuelve, encerrado entre la palabra clave returns y paréntesis. Si se devuelven múltiples valores, se separan por comas.

  • Cuerpo de la Función: El cuerpo de la función está encerrado entre llaves {}. Aquí es donde se escribe la lógica que se ejecutará cuando se llame a la función.

Otros aspectos relevantes de las funciones

Las funciones payable son una característica única de Solidity que permite a los contratos recibir y manejar Ether, la criptomoneda nativa de Ethereum.

💡 Las funciones consumen gas, que es la unidad de medida para el costo computacional en Ethereum. El gas necesario depende de la complejidad de las operaciones realizadas por la función. Por ello es importante realizar una programación eficiente en consumo de gas.

🥸 Solidity soporta la sobrecarga de funciones (overload), lo que significa que puedes tener múltiples funciones con el mismo nombre pero con diferentes parámetros.

contract ExampleContract {
    uint private counter;

    // Una función pública que incrementa el contador
    function incrementCounter() public {
        counter++;
    }

    // Una función de vista que devuelve el valor actual del contador
    function getCounter() public view returns (uint) {
        return counter;
    }
}

En este ejemplo, incrementCounter es una función pública que modifica el estado del contrato, y getCounter es una función de vista que simplemente devuelve el valor del contador sin modificar el estado del contrato.

PreviousTipos de DatosNextVariables

Last updated 1 month ago

Was this helpful?