La conexión entre pares nunca ocurre en blockchain personalizado [duplicado]

Mi aplicación se conecta y extrae la misma blokchain en cada instancia, usa el mismo genesis.json y las identificaciones de red.

Génesis: https://github.com/AugustoL/OpenContent/blob/master/genesis.json

Servicio Web3 que se conecta usando la misma identificación de red: https://github.com/AugustoL/OpenContent/blob/master/js/services/web3.js

Cuando lo ejecuto en dos computadoras diferentes, no se reconoce la cadena de bloques existente. Entonces comienza a extraer dos cadenas de bloques diferentes con la misma génesis e identificación de red: S

¿Cuál es el error? ¿Qué me estoy perdiendo? He estado leyendo mucho y se supone que funciona.

¿Qué comando inicias en la CLI?
Algo como: geth --networkid "1998165215114019841" --genesis ./genesis.json --datadir ./blockchain --rpc --verbosity=4 --rpcaddr 127.0.0.1 --rpcport 8545 --rpccorsdomain=" localhost:80 " --rpcapi "admin,eth,miner,net,personal,web3" --nat "any" --extradata "OpenContent 0.1" Puede verlo aquí: github.com/AugustoL/OpenContent/blob/master/js/ servicios/web3.js
ah ok, solo quería estar seguro de que --nodiscoverno está configurado. Hmm, sospecho que también leíste el capítulo sobre "configurar múltiples nodos" github.com/ethereum/go-ethereum/wiki/… y la parte sobre "problemas comunes con la conectividad" github.com/ethereum/go-ethereum/wiki /Conectando-a-la-red ?
Sí, ya lo leí e intenté agregar los nodos manualmente, pero no funcionó: S
Asegúrese de no tener un firewall que bloquee las conexiones UDP/TCP en el puerto 30303.
@PéterSzilágyi, no están bloqueados.

Respuestas (1)

La razón

La razón por la que sus dos gethinstancias en las dos computadoras diferentes no pueden encontrarse es que no saben dónde comenzar a buscarse.

Nota: he acortado la clave pública del nodo para facilitar la lectura en esta respuesta. Por ejemplo,
"a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c"se ha acortado a "a979....163c". Tendrá que usar las claves públicas completas al configurar su red.

En la cadena de bloques pública de la red principal, cada par al iniciar intentará conectarse a los "nodos de arranque" para obtener una lista inicial de pares a los que se puede conectar. La dirección de estos bootnodes está codificada en las líneas 71-78 de eth/backend.go, como se muestra a continuación:

defaultBootNodes = []*discover.Node{
    // ETH/DEV Go Bootnodes
    discover.MustParseNode("enode://a979....163c@52.16.188.185:30303"), // IE
    discover.MustParseNode("enode://de47....c786@54.94.239.50:30303"),  // BR
    discover.MustParseNode("enode://1118....5082@52.74.57.123:30303"),  // SG
    // ETH/DEV cpp-ethereum (poc-9.ethdev.com)
    discover.MustParseNode("enode://979b....37f9@5.1.83.226:30303"),
}

Una vez que un nodo se conecta al bootnode, obtendrá una lista de direcciones para que se conecten los pares potenciales e intentará conectarse con estos pares.

No existe tal punto de partida en su red privada.



La solución

En su red privada, sus gethinstancias no sabrán por dónde empezar a buscarse y tendrá que darle algunas pistas. Hay tres formas de hacer esto: usando el --bootnodesparámetro de la línea de comando, agregando un static-nodes.jsona su directorio de datos o agregando un trusted-nodes.jsona su directorio de datos.

Ejecute gethen cada una de sus computadoras y escriba admin.nodeInfoen la línea de comando:

> admin.nodeInfo
{
  enode: "enode://d9d9....30d9@[::]:30301?discport=0",
  id: "d9d9....30d9",
  ip: "::",
  listenAddr: "[::]:30301",
  name: "Geth/v1.3.6/linux/go1.5.1",
  ports: {
    discovery: 0,
    listener: 30301
  },
  ...
}

Lo que tendrá que hacer es obtener la información del enodo para ambas computadoras. Reemplace la [::]información del enodo con la dirección IP de sus dos computadoras y elimine el ?discport=0si está presente. Su información de enodo para cada computadora debería verse así:

  • Enodo de la computadora 1:enode://d9d9....30d9@192.168.1.152:30303
  • Enodo de la computadora 2:enode://1212....3434@192.168.1.253:30303


Solución 1 - La --bootnodessolución

Esta primera --bootnodessolución requerirá que especifique el nodo de arranque de la instancia de una computadora para la gethinstancia de la otra computadora geth. Entonces, en la Computadora 1, comienza gethagregando el siguiente parámetro:

--bootnodes "enode://1212....3434@192.168.1.253:30303"


Solución 2 - La static-nodes.jsonsolución

Esta segunda solución es crear el archivo static-nodes.jsonen su --datadir, por lo que en su caso, el nombre del archivo y la ruta deben ser ./blockchain/static-nodes.json. En la computadora #1, este archivo debe contener la información de enodo de la computadora #2 y viceversa. Alternativamente, simplemente cree uno static-nodes.jsoncon la información de enodo de ambas computadoras #1 y #2, y cópielo static-nodes.jsonen --datadirambas computadoras. El contenido de este archivo debería verse así:

[
  "enode://d9d9....30d9@192.168.1.152:30303",
  "enode://1212....3434@192.168.1.253:30303"
]


Solución 3 - La trusted-nodes.jsonsolución

Igual que la solución n.° 2, pero use el nombre del archivo trusted-nodes.jsonen lugar de static-nodes.json. La diferencia aquí es que los nodos de confianza no se suman al recuento de nodos del mismo nivel cuando --maxpeersse alcanza el límite.



Usar --maxpeersy no usar--nodiscover

Es posible que deba especificar un valor distinto de cero --maxpeerspara que esto funcione, por ejemplo, use el parámetro:

geth ... --maxpeers 2 ...

Y no lo use --nodiscoveren su gethlínea de comando, ya que esto desactivará el descubrimiento de pares.



preguntas relacionadas

Aquí hay algunas preguntas relacionadas que pueden ayudarlo a resolver sus problemas de conexión:

muy bien explicado
Debe considerar cerrar la pregunta ya duplicateque cuando encuentra similitud, no tiene sentido responder una pregunta que ya está respondida. Y la otra pregunta también la responde usted +1 por eso.
Esta respuesta es más clara ya que ahora entiendo los problemas un poco mejor que cuando respondí la pregunta anterior. ¿Debo marcar las dos preguntas anteriores como duplicados de esta?
No es necesario, lo he marcado como duplicado, se cerrará pronto. Por cierto, estás haciendo un gran trabajo aquí amigo. 2K+ repeticiones en 2 semanas; impresionante.
Gracias. Estoy investigando sobre la cadena de bloques de Ethereum y los contratos inteligentes, y las preguntas que se hacen aquí me ayudan a explorar el ecosistema. Estoy documentando algunos de estos problemas para poder consultarlos en el futuro. Y esta cadena de bloques es como Lego Mindstorm para mí, en comparación con la programación regular que es Lego normal. Un montón de piezas para explorar y ver cómo encajan.
Demasiado entusiasmo :) puedes ser el próximo John Skeet aquí.
Este es mi mecanismo de procrastinación. Estoy destinado a hacer muchas otras cosas que no quiero hacer, así que me estoy perdiendo en mis pasatiempos.