¿Cómo configuro 2 nodos privados de minería en la misma computadora?

Estoy tratando de configurar una red ethereum privada. Inicié dos nodos en la misma máquina (Windows 7) en dos puertos diferentes.

No puedo agregar un nodo como el par del otro nodo. Lo que he hecho hasta ahora es esto.

Encuentre la dirección de nodo de un nodo.

> admin.nodeInfo.enode
"enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@0.0.0.0:30303"

Agregue el nodo al otro par.

> admin.addPeer("enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@127.0.0.1:30303")

true

Pero, si verifico la información de pares del segundo par, muestra que no tiene ningún par.

> admin.peers

[]

¿Alguien tiene alguna idea de lo que está yendo mal?

Además, ¿por qué el primer nodo muestra su IP como 0.0.0.0?

Respuestas (1)

De ¿Cuál es la diferencia entre 127.0.0.1 y 0.0.0.0? :

¿Cuál es la diferencia entre 127.0.0.1 y 0.0.0.0?

  • 127.0.0.1 es la dirección de loopback (también conocida como localhost).
  • 0.0.0.0 es una metadirección no enrutable que se utiliza para designar un objetivo no válido, desconocido o no aplicable (un marcador de posición 'sin dirección particular').

En el contexto de una entrada de ruta, generalmente significa la ruta predeterminada.

En el contexto de los servidores, 0.0.0.0 significa todas las direcciones IPv4 en la máquina local. Si un host tiene dos direcciones IP, 192.168.1.1 y 10.1.2.1, y un servidor que se ejecuta en el host escucha en 0.0.0.0, será accesible en ambas direcciones IP.

Lo que desea hacer es encontrar la dirección IP de las máquinas que no sea 127.0.0.1, que se verá como en OS/X (y Linux):

Iota:~ bok$ ifconfig -a
...
inet 127.0.0.1 netmask 0xff000000 
...
inet 192.168.0.11 netmask 0xffffff00 broadcast 192.168.0.255

En Windows, el comando equivalente es ipconfig /all.

La dirección 192.168.0.11 es la que desea usar en su cadena de enodo, ya que esta es la dirección IP de la máquina a la que pueden contactar las otras computadoras de su red.

Luego deberá agregar a su compañero usando un comando como:

> admin.addPeer("enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@192.168.0.11:30303")



Ejemplo resuelto

Aquí hay un ejemplo paso a paso de cómo ejecutar 2 mineros en la misma computadora bajo OS/X, con los mineros comunicándose entre sí. Debería poder replicar esto en Windows y Linux. También debería poder replicar esto en más de 2 nodos y en computadoras separadas.

Actualización 31 de octubre de 2016 00:00:56 UTC Puede encontrar un problema con la generación de DAG ya que ambos mineros intentarán crear el DAG al mismo tiempo en el mismo archivo. En OS/X (y Linux), el archivo DAG se almacena en formato $HOME/.ethash. Este es el mismo problema que se describe en Cadena privada, dos mineros geth en la misma máquina, el segundo minero arroja "panic: ethash_full_new IO o error de memoria" . La solución consiste en iniciar el segundo minero después de que el primero haya terminado de crear el DAG, cuando es necesario crear el DAG inicial. Será necesario crear un nuevo DAG periódicamente y esto puede causar que uno de sus mineros se bloquee.

