Inicia tu camino construyendo la Web3

1

Pre-work para Desarrollo en Blockchain: Primeros Pasos y Herramientas

2

Desarrollo Blockchain: Principios y Oportunidades en Web3

3

Fundamentos de Blockchain y Descentralización

4

Smart Contracts y Web3: Construyendo el Futuro Descentralizado

Conociendo el entorno de desarrollo

5

Introducción al Desarrollo Blockchain: Git, Node.js y Comandos de Terminal

6

Fundamentos de Blockchain: Redes, Lenguajes y Herramientas Esenciales

7

Stack de Web3: Capas y Herramientas para Aplicaciones Descentralizadas

8

Conceptos Básicos de Criptografía para Web3

Desarrollo en Ethereum

9

Programación de Contratos Inteligentes con Solidity

10

Seguridad en Smart Contracts con Open Zeppelin Contracts

11

Fundamentos de la Ethereum Virtual Machine (EVM)

12

Desarrollo de Aplicaciones Blockchain con Solidity y Ethereum

Primeros pasos en Ethereum

13

Creación y gestión de wallets de criptomonedas

14

Redes de Pruebas Blockchain: Uso y Funcionalidad en Desarrollo

15

Creación de Contratos Inteligentes en Remix IDE y Solidity

16

Instalación y Configuración de Hardhat para Contratos en Solidity

17

Compilación y despliegue de contratos inteligentes con Hardhat

18

Conexión de Aplicaciones Descentralizadas a Blockchain con Ethers.js

19

Ejecución de Aplicaciones Descentralizadas con Metamask

20

Programación Web 3: Fundamentos y Especializaciones

Seguridad y protocolos de segunda capa

21

Capas 2 en Ethereum: Escalabilidad y Seguridad en Blockchain

22

Transición de Web 2 a Web 3: Desarrollo y Comunidades Blockchain

Más allá del desarrollo

23

Almacenamiento Descentralizado en Blockchain: IPFS, Filecoin y Más

24

Creación de Startups y DAOs en Blockchain

25

Introducción al Desarrollo en Web3 para Mujeres y Hablantes de Español

26

Fundamentos de Blockchain y Criptomonedas en Web3

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Ejecución de Aplicaciones Descentralizadas con Metamask

19/27
Recursos

Una vez hallas desarrollado la lógica de conexión con tu contrato inteligente, es momento de poner a prueba la interacción con el mismo y crear una simple interfaz web.

Interactuando con un contrato inteligente

Dependiendo la lógica del smart contract que hayas desarrollado, sabrás qué hace este y cómo desarrollar la interfaz web. Siguiendo nuestro ejemplo, vamos a crear un par de botones en el HTML que nos permitirán obtener el valor actual del contador que guardamos en el contrato e incrementarlo con otro botón.

```

```

Observa también que modificamos la función getCounter() para permitir capturar y modificar el valor del input con ID "counter" y mostrar aquí el valor actual del contador.

Finalmente, necesitaremos de un servidor web que levante el HTML y ejecute el código Javascript y lograr probar nuestra primera aplicación descentralizada. Para esto, puedes utilizar Lite Server instalándolo como dependencia con npm i -g lite-server y ejecutándolo con el comando lite-server. Presta atención de situar tu consola dentro del directorio donde tengas tu archivo .html.

La interfaz que hemos desarrollado es súper sencilla, pero lo suficiente para interactuar con el contrato y mostrar el valor actual del contador con el botón apropiado, e incrementarlo con el otro botón.

Verás que, cada vez que deseas hacer una modificación en la blockchain, en este caso incrementar el contador, tu wallet Metamask te solicitará permisos para ejecutar la transacción y pagar la comisión a la red.

Si algo va mal, recuerda utilizar las herramientas de desarrollo que el navegador nos provee para observar la consola y obtener alguna pista sobre qué ha ido mal.

¡Felicitaciones! Has desarrollado tu primera aplicación descentralizada e interactuado con un smart contract desde un front-end.

Conclusión

Tu camino como blockchain developer recién comienza, este ha sido solo un básico inicio. Si quieres aprender a desarrollar aplicaciones más complejas y profesionales, encontrarás, aquí en Platzi, el Curso de Dapps: Introducción al Desarrollo de Aplicaciones Descentralizadas y el Curso de Desarrollo Frontend de Aplicaciones Descentralizadas. Junto, ambos cursos, te permitirán desarrollar un portal NFT y su contrato inteligente respectivo. Será una gran experiencia para ti, como futuro desarrollador blockchain.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 19

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Mi resultado del Reto
Función en solidity

function setCounter(uint _setValue) public {
        counter = _setValue;
   }

Función en el Js en el HTML

async function setCounter(setCounter) {
await contract.setCounter(document.getElementById("setCounter").value);
 }

Mi contrato desplegado en la tesnet etherscan
😃

Si les sale en la consola de que ethers no detecta la red de “sepolia”, pueden hacer caso omiso de esa línea de código y les quedaría algo así

      const provider = new ethers.providers.Web3Provider(
        window.ethereum
      );

Mi reto:

https://github.com/neocarvajal/prework-dev-blockchain

Contrato: Goerli Ether Scan

setCounter in Counter.sol:

 function setCounter(uint _count) public returns(uint) {
        return counter = _count;
    }

setCounter in src/index.html

document.getElementById("submit").addEventListener('click', function(event){
            event.preventDefault();
            let count = document.getElementById('count').value;
            setCounter(count);
        });

        async function setCounter(count) {
            const counter = await contract.setCounter(count);
        } 

quede muy insatisfecho con la sección de hardhat, simplemente no funciona el método getCounter.
En las clases nunca se ejecuto primero el test, si lo hubieran hecho se darían cuenta a que me refiero. Y al configurar remix con la cuenta de sepolia en metamask, y darle la dirección del contrato, desde ahí se puede ejecutar sin problema aparentemente, pero la variable counter no se modifica quizás por el tipo de storage que se esta usando para ejecutar el contador.

Aun no entiendo muy bien como funciona eso de las firmas con metamask, por que en incremet o setcounter, pide una aprobacion pero para getcounter no, aparte es lentisimo, no se si asi sea todo en la web 3 o solo es asi por lo que estamos en red de pruebas

Solución al reto en la red de sepolia:

Counter.sol :

// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.7;

contract Counter {
    uint counter;

    constructor(uint _counter){
        counter = _counter;
    }

    function getCounter() public view returns(uint){
        return counter;
    }

    function increment() public {
        counter = counter + 1;
    }

    function setCounter(uint _counter) public {
        counter = _counter;
    }
}

HTML:

<div>
        <div>
            <label for="counter-view">Counter</label>
            <input disabled type="text" id="counter-view" name="counter-view"/>
        </div>
        <div>
            <label for="set-counter">Set Counter</label>
            <input  type="text" id="set-counter" name="set-counter"/>
        </div>
        <button onclick="increment()">Increment</button>
        <button onclick="getCounter()">Get Counter</button>
        <button onclick="setCounter()">Set Counter</button>
    </div>


    <script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
        type="application/javascript">
    </script>

    <script>
        const CONTRACT_ABI = [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_counter",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "getCounter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "increment",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_counter",
          "type": "uint256"
        }
      ],
      "name": "setCounter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ];
        const CONTRACT_ADDRESS = "0xfBcd941B4597D2885994EA5Cfc0e38FC7e29bC1E";
        let signer;
        let contract;

        const provider = new ethers.providers.Web3Provider(
            window.ethereum,
            "any"
        );

        provider.send('eth_requestAccounts', [])
            .then(() => {
                provider.listAccounts()
                    .then((accounts) => {
                        signer = provider.getSigner(accounts[0]);
                        contract = new ethers.Contract(
                            CONTRACT_ADDRESS, 
                            CONTRACT_ABI, 
                            signer);
                        console.log(contract);
                    });
            });
        
        async function increment() {
            await contract.increment();
        }

        async function getCounter() {
            const counter = await contract.getCounter();
            document.getElementById("counter-view").value = counter;
        }

        async function setCounter() {
            const counter = document.getElementById("set-counter").value;
            await contract.setCounter(parseInt(counter));
        }
    </script>

Muy buenas las explicaciones de Alfredo. Gracias!

Si alguien esta usando vscode se puede usar la opcion de live server, para desplegar en el browser una pagina web sencilla ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-10-10%20a%20la%28s%29%2011.40.06p.m.-6c4aba12-2123-4ae2-aafe-7f0617c317ad.jpg)
en la version que tengo de ethers ya no se usa Web3Provider sino BrowserProvider>const provider = new ethers.BrowserProvider(window.ethereum, 'sepolia'); ```js const provider = new ethers.BrowserProvider(window.ethereum, 'sepolia'); ```
**Mi resultado** ![](https://static.platzi.com/media/user_upload/imagen-4a3ea1f4-1b22-4ccc-8604-1de1ce964a03.jpg)
**Reto completado:** ![](https://static.platzi.com/media/user_upload/imagen-be908709-c858-42f6-9061-91bbb860d21d.jpg) 0x9d4Ec11ad400327cbc9A70E2372a6984626d87Bb
Buen curso.

Mi proceso.

//Agregué la nueva función en el contrato
function setCounter(uint _value) public{
    counter = _value;
  }

//Compilé y desplegué un nuevo contrato
//npx hardhat compile

//Modifiqué el archivo 
//hardhat.config.js

//En el script del html cambié const CONTRACT_ADDRESS por el nuevo valor de abi en Counter.json. 
//También agregué la función
 async function setCounter() {
            const countervalue = await document.getElementById("setcounter").value
            await contract.setCounter(countervalue)
        }


//Desplegué el contrato
//npx hardhat run scripts/deploy.js --network sepolia



Es bastante pesado el tema de hardhat y estaría bueno desglosarlo y explicar un poco a profundidad cada parte.

Pero para los fines de este curso, que es un abrebocas a este mundo, funciona bastante bien!

La documentación es mi pastor, nada me faltará!

Reto cumplido:

.

CONTRACT_ADDRESS = ‘0x7B12A7aebd013b23a9A19f532CF3A35D5DC9FB1E’

.

.
Aquí e código

.

// Configuración e botones
  <div>
    <form>
      <label for="set-counter">Enter a value to set counter: </label>
      <input id="set-counter" type="text" />
      <button onclick="setCounter()" type="button" >Set counter</button>
    </form>
    <button onclick="increment()" type="button" >Increment</button>
    <button onclick="getCounter()" type="button" >Get Counter</button>
    <input disable type="text" id="counter" />
  </div>

//...
// Función set counter
    async function setCounter(valueCounter = document.getElementById("set-counter").value) {
      await contract.setCounter(valueCounter);
    }

Los precios de gas de goerli en está época son muy altos

No olvides que antes de probar tu aplicación tengas conectada tu Wallet de Metamask a la red con la que vas a probarla y que tengas algo de saldo en tu cuenta para pagar el gas, obviamente si es una Testnet puedes obtener algunos tokens de las faucets correspondientes, en el caso que lances tu dapp en la Mainnet de Ethereum, tendrás que utilizar Ethers con valor real.

Mi dirección de contrato: 0x76E7940E94095d5b96562aB69424D2dcc9db2134

Mi funcion en index,html

        async function setCounter(number) {
            number = Number(number);
            number? await contract.setCounter(number): await contract.setCounter(0);
        }

Mi sección de HTML

    <div>
        <label>ser counter value</label>
        <input type="text" id="setCounter">
        <button onclick="setCounter(document.getElementById('setCounter').value)">Setear</button>
    </div>

Mi función en Solidity

    function setCounter(uint _setValue) public {
        counter = _setValue;
    }