html
14.3 Desarrollo de aplicaciones descentralizadas (DApps) en Solidity
El desarrollo de aplicaciones descentralizadas (DApps) en Solidity implica la creación de contratos inteligentes que se ejecutan en la blockchain de Ethereum. A continuación, profundizaremos en los aspectos clave del desarrollo de DApps y proporcionaremos ejemplos detallados de código y explicaciones para ayudarte a comprender mejor el proceso.
Conceptos Básicos de una DApp
Una DApp es una aplicación cuya lógica de backend se ejecuta en una red descentralizada de nodos en lugar de en servidores centralizados tradicionales. Las DApps pueden tener interfaces de usuario similares a las aplicaciones tradicionales, pero interactúan con contratos inteligentes desplegados en la blockchain.
Las DApps constan de los siguientes componentes principales:
- Contrato Inteligente: La lógica de negocio que se ejecuta en la blockchain. En Ethereum, estos se escriben en Solidity.
- Frontend: La interfaz de usuario, que puede estar construida con tecnologías web estándar como HTML, CSS y JavaScript.
- Proveedor de Blockchain: Una conexión a la red de Ethereum, generalmente a través de una biblioteca como
web3.js
oethers.js
.
Ejemplo: Contrato Inteligente de Votación
Vamos a crear un simple contrato inteligente de votación en Solidity. Este contrato permitirá a los usuarios votar por diferentes candidatos y contará los votos.
Contrato Inteligente en Solidity
pragma solidity ^0.8.0 contract Voting { // Struct para representar a un candidato struct Candidate { uint id string name uint voteCount } // Mapping para almacenar la cuenta de votos por candidato mapping(address => bool) public voters mapping(uint => Candidate) public candidates uint public candidatesCount // Evento que es emitido cuando un voto es contado event votedEvent ( uint indexed _candidateId ) constructor() { addCandidate(Alice) addCandidate(Bob) } function addCandidate(string memory _name) private { candidatesCount candidates[candidatesCount] = Candidate(candidatesCount, _name, 0) } function vote(uint _candidateId) public { require(!voters[msg.sender], Ya has votado.) require(_candidateId > 0 _candidateId <= candidatesCount, Candidato no válido.) voters[msg.sender] = true candidates[_candidateId].voteCount // Emitir un evento cuando se cuenta un voto emit votedEvent(_candidateId) } }
Explicación del Contrato Inteligente
- Struct: Se define una estructura llamada
Candidate
que representa a cada candidato con un ID, un nombre y una cuenta de votos. - Mappings: Dos mappings:
voters
para rastrear si una dirección ya ha votado.candidates
para almacenar información sobre los candidatos.
- Constructor: Se llama al constructor para añadir candidatos iniciales al contrato, en este caso, Alice y Bob.
- Funciones:
addCandidate
: Añade un nuevo candidato. Es privada y solo se llama desde el constructor.vote
: Permite a los usuarios votar por un candidato. Esta función verifica que el usuario no haya votado antes y que el ID del candidato sea válido.
- Evento:
votedEvent
se emite cuando se cuenta un voto.
Interacción con el Contrato Inteligente desde el Frontend
Para interactuar con el contrato desde el frontend, usaremos la biblioteca web3.js
. A continuación, se muestra un ejemplo de cómo establecer la conexión y llamar a las funciones del contrato.
Instalación de Web3.js
Primero, instala web3.js
usando npm:
npm install web3
Código JavaScript para interactuar con el contrato inteligente
// Inicializar Web3 const Web3 = require(web3) const web3 = new Web3(Web3.givenProvider http://localhost:8545) // Dirección del contrato desplegado y su ABI const contractAddress = 0x... // Reemplazar con la dirección del contrato const contractABI = [ / ABI del contrato / ] // Crear una instancia del contrato const votingContract = new web3.eth.Contract(contractABI, contractAddress) // Función para votar por un candidato async function vote(candidateId) { const accounts = await web3.eth.getAccounts() const receipt = await votingContract.methods.vote(candidateId).send({ from: accounts[0] }) console.log(Voto emitido:, receipt) } // Función para obtener la información de un candidato async function getCandidate(candidateId) { const candidate = await votingContract.methods.candidates(candidateId).call() console.log(Información del candidato:, candidate) }
Explicación del Código JavaScript
Web3
: Se inicializa la bibliotecaweb3.js
y se conecta a un proveedor de blockchain.- Dirección y ABI del contrato: Necesitas la dirección del contrato desplegado y su ABI (Interfaz Binaria de Aplicación) para interactuar con él. La ABI define cómo se pueden hacer llamadas a las funciones del contrato.
- Instancia del contrato: Se crea una nueva instancia del contrato usando la dirección y la ABI.
- Función
vote
: Permite a un usuario votar por un candidato. La función obtiene la cuenta del usuario y envía una transacción llamando a la funciónvote
del contrato inteligente. - Función
getCandidate
: Recupera la información de un candidato (ID, nombre y cantidad de votos) desde la blockchain.
Con este ejemplo, hemos cubierto los fundamentos del desarrollo de DApps en Solidity, incluyendo la creación de contratos inteligentes y la interacción con ellos desde un frontend. Esta combinación de Solidity y JavaScript proporciona una poderosa herramienta para desarrollar aplicaciones descentralizadas sobre la blockchain de Ethereum.
Deja una respuesta