Los detalles:

  • geth versioninformes1.4.18-stable-c72f5459
  • Este ejemplo se creó en el directorio /tmp/Test2Miners, siendo el directorio de datos del minero n.° 1 y el directorio de datos del /tmp/Test2Miners/miner1dataminero n.° 2 /tmp/Test2Miners/miner2data.
  • Creé el archivo /tmp/Test2Miners/genesis.jsoncon los siguientes contenidos:

    {
        "config": {
                "homesteadBlock": 10
        },
        "nonce": "0",
        "difficulty": "0x400",
        "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
        "coinbase": "0x0000000000000000000000000000000000000000",
        "timestamp": "0x00",
        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "extraData": "0x",
        "gasLimit": "0x3B4A1B44",
        "alloc": {}
    }
    
  • Creé /tmp/Test2Miners/testpasswordcon los siguientes contenidos:

    aaaargh
    
  • Creé /tmp/Test2Miners/initMiner1con los siguientes contenidos, luego configuré el bit ejecutable usando el comando chmod 700 /tmp/Test2Miners/initMiner1:

    #!/bin/sh
    
    geth --datadir /tmp/Test2Miners/miner1data init /tmp/Test2Miners/genesis.json
    geth --datadir /tmp/Test2Miners/miner1data --password /tmp/Test2Miners/testpassword account new
    
  • Creé /tmp/Test2Miners/initMiner2con los siguientes contenidos, luego configuré el bit ejecutable usando el comando chmod 700 /tmp/Test2Miners/initMiner2:

    #!/bin/sh
    
    geth --datadir /tmp/Test2Miners/miner2data init /tmp/Test2Miners/genesis.json
    geth --datadir /tmp/Test2Miners/miner2data --password /tmp/Test2Miners/testpassword account new
    
  • Creé /tmp/Test2Miners/runMiner1con los siguientes contenidos, luego configuré el bit ejecutable usando el comando chmod 700 /tmp/Test2Miners/runMiner1:

    #!/bin/sh
    
    geth --datadir /tmp/Test2Miners/miner1data --unlock 0 --password /tmp/Test2Miners/testpassword --mine --minerthreads 1 --port 30301 console
    
  • Creé /tmp/Test2Miners/runMiner2con los siguientes contenidos, luego configuré el bit ejecutable usando el comando chmod 700 /tmp/Test2Miners/runMiner2:

    #!/bin/sh
    
    geth --datadir /tmp/Test2Miners/miner2data --unlock 0 --password /tmp/Test2Miners/testpassword --mine --minerthreads 1 --port 30302 console
    
  • Inicialicé los directorios de datos y creé la primera cuenta (coinbase) para ambos mineros usando el comando:

    /tmp/Test2Miners/initMiner1
    /tmp/Test2Miners/initMiner2
    
  • En la ventana de terminal #1, inicié el minero #1 usando el siguiente comando. He incluido la información del enodo impresa en la consola, que también se puede determinar usando el admin.nodeInfocomando:

    /tmp/Test2Miners/runMiner1
    ...
    enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@[::]:30301
    
  • En la ventana de terminal #2, inicié el minero #2 usando el comando:

    /tmp/Test2Miners/runMiner2
    ...
    enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@[::]:30302
    
  • Reemplacé las cadenas de enodo [::]con la dirección IP local, por lo que mis admin.addPeer(...)comandos se verían así:

    admin.addPeer("enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@192.168.1.11:30301")
    

    y

    admin.addPeer("enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@192.168.1.11:30302")
    
  • Pegué el admin.addPeer(...)con la cadena de enodo del minero n.º 1 en la consola del minero n.º 2.

  • En la consola del minero #1:

    > admin.peers
    [{
        caps: ["eth/62", "eth/63"],
        id: "b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436",
        name: "Geth/v1.4.18-stable-c72f5459/darwin/go1.7.1",
        network: {
          localAddress: "192.168.1.11:30301",
          remoteAddress: "192.168.1.11:62922"
        },
        protocols: {
          eth: {
            difficulty: 152346260,
            head: "0x8296dbd46fe12cef1415c27cb21f2ad6d70b6ee174977529eaf266c3488e6e2e",
            version: 63
          }
        }
    }]
    

    ¡Éxito!

  • Y en la consola del minero #2:

    > admin.peers
    [{
        caps: ["eth/62", "eth/63"],
        id: "dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d",
        name: "Geth/v1.4.18-stable-c72f5459/darwin/go1.7.1",
        network: {
          localAddress: "192.168.1.11:62922",
          remoteAddress: "192.168.1.11:30301"
        },
        protocols: {
          eth: {
            difficulty: 157293798,
            head: "0xd9b044d4e996407ff94b075c36b845db219078c64e7898e628983496d46067bf",
            version: 63
          }
        }
    }]
    

    ¡Confirma el éxito!

  • Aquí está el registro de la consola de uno de los mineros:

    I1031 00:53:27.604563 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #1447
    I1031 00:53:27.605050 miner/worker.go:539] commit new work on block 1453 with 0 txs & 0 uncles. Took 460.253µs
    I1031 00:53:29.682117 core/blockchain.go:1001] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.081834ms. #1453 [3a94659b / 3a94659b]
    I1031 00:53:29.683526 miner/worker.go:539] commit new work on block 1454 with 0 txs & 0 uncles. Took 1.167337ms
    I1031 00:53:29.683565 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #1448
    

    La tercera línea muestra que el otro minero ha extraído un bloque y este minero está importando el bloque. Las otras líneas muestran que este minero está extrayendo los bloques.

  • Para automatizar el descubrimiento peer-to-peer, creo con la siguiente información ( nodos estáticos/tmp/Test2Miners/miner1data/static-nodes.json de referencia ):

    [
      "enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@192.168.1.11:30301",
      "enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@192.168.1.11:30302"
    ]
    

    y copio este archivo a /tmp/Test2Miners/miner2data/static-nodes.json.

  • Reinicio ambos mineros usando los comandos /tmp/Test2Miners/runMiner1y /tmp/Test2Miners/runMiner2en ventanas de terminal separadas y verifico que estén conectados entre sí usando admin.peersy lo están. Éxito++.

Gracias por la respuesta. Agregué la dirección IP encontrada por ipconfig y aún no funciona. Descubrí que mis dos nodos tienen la misma dirección, además del puerto. ¿Podría ser este el problema? Dos nodos tienen sus propios directorios de datos, pero comparten el mismo bloque de génesis.
He actualizado con un ejemplo paso a paso en OS/X. Debería funcionar igual en Windows y Linux. Debería funcionar en máquinas separadas también.
Muchas gracias. Borré todo y seguí tu guía. Todo está funcionando bien ahora.
Consulte la actualización en la respuesta: la configuración de tener 2 mineros en la misma computadora puede provocar que el nombre del archivo DAG codificado provoque un bloqueo, ya que solo uno de los mineros podrá escribir en este archivo. Estoy trabajando en una alternativa.