A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de Introducci贸n a Solidity

Curso de Introducci贸n a Solidity

Sebasti谩n Leonardo Perez

Sebasti谩n Leonardo Perez

Funciones

9/21
Recursos

Aportes 10

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Funciones

Son piezas de c贸digo definidas por un nombre, par谩metros y modificadores.

function <name>(<type> <parameter>..., [..., ]>) 
  <access modifiers>
  <mutability modifiers>
  <user defined modifiers> 
  <returns>(<type>) {
    <content>
}
  • name: Nombre de la funci贸n
  • type: Tipo de dato
  • parameter: Nombre del par谩metro
  • access modifier: public, private, internal, external
  • mutability modifier: view, pure. Ambas hacen que la funci贸n no cobre gas, y si se omite, se asume que es una funci贸n que escribe en el storage de la EVM
  • user defined modifiers: Son modificadores definidos por el usuario, son opcionales y se presentan en la siguiente clase
  • returns: Indica que la funci贸n retornar谩 uno o m谩s datos

Algunos puntos a pulir:

  • Las funciones pure. No leen ni modifican variables de estado y tampoco usan ninguna variable global.
  • Existen funciones payable. Estas se usan cuando la funci贸n env铆a ether a alguna direcci贸n en la blockchain. Solo las funciones con tipo de retorno 鈥減ayable鈥 est谩n habilitadas para enviar ether.

Convenciones no obligatorias

  • En el desarrollo Solidity existe una convenci贸n no obligatoria y es que todos los par谩metros de una funci贸n empiecen con gui贸n bajo.
 function Suma( uint _numero1, uint _numero2 ) public pure returns (uint) {
         return sumaInterna(_numero2, _numero2);
     }

Como digo, es solo una convenci贸n no obligatoria pero si pretendemos entrar a este mundo hay que seguir las convenciones.

Tipos de funci贸n

  • public: son accesibles desde todo 谩mbito posible.
  • private: solo son accesibles desde el mismo contrato.
  • internal: solo son accesibles desde el mismo contrato y sus contratos derivados.
  • external: solo accesibles desde fuera del contrato.

Declaraci贸n completa de la funci贸n:

// palabra clave o declaraci贸n - function
// nombre - Suma
// par谩metros - ( uint numero1, uint numero2 )
// Modificador de acceso - public
// Tipo de funci贸n - pure
// Tipo de retorno - returns (uint)
function Suma( uint numero1, uint numero2 ) public pure returns (uint) {
     return numero1 + numero2;
 }

Un m茅todo no es lo mismo que un procedimiento鈥

  • M茅todo es un t茅rmino de la programaci贸n orientada a objetos, hace referencia a una funci贸n que pertenece a una clase.

  • Una funci贸n devuelve un valor.

  • Un procedimiento ejecuta una serie de acciones (t铆picamente hace mutar las variablesque definen el estado) y no devuelve nada.

Propongo una variante utilizando un evento para emitir el resultado de la suma y utilizar la funci贸n ObtenerResultado.

// SPDX-License-Identifier: GPL-3.0

pragma solidity >= 0.7.0 < 0.9.0;

contract Functions {

    uint private result;

    function Add(uint number1, uint number2) public pure returns(uint) {
        return InternAdd(number1, number2);
    }

    function InternAdd(uint number1, uint number2) private pure returns(uint) {
        return number1 + number2;
    }

    function GetResult() public view returns(uint) {
        return result;
    }

    event ShowResult(uint result);

    constructor(uint number1, uint number2) {
        result = Add(number1, number2);

        emit ShowResult(GetResult());
    }
}

Entiendo que el c贸digo se puede reducir aun m谩s dejando 煤nicamente la funci贸n suma y emitiendo la llamada de esta funci贸n. Las alternativas son muchas

siento que el profe habla y habla y no entiendo nada.

驴Qu茅 son las funciones en Solidity?

Las funciones son secciones de un programa que se encargar de ejecutar instrucciones de forma independiente. Estas pueden recibir parametros para usarlos dentro del c贸digo y pueden retornar una o m谩s varibales. (Conocido como input y output)

Tienen visibilidad al igual que las variables de estado, pueden ser.

  • Public: Totalmente accesible, sea cual sea el origen.
  • Private: Accesible 煤nicamente a trav茅s de una funci贸n incluida en el mismo contrato.
  • Internal: Accesible 煤nicamente a trav茅s de otra funci贸n incluida en el mismo contrato, o desde una funci贸n de un contrato que deriva del mismo. NO es accesible desde un mensaje de un contrato externo o una transacci贸n externa.
  • External: Accesible desde una cuenta de propiedad externa y a trav茅s de un mensaje (llamada desde otro contrato). No es accesible desde una funci贸n del mismo contrato o uno derivado del mismo.

En la clase no utilizamos la funci贸n 鈥淥btenerResultado鈥 que es de tipo view, para esto podr铆amos modificar la funci贸n 鈥淪uma鈥 y asignar el resultado a la variable privada 鈥渞esultado鈥, luego devolver esa variable. Ser谩 necesaroi que la funci贸n Suma no sea pure.

contract Funciones{

     uint private resultado;

     function Suma( uint _numero1, uint _numero2 ) public returns (uint) {
         resultado = sumaInterna(_numero1, _numero2);
         return resultado;
     }

     function sumaInterna( uint _num1, uint _num2) private pure returns (uint){
         return _num1 + _num2;
     }

     function ObtenerResultado() public view returns (uint){
         return resultado;
     }

 }

Ahora al ejecutar la funci贸n 鈥淥btenerResultado鈥 en el deploy, podemos ver lo que tiene la variable privada (accedemos a ella desde una funci贸n p煤blica).

Pure

Como ninguna funci贸n est谩 modificando el estado de las variables del contrato, simplemente estamos haciendo una suma de los par谩metros. Y como ninguna funci贸n est谩 cambiando el estado del contrato o de variables (tampoco las est谩 consultando). Se puede decir que est谩 en estado puro o 鈥減ure鈥.