No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

脷ltima oportunidad para asegurar tu aprendizaje por 1 a帽o a precio especial

Antes: $249

Currency
$189/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscr铆bete

Termina en:

0D
23H
30M
12S

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 18

Preguntas 9

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

驴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 鈥榥on-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

el archivo 鈥淣umber.sol鈥 me genero un warning, solo agregue 鈥減ure鈥 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 鈥淒eployed 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? 馃槮