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.0pragma 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:
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.0pragma 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.0pragma 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.0pragma 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:
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).
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
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.0pragma solidity >=0.7.0<0.9.0;contract Sum{ int256 number =100;functionsum(int256 a, int256 b)public pure returns(int256 result){ result = a + b;}}
Waaao buen aporte bro, muy bien explicado
genial aporte gracias
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
Alguien presenta este problema? a qué se puede deber?
functiongetNumber()publicreturns(int number){Relevant source part starts here and spans across multiple lines
Podrías compartirnos más info del código para descubrir el error ?
hace falta agregar un pure
function getNumber() public pure returns (int number){
number = 1948;
}
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)
payable: when you need to send ether to some address
view: read only
pure: no read, no modify and no use of global variables
Para que sirve "return" y "returns" exactamente?, cuales son sus funciones?, que hacen?
El "returns" que se agrega en el encabezado de la función es para indicarle a esta que vas a devolver algún valor, lo indispensable es que declares el tipo de dato que vas a devolver por ejemplo
returns(uint, bool)
Ya para el "return" dentro del cuerpo de la función es para que la función devuelva el valor que estas retornando.
Cual seria un caso de uso del tipo de función pure en algún smart contract del mundo real?
El pure yo lo veo para código que se puede ejecutar ahí mismo sin necesidad de tocar la red de blockchain. Por ejemplo una multiplicación en una función no necesita que hagas nada en la blockchain
es posible utilizar las funciones de un router como pancakeswap?
Excelente pregunta César !, Claro que se puede, en solidity puedes importar otros contratos, lo que tendrías que hacer es importarlo en tu smart contract y listo puedes usar las funciones de pancakeswap dentro de tu smart contract
Documentación Solidity en Español
Click en este link
Es del 2017 bro, no la mantienen. Con el traductor de google podes traducir la oficial y siempre que tengas dudas la destraducis y lees la original, si no le haces mucho al ingles, bueno, busca eso que no se tradujo bien en otro sitio, es la dificultad de querer aprender siendo latino xd, y ensima aqui te enseñan pero como que no tanto.
@Meliodas-s y de paso Jimmy, https://soliditylang.readthedocs.io/es/latest/
aquí está una traducción parcial de la versión más actualizada de solidity. No está todo traducido pero pues está traducido lo importante para no perderse
si no se escribe ningun keyword, el keyword por defecto es 'non-payable'
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0<0.9.0;contract Number{//Public functionfunctiongetNumber()publicreturns(int number){ number =1948;}functionchangeNumber()publicreturns(int number){ number =getNumber()*-1;}//Private functionfunctiongetNumberPrivate()privatereturns(int number){ number =1948;}functionchangeNumberPrivate()publicreturns(int number){ number =getNumber()*-1;}//Payable functionfunctionsendEther(address payable receiver)public payable{ receiver.transfer(msg.value);}//View function string name ="Nicolas";functiongetName()public view returns(string memory){return name;}//puere function int number =100;functionsum(int a, int b)public pure returns(int result){ result = a + b + number;}}
payable: Para pagar ether
view: para funciones de solo lectura
pure: La funcion no lee ni modifica variables de estado, sin variables de estado.
Asi?
que interesante, cual uso creen que se le de a las funciones externas?
Generalmente las funciones externas son usadas en casos muy similares a los casos de uso de las funciones públicas cuando no necesitamos llamar la función internamente, una función external es más eficiente en gas, porque no copia los argumentos de la función a memoria sino que los mantiene en calldata
por que y cual es el fin de usar memory en el returns?
Los datos que almacenamos en memory se almacenan solo mientras la función está en ejecución, al añadir memory nos aseguramos de que esta variable no quedara almacenada en el storage del contrato y podremos optimizar el costo en gas de nuestro contrato
La función payable no me envía ether pero si me los descuenta, '¿Por que?
La función de tipo payable va a descontar de la wallet que llama la función los ethers y los va a enviar a la variable que pasemos como parámetro dentro de la función, revisa si esa variable es la dirección de una wallet válida
Hola, tengo una consulta, escribi el codigo del contrato Number tal cual aparece y me sale una Warning: Function state mutability can be restricted to pure en la fila de function getNumber().
Compila igualmente, pero no sé qué significa ese warning
Hola 👋🏼
Es una advertencia de seguridad, que como bien dices no evita que el código compile, pero es importante prestarle atención.
Básicamente, se refiere que la función puede ser declarada como pure es decir, es una función que no lee información de ningún lugar solamente utiliza variables que existen dentro de ella.
Te recomiendo darle un vistazo a la clase sobre funciones y visibilidad de funciones del curso de Solidity.