14.3 Desarrollo de aplicaciones descentralizadas (DApps) en Solidity

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 o ethers.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 biblioteca web3.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ón vote 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.

Anterior...Siguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *