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)publicreturns(int){
return a * b;
}
function multiplicationPrivate(int a, int b)privatereturns(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.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.
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).
Aportes 20
Preguntas 9
Ordenar por:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
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(addresspayablereceiver) 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.0pragma 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;
functionsum(int256 a, int256 b) publicpure returns (int256 result) {
result = a + b;
}
}
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)
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)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Number {
//Publicfunctionfunction getNumber() public returns (intnumber){
number = 1948;
}
function changeNumber() public returns (intnumber){
number = getNumber() * -1;
}
//Privatefunctionfunction getNumberPrivate() private returns (intnumber){
number = 1948;
}
function changeNumberPrivate() public returns (intnumber){
number = getNumber() * -1;
}
//Payable functionfunction sendEther(address payable receiver) public payable{
receiver.transfer(msg.value);
}
//View function
string name = "Nicolas";
function getName() public view returns (string memory){
returnname;
}
//puere functionintnumber = 100;
functionsum(int a, int b) publicpure returns(int result){
result = a + b + number;
}
}
**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) {
…
}
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.
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;
functionsum(int256 a, int256 b) publicpure 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(addresspayablereceiver) public payable {
receiver.transfer(msg.value);
}
}
Name.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;
contract Asset {
string name = "PlatziCoin";
function getName() public view returns (string memory) {
return name;
}
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?