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