No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Declaración de funciones en Solidity

10/21
Recursos

Al igual que en cualquier lenguaje de programación, las funciones son piezas de código que se encargan de ejecutar instrucciones de forma independiente. Dentro de Solidity son importantes, pues son el vehículo para que clientes interactúen directamente con los smart contracts.

Declaración de funciones en Solidity

Las funciones son también denominadas métodos en la programación orientada a objetos o procedimientos, si las mismas no devuelven un valor. Todos son términos que se refieren a lo mismo, instrucciones para realizar una tarea en particular.

La sintaxis de una función en Solidity tiene algunas particularidades con respecto a otros lenguajes y hasta permite escribirse de formas diferentes:

function multiplication(int a, int b) returns(int) {
    return a * b;
}
function multiplication(int a, int b) returns(int product) {
    product = a * b;
}

En primer lugar, la palabra reservada returns (en plural) indica el tipo de dato de retorno y se requiere un return (en singular) para devolver el mismo. En el segundo ejemplo, el returns indica, además del tipo de dato, la variable que será devuelta, debiendo declararse la misma para que la función la retorno y no es necesario el return.

Si algo está mal en la declaración de una función, el compilador de Solidity nos notificará y no podremos compilar ni desplegar nuestro contrato. Solidity, al ser un lenguaje fuertemente tipado, nos anticipa a posibles errores que nuestro código pueda tener.

Visibilidad de las funciones

Las funciones al igual que las variables, pueden implementar los tipos de visibilidades public, private, internal y external. Por defecto, las funciones son todas públicas.

Son más importante sobre la visibilidad de las funciones, es el poder utilizarlas o no desde afuera del contrato. Si desplegamos el siguiente contrato en remix:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract ExampleContract {

    function multiplicationPublic(int a, int b) public returns(int) {
        return a * b;
    }

    function multiplicationPrivate(int a, int b) private returns(int) {
        return a * b;
    }
}

Veremos lo siguiente:
image.png
Si bien las dos funciones son iguales, la pública puede ser accedida y el entorno de Remix nos permite utilizarla. La función privada, no es visible desde afuera del contrato.

Tipos de funciones

Además de la visibilidad de las funciones, una característica que Solidity implementa es la posibilidad de que cada función tenga un tipo diferente a partir de su comportamiento. Podemos diferenciar tres tipos:

  • view: Funciones que solo leen y devuelven dato, no realizan ningún tipo de lógica.
  • pure: Funciones que siempre devuelven un valor de forma determinista. Por ejemplo, una función de suma siempre devolverá el mismo resultado ante una misma entreda.
  • payable: Funciones especiales capaces de enviar o recibir ETH.

Exploremos cada una de estos tipos de funciones un poco más.

Funciones del tipo vista

Las funciones view pueden considerarse similares a los getters en la programación orientada a objetos. Devuelven un valor y nada más.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract ExampleContract {

    string saludo = "Bienvenido a Platzi!";

    function saludar(int a, int b) public view returns(string) {
        return saludo;
    }
}

La función saludar() es marcada como view y solo devuelve el valor de una variable. Es importante también tener en cuenta que las funciones del tipo view no consumen gas.

Funciones puras

En el mundo de la programación, en general, las funciones puras realizan una tarea y devuelven siempre el mismo valor para una misma entrada. Pero no modifican el valor de ninguna variable, o sea, no cambian el estado del contrato.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract ExampleContract {

    function multiplication(int a, int b) public pure returns(int) {
        return a * b;
    }
}

La función multiplication() es marcada como pure debido a que siempre devolverá el mismo resultado al multiplicar los mismos dos números. Esta función si consume gas debido a que realiza un procesamiento.

Funciones pagables

Posiblemente las funciones más importantes de todo contrato inteligente. Las funciones payable son las únicas de todo el contrato que tienen permitido enviar o recibir Ether.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract SendETH {
    
    function sendETH(address payable receiver) public payable {
        receiver.transfer(msg.value);
    }
}

