Agregar nodos en la red privada de contenedores acoplables alojados en diferentes máquinas virtuales

Estoy tratando de crear una red privada no local con go-ethereum ejecutándose en contenedores docker alojados en diferentes máquinas virtuales. Estoy teniendo dificultades para hacer que los nodos se reconozcan entre sí. Me pregunto cuál es la mejor estrategia para agregar pares ahora que bootnode no funciona correctamente ( Problema abierto # 3703 ). He seguido muchos aspectos del proyecto Vertigobr .

Sabiendo que --nodiscoverdebe estar habilitado para evitar conectarse con nodos externos a la red privada, estas son mis dudas:

  1. ¿Es la configuración --nat extip:<VM_EXT_IP>más conveniente ?nat
  2. ¿Hay solo un nodo (uno principal) en posesión del static-nodes.jsonarchivo y se vincula automáticamente a los nodos del archivo?
  3. De acuerdo con "Conectarse a la red" en la documentación de Ethereum, admin.addPeer("enodeURL")solo agrega nodos temporalmente. ¿Eso significa que tengo que realizar un seguimiento de mi lista de nodos en una base de datos, por ejemplo, regenerar static-nodes.jsoncuando se crea un nuevo nodo y reiniciar mi nodo "principal" para recargar este archivo? hay una manera mas facil?

Respuestas (1)

Prepare su nodekeypara cada nodo por adelantado. Es solo un número aleatorio de 512 bits. Luego guárdelos en algún lugar, junto con las claves ECDSA públicas derivadas de allí.

Las claves públicas son los componentes enodeque necesita para establecer conexiones usando la --bootnodeopción de comando, así como la admin.addPeer()función en la consola.

Formar el enodees tan fácil como obtener claves públicas, IP y puerto, por ejemplo

enode://844c9c9e926a96e67fae7124bf6fcb6ecf37d121e2d3031db4b7d7bdd1388d9fc33c96c70535c65fcf34d8a4258fd40a9a7e2c24ac92bb152bd0261464b845d1@192.168.1.1:9915

Aquí hay una sola línea (no segura ya que no usa /dev/random) para obtener sunodekey

perl -e '@c=("a".."f",0..9);$p.=$c[rand(scalar @c)] for 1..64; print "$p\n"'

Y aquí hay una utilidad rápida para gousar la gethbiblioteca para obtener su clave pública

https://gist.github.com/hermanjunge/8d0998f1fb2fd87870b57c63fe1f46c8

Hola Herman, gracias por tu rápida respuesta! Supongo que el archivo de clave es solo para aquellos nodos destinados como bootnodes y podría tener solo algunos a los que todos los demás nodos en la cadena de bloques hacen referencia. Bueno, pude ejecutar su código y obtuve dos claves: 246592eacb950b1a61805dddbd1faa92161befa98d04de52b45f78a8b4f6c0dby 311feee911639c757c305e07675793eb2d5cb3c6011764ad50d1e9c9b5a07ff9e6f4a594f3938552314434be45560a8a3e36850224c288fd8c8a6201103df05cla larga es la clave pública de enodo, ¿verdad? ¿La corta es la clave de nodo (clave ECDSA)?
Sí, @betty, al iniciar su nodo con la bandera --nodekeyhex 246592eacb950b1a61805dddbd1faa92161befa98d04de52b45f78a8b4f6‌ , se asegura de tener siempre el mismo enodevalor.
Gracias :) También logré ejecutar el código de bootnode go get github.com/ethereum/go-ethereum/cmd/bootnodey luego ejecutar go run main.go --genkey "/some/dir/bootnode.key"where main.gois the main go file de la carpeta bootnode descargada.