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.jsoethers.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
Candidateque representa a cada candidato con un ID, un nombre y una cuenta de votos. - Mappings: Dos mappings:
voterspara rastrear si una dirección ya ha votado.candidatespara 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:
votedEventse 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.jsy 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ónvotedel 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