Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| bc:solidity [2024/09/18 14:29] – thejuanvisu | bc:solidity [2024/09/25 14:04] (actual) – thejuanvisu | ||
|---|---|---|---|
| Línea 71: | Línea 71: | ||
| + | ==== Enums ==== | ||
| + | Permite la creación de un tipo de datos personalizado con un conjunto de valores constantes de la siguiente manera: | ||
| + | <code c> | ||
| + | contract Enum{ | ||
| + | enum Semana{ | ||
| + | Lunes, //devuelve 0 | ||
| + | Martes, //devuelve 1 | ||
| + | Miércoles, //devuelve 2 | ||
| + | Jueves, //devuelve 3 | ||
| + | Viernes, //devuelve 4 | ||
| + | Sábado, //devuelve 5 | ||
| + | Domingo //devuelve 6 | ||
| + | } | ||
| + | | ||
| + | Semana public semana; | ||
| + | | ||
| + | //función para obtener el valor del enum | ||
| + | function get() pulic view returns (Semana){ | ||
| + | return semana; | ||
| + | } | ||
| + | | ||
| + | //función para modificar el enum | ||
| + | function set(Semana _semana) public{ | ||
| + | semana = _semana; | ||
| + | } | ||
| + | | ||
| + | // | ||
| + | function domingo() public{ | ||
| + | semana = Semana.domingo | ||
| + | } | ||
| + | | ||
| + | //devolver al primer valor | ||
| + | function reset() public{ | ||
| + | delete semana | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Arrays ==== | ||
| + | Permiten almacenar una colección de elementos del mismo tipo, facilita su ordenación, | ||
| + | <code c> | ||
| + | //Array de longitud fija de 10 elementos de tipo uint | ||
| + | uint[10] ArrayFijo; | ||
| + | |||
| + | //Array de longitud fija de 10 elementos de tipo string | ||
| + | sting[10] ArrayString; | ||
| + | |||
| + | //array dinámico | ||
| + | uint[] ArrayDinamico; | ||
| + | |||
| + | //array dinámico de structs | ||
| + | Persona[] personas; | ||
| + | </ | ||
| + | |||
| + | Para manejar Array dinámicos disponemos de las siguientes operaciones: | ||
| + | <code c> | ||
| + | //añadir struct de tipo persona al array | ||
| + | personas.push(manuel); | ||
| + | |||
| + | //crear e insertar un objeto struct al array | ||
| + | personas.push(Persona(34, | ||
| + | </ | ||
| + | |||
| + | ==== Funciones ==== | ||
| + | Las funciones nos permiten modularizar y optimizar el código creando pequeñas funcionalidades personalizadas. En Solidity un ejemplo de función sería el siguiente: | ||
| + | <code c> | ||
| + | //function <nombre de la función> | ||
| + | function nombreFuncion(String memory _nombre, uint _cantidad) public{ | ||
| + | //contenido de la función | ||
| + | } | ||
| + | | ||
| + | //llamada a la función | ||
| + | nombreFuncion(" | ||
| + | </ | ||
| + | |||
| + | Las funciones son siempre públicas de forma predeterminadas lo cual no es muy seguro contra ataques, por lo que se suele recomendar marcarlas como " | ||
| + | * pure: prohíbe el acceso o modificación del estado | ||
| + | * view: deshabilita cualquier modificación de estado | ||
| + | * payable: permite el pago de Ether (ETH) con una llamada | ||
| + | * virtual: este modificador permite cambiar el comportamiento de la función o contratos derivados | ||
| + | * override: Esta función cambia el comportamiento de otra función o contrato. | ||
| + | |||
| + | |||
| + | ==== Funciones útiles ==== | ||
| + | === Devolver variables y valores === | ||
| + | <code c> | ||
| + | String dato = " | ||
| + | function decirDato() public returns (string memory){ | ||
| + | return dato; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Modificadores === | ||
| + | <code c> | ||
| + | function _MultiplicacionIntegers(uint x, uint y) private pure returns (uint){ | ||
| + | return x*y; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Hashing ==== | ||
| + | Una función hash asigna una entrada a una identificación única determinista. cualquier modificación en dicha entrada modificará el valor hash. Sirve para generar números pseudoaleatorios. Ethereum tiene las siguientes funciones hash: | ||
| + | * SHA-256 | ||
| + | * RIPEMD-160 | ||
| + | * keccak256 | ||
| + | |||
| + | Se puede llamar a estas funciones hash de la siguiente forma: | ||
| + | < | ||
| + | keccak256(abi.encodePacked(" | ||
| + | </ | ||
| + | |||
| + | ==== Evetos ==== | ||
| + | Permiten que el Smart Contract reporte que algo ha sucedido en la blockchain al front end de su aplicación. Un evento se puede implementar de la siguiente forma: | ||
| + | < | ||
| + | event IntegerAdded(uint x, uint y, uint result); | ||
| + | function add(uint _x, uint _y) public returns (uint){ | ||
| + | uint result = _x + _y; | ||
| + | emit IntegersAdded(_x, | ||
| + | return result; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Mapas ==== | ||
| + | Tipos de datos complejos similares a las hashtables. En el siguiente ejemplo se puede ver como se alamcena un uint con el saldo de un usuario. El tipo de datos address almacena la clave y uint el valor. | ||
| + | < | ||
| + | mapping(address => uint) public saldo; | ||
| + | </ | ||
| + | |||
| + | ==== Variables especiales y funciones ==== | ||
| + | msg.sender(address): | ||
| + | |||
| + | < | ||
| + | contract NumeroFavorito { | ||
| + | mapping(address=> | ||
| + | | ||
| + | function establecerNumero(uint _numero) public{ | ||
| + | numeroFavorito[msg.sender] = _myNumber; | ||
| + | } | ||
| + | | ||
| + | function CualEsMiNumeroFavorito() public view returns (uint){ | ||
| + | return numeroFavorito[msg.sender]; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Estructuras de control ==== | ||
| + | * if-else | ||
| + | * while | ||
| + | * do-while | ||
| + | * for | ||
| + | |||
| + | < | ||
| + | if(x<1){ | ||
| + | return 0; | ||
| + | } else if (x=0){ | ||
| + | return 1; | ||
| + | } else{ | ||
| + | return 2; | ||
| + | } | ||
| + | </ | ||
| ===== Hola Mundo en un Smart Contract ===== | ===== Hola Mundo en un Smart Contract ===== | ||
| Línea 85: | Línea 247: | ||
| </ | </ | ||
| Tras eso iremos a la pestaña de solidity compiler y le daremos a compile: | Tras eso iremos a la pestaña de solidity compiler y le daremos a compile: | ||
| + | <wrap column 100%> | ||
| {{: | {{: | ||
| + | </ | ||
| Después nos movemos a la pestaña de Deploy and Run Transactions y le damos a deploy: | Después nos movemos a la pestaña de Deploy and Run Transactions y le damos a deploy: | ||
| + | <wrap column 100%> | ||
| {{: | {{: | ||
| + | </ | ||
| Finalmente podemos ir a la pestaña de Deployed Contracts, seleccionar el contrato que acabamos de enviar y pulsar en el botón greet para ver e mensaje; | Finalmente podemos ir a la pestaña de Deployed Contracts, seleccionar el contrato que acabamos de enviar y pulsar en el botón greet para ver e mensaje; | ||
| + | <wrap column 100%> | ||
| {{: | {{: | ||
| + | </ | ||
| + | |||
| + | |||