Hace muchísimo tiempo yo fui de los que uso su GPU para minar, eran los tiempos en los que Ethereum usaba el protocolo «Proof of Work» para validar transacciones y crear nuevos bloques en la cadena. Actualmente Ethereum usa el «Proof of Stake» Este cambio se llevó a cabo el 15 de septiembre de 2022 y tuvo como resultado una reducción del consumo de energía de Ethereum en aproximadamente un 99.95%1.

Actualmente ya los clientes de ejecución Ethereum ya no admiten redes PoW y por eso tenemos que crear redes aisladas con Proof of Authority con protocolos como clique.

Aquí os dejo un ejemplo de crear una red privata para desarrollar aplicaciones Web3 desentralizadas.

Requisitos:

– docker
– docker-compose
– node
– git

Usaremos el cliente de ejecucion Besu:

https://besu.hyperledger.org/

Dockerfile

FROM ubuntu:20.04

RUN apt-get update && apt-get install openjdk-17-jdk wget -y

RUN wget https://github.com/hyperledger/besu/releases/download/24.3.3/besu-24.3.3.tar.gz && tar -xzvf besu-24.3.3.tar.gz

ENV PATH=$PATH:/besu-24.3.3/bin
ENV JAVA_HOME='/usr/lib/jvm/java-17-openjdk-amd64'

Para crear redes privadas se requiere una semilla genesis que sera el inicio de la cadena blockchain.

El archivo genesis tiene que contar con un address con su clave privada key por cada node y ademas un firmante en el extrada, se crea con el siguiente comando.

besu --data-path=./data public-key export-address --to=./data/booteth

Con esto ya podemos crear el archivo genesis, lo copiaremos en cada nodo. Se necesita un node boot para iniciar la red privada y luego añadimos nodos peers.

{
  "config": {
    "chainId": 2018,
    "berlinBlock": 0,
    "clique": {
      "blockperiodseconds": 30,
      "epochlength": 30000
    }
  },
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x1",
  "extraData": "0x000000000000000000000000000000000000000000000000000000000000000053e3d8e5818eb82b3d71058d92641697d91d49ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x1fffffffffffff",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "nonce": "0x0",
  "timestamp": "0x5c51a607",
  "alloc": {
    "53e3d8e5818eb82b3d71058d92641697d91d49ed": {
      "privateKey": "49364e785781e73d984a584d0577e4b77e5ea832e994729e05467813ba8ddb15",
      "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
      "balance": "0xad78ebc5ac6200000"
    },
    "c5f5f7b09a6e47eb451e0b4c93416498e9a5b03a": {
      "privateKey": "92e84908598ad23c6cfb3a099e97627e4a4e740c4775a318659d314f21ba7825",
      "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
      "balance": "90000000000000000000000"
    },
    "e2a5f093b79033d1e266884d1a576eac04435e79": {
      "privateKey": "44dc4be799662fe8d41ff11e4b380035081bc9734fd114ea94d9584b05d32fbfr",
      "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
      "balance": "90000000000000000000000"
    },
    "eaaa33736be091ee223c49de7432d67ed465a537": {
      "privateKey": "f0534d62a8dcb802cc40d20415c72bb5adab1aaf6c690442d8ae2164b6edf7ee",
      "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
      "balance": "90000000000000000000000"
    }
  }
}

Docu besu de la configuracion genesis con Clique como consenso.

https://besu.hyperledger.org/private-networks/how-to/configure/consensus/clique

Una vez tenemos los address y las claves privadas generadas creamos el docker-compose. Es importante que cada nodo tenga montado el genesis.json y su address con su clave privada.

version: "3.8"
services:
  booteth:
    image: akaronte/besu
    container_name: booteth
    command: besu --data-path=/booteth/data --genesis-file=/booteth/genesis.json --rpc-http-enabled --rpc-http-api=ADMIN,WEB3,ETH,NET,CLIQUE --rpc-http-host=0.0.0.0 --rpc-http-cors-origins='all' --graphql-http-enabled --host-allowlist='*'
    volumes:
      - ./booteth:/booteth/
      - ./genesis.json:/booteth/genesis.json
    ports:
      - 30303:30303
      - 8545:8545
      - 8547:8547
    networks:
      besu_network:
        ipv4_address: 172.28.5.1
  nodeth1:
    image: akaronte/besu
    container_name: nodeth1
    command: besu --data-path=/nodeth1/data --genesis-file=/nodeth1/genesis.json --rpc-http-enabled --graphql-http-enabled --bootnodes=enode://2d926fdb1b39410303c8fca548b5b3191f70f86b95a15faeb08db86338180b0e182935e8ad9a243110e2192dd7f1cc1360880e112485193b5689593bd8d37895@172.28.5.1:30303
    volumes:
      - ./nodeth1:/nodeth1/
      - ./genesis.json:/nodeth1/genesis.json
    networks:
      besu_network:
        ipv4_address: 172.28.5.2
  nodeth2:
    image: akaronte/besu
    depends_on:
      - booteth
    container_name: nodeth2
    command: besu --data-path=data --genesis-file=/nodeth2/genesis.json --rpc-http-enabled --graphql-http-enabled --bootnodes=enode://2d926fdb1b39410303c8fca548b5b3191f70f86b95a15faeb08db86338180b0e182935e8ad9a243110e2192dd7f1cc1360880e112485193b5689593bd8d37895@172.28.5.1:30303
    volumes:
      - ./nodeth2:/nodeth2/
      - ./genesis.json:/nodeth2/genesis.json
    networks:
      besu_network:
        ipv4_address: 172.28.5.3
  nodeth3:
    image: akaronte/besu
    depends_on:
      - booteth
    container_name: nodeth3
    command: besu --data-path=data --genesis-file=/nodeth3/genesis.json --rpc-http-enabled --graphql-http-enabled --bootnodes=enode://2d926fdb1b39410303c8fca548b5b3191f70f86b95a15faeb08db86338180b0e182935e8ad9a243110e2192dd7f1cc1360880e112485193b5689593bd8d37895@172.28.5.1:30303
    volumes:
      - ./nodeth3:/nodeth3/
      - ./genesis.json:/nodeth3/genesis.json
    networks:
      besu_network:
        ipv4_address: 172.28.5.4
networks:
  besu_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

Con eso ya podemos levantar la red privada bloques. Para visualizar los bloques y transacciones usaremos el dashboard chainless.

https://github.com/web3labs/chainlens-free.git

 

Si vemos como se generan bloques cada 30 segundos esque todo ha ido pero no veremos wallets ni transacciones hata que creemos una transaccion desde uno de los addres con balance a una wallet que creamos con el cliente Web3

Instalamos el modulo web3 con `npm install` y ejecutamos la transaccion.

node sendTransaction.js




https://github.com/Akaronte/besu-network


0 comentarios

Deja una respuesta

Marcador de posición del avatar

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