La función enviará los ETH que reciba utilizando la función transfer() de una dirección también marcada como payable.

Si despliegas el contrato en Remix, puedes enviar ETH a una dirección de la siguiente manera:

image.png

Observa que luego de desplegar el contrato inteligente en Remix, la función del tipo payable se marca en color rojo. Lo primero que debes hacer es seleccionar una cuenta de la lista que el entorno provee para hacer pruebas.

Selecciona la unidad que quieres enviar, pudiendo ser Ether, Wei o Gwei. Recuerda que un ETH es equivalente a 1.000.000.000.000.000.000 Wei mientras que también es equivalente a 1.000.000.000 Gwei. Finalmente, agrega el monto en el campo value para poder hacer clic en el botón rojo y enviar el Ether. Recuerda que la función recibe por parámetro la dirección de otra cuenta.

Anímate a enviar ETH a otra cuenta de prueba de la lista que Remix provee y habrás logrado tu primera transacción en un contrato inteligente.

Conclusión

Estas son las características de las funciones que debes dominar. Desde su sintaxis, visibilidad y los diferentes tipos. Son elementales para poder crear contratos con una correcta funcionalidad que integren aplicaciones sin generarle ningún problema a los usuarios ni a sus propios creadores.


Contribución creada por: Luis Enrique Herrera y Kevin Fiorentino (Platzi Contributors).

Aportes 20

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

Keywords

  • payable: La usamos cuando necesitamos dentro de una función enviar ether alguna dirección de la blockchain
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Fund {
    function sendEther(address payable receiver) public payable {
        receiver.transfer(msg.value);
    }
}
  • view : La usamos para definir que una función no va modificar las variables de estado, sino que sólo las puede leer.
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Asset {
    string name = "PlatziCoin";

    function getName() public view returns (string memory) {
        return name;
    }
}
  • pure: Se usa para definir que una función no lee ni modifica ninguna de las variables de estado y además no usa ninguna variable global
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Sum {
    int256 number = 100;

    function sum(int256 a, int256 b) public pure returns (int256 result) {
        result = a + b;
    }
}

Function Modifiers

Los Function Modifiers (modificadores) pueden ser utilizados para cambiar el comportamiento de la función en una manera declarativa. Algunos modifiers que se tienen por defecto para las funciones son los siguientes:

  • pure: Deshabilita la modificación o el acceso del estado dentro de la función.
  • view: Deshabilita la modificación del estado dentro de la función.
  • payable: Habilita a la función a recibir Ether en conjunto con una llamada (call)

Interesante curso y me gusta cómo explica el profesor

Payable: Se usa cuando se debe enviar Ether a alguna otra dirección dentro de una función
View: Se usa para indicar que una función no va a modificar las variables de estado del contrato sino que solo las va a leer
Pure: Se usa para indicar que una función no lee ni modifica ninguna variable estado del contrato y además no usa ninguna variable global

Si estás enviando Ether pero ninguna cuenta aumenta

Me pasaba que las cuentan solo disminuían de Ether, al contrario del video. Lo que hay que hacer es asegurarse de NO ESTAR HACIENDO LA TRANSACCIÓN CON ESA CUENTA, ya que se manda Ether a uno mismo (+ costos)

Functions on Solidity

function functionName(parameters) returns(variableType variableToReturn){
instructions
}

Functions visibility

  • Public ⬅️➡️📜
  • Private ➡️📜
  • Internal ➡️📜
  • External ⬅️📜

Keywords

  • payable: when you need to send ether to some address
  • view: read only
  • pure: no read, no modify and no use of global variables

Documentación Solidity en Español

Click en este link

si no se escribe ningun keyword, el keyword por defecto es ‘non-payable’

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Number {
    //Public function
    function getNumber() public returns (int number){
        number = 1948;
    }
    function changeNumber() public returns (int number){
        number = getNumber() * -1;
    }
    
    //Private function
    function getNumberPrivate() private returns (int number){
        number = 1948;
    }
    function changeNumberPrivate() public returns (int number){
        number = getNumber() * -1;
    }
    //Payable function
    function sendEther(address payable receiver) public payable{
        receiver.transfer(msg.value);
    }
    //View function
    string name = "Nicolas";
    function getName() public view returns (string memory){
        return name;
    }
    //puere function 
    int number = 100;
    function sum(int a, int b) public pure returns(int result){
        result = a + b + number;
    }
}
// SPDX-License-Identifier: GPL-3.0

pragma solidity >= 0.7.0 <0.9.0;

contract projectFundPlatzi{
    string public name;
    bool public isFundable;
    uint public marketCap;
    
    constructor(
        string memory _name
        ){
            name = _name;
            isFundable = true;
            marketCap = 0;
        }
    
    function fundProject(address payable reciever) public payable{
        if (isFundable == true){
            reciever.transfer(msg.value);
            marketCap = marketCap + msg.value;
        }
    }
    
    function changeProjectState() public {
        if (isFundable == true){
            isFundable = false;
        } else if (isFundable == false){
            isFundable = true;
        }
    }
    
    function getMarketCap() public view returns (uint){
        return marketCap;
    }
}

Funciono es -> entrada - proceso - salida

**ESTRUCTURA BASICA DE LA FUNCION :** ```js function nombreDeLaFuncion(tipos_de_datos parámetros) public/private returns (tipo_de_dato) { // Cuerpo de la función } ```Tipos de funciones 1. **Pública** (`public`): Cualquiera puede llamar a la función, ya sea dentro o fuera del contrato. 2. **Privada** (`private`): Solo se puede llamar desde dentro del contrato. 3. **Interna** (`internal`): Solo puede ser llamada por el contrato actual o por contratos que lo hereden. 4. **Externa** (`external`): Solo puede ser llamada desde fuera del contrato.
Estructura basi de una funcion: `function nombreDeLaFuncion(tipos_de_datos parámetros) public/private returns (tipo_de_dato) { // Cuerpo de la función }`

el archivo “Number.sol” me genero un warning, solo agregue “pure” a las funciones y ya quedo listo. Según entiendo porque al no recibir variables ni modificar nada seria mas correcto agregar un pure y por eso el warning que no deja desplegar el contrato.

function getNumber() private pure returns ( int number) {

}

Y recuerden amigos, sólo las funciones de tipo payable pueden enviar ether!

Algunas imágenes estan caidas 😦

Para que al cambiar getNumber() de pública a privada, se actualice en nuestra terminal de RemixIDE, debemos clickear en el cesto de basura que figura a la derecha de “Deployed Contracts” o, de lo contrario, no se implementará el cambio realizado en la función aunque volvamos a compilar y desplegar.

Rxcelente explicacion. Gracias

RESUMEN CLASE 10:
FUNCIONES

  • Son secciones de un programa que se encargan de ejecutan instrucciones de forma independiente

  • Las funciones dentro de solidity juegan un papel muy importante, gracias a ellas los usuarios

I.- Visibilidad de las funciones

  • Public ✔️

  • Private ✔️

  • Internal: Dentro del Smart Contract

  • External: Fuera del Smart Contract

II.- Keywords

  • payable

  • view

  • pure

III.- Ejemplos

Sum.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Sum {
    int256 number = 100;

    function sum(int256 a, int256 b) public pure returns (int256 result) {
        result = a + b;
    }
}

Fund.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Fund {
    function sendEther(address payable receiver) public payable {
        receiver.transfer(msg.value);
    }
}

Name.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Asset {
    string name = "PlatziCoin";

    function getName() public view returns (string memory) {
        return name;
    }
}

Number.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Number {
    
    function getNumber() private returns (int number) {
        number = 1948;
    }

    function changeNumber() public returns (int number) {
        number = getNumber() * -1;
    }
}

No se han preguntado porque el profe dejo de mostrar su camara? 😦