Bifurcación válida en regtest - ¿Cambiar blockchain a través de RPC?

Creé una red de registro que consta de 2 nodos: node0 y node1.
Me gustaría tener una bifurcación en la cadena de bloques común y aparentemente lo logré al hacerlo:

  1. inicio de nodos
  2. node0 agrega node1 a través deaddnode
  3. node0 genera 1 bloque con hash 4dac...
  4. node1 genera 1 bloque con hash 5d8b...
  5. node0 invalida el bloque de node0 con hash 5d8b... víainvalidate <hash>
  6. nodo1 se detiene
  7. node0 genera 1 bloque con hash 64f2...
  8. el nodo 1 se reinicia
  9. node1 genera 1 bloque con hash 5sfg...
  10. node0: getchaintipsdevuelve una matriz con hash de bloque invalidado 5d8b... con estado

Ahora mis preguntas:
a) ¿Cómo puedo lograr un estado " valid-fork" en la salida de getchaintips para la bifurcación previamente invalidada? [SOLUCIONADO]

b) ¿Es posible que un nodo "conscientemente"/a través de RPC renuncie a su propia cadena y cambie a la cadena competidora?

@JonasSchnelli: Sí, miré ese código pero no entendí mucho porque no estoy familiarizado con python... pero hay una diferencia entre mi escenario y el escenario descrito dentro del código: tengo subramas de la misma longitud y el código describe ramas de diferentes longitudes... ¿es este el punto clave?

Respuestas (3)

La cadena válida más larga siempre se elige automáticamente. Por lo tanto, la forma de hacer que cambie con fuerza es usar el invalidateblockRPC oculto.

Volví a leer la Guía para desarrolladores de Bitcoin y volví a leer la sección de ayuda getchaintips:

Cada nodo completo de la red Bitcoin almacena de forma independiente una cadena de bloques que contiene solo bloques validados por ese nodo . Cuando varios nodos tienen los mismos bloques en su cadena de bloques, se considera que están en consenso. Las reglas de validación que siguen estos nodos para mantener el consenso se denominan reglas de consenso.

y

Valores posibles para el estado:
[..]
"bifurcación válida": esta rama no es parte de la cadena activa, pero está completamente validada
[..]

Para a) Entonces, para lograr un estado de bifurcación válido para un hash de bloque previamente invalidado, node0 debe reconsiderar ese mismo hash de bloque para que esté completamente validado en su copia de blockchain. Esto se puede lograr por reconsiderblock <block hash>.

Nota: reconsiderblock aparentemente "cierra" la bifurcación ya que getchaintips devuelve el mismo hash de bloque para la punta de la cadena activa para ambos nodos.

Para b) Nada averiguado todavía.

Para b: invalidateblock RPC marca un bloque como incondicionalmente inválido. El RPC reconsiderblock borra este estado no válido.

Con respecto a a) no estoy muy familiarizado con la forma en que valida el bloque, pero supongo que no.

en cuanto a b) es posible renunciar a su propia cadena de la otra cadena es la cadena válida más larga.

Los bloques en cadenas más cortas (o cadenas inválidas) no se usan para nada. Cuando el cliente de bitcoin cambia a otra cadena más larga, todas las transacciones válidas de los bloques dentro de la cadena más corta se vuelven a agregar al grupo de transacciones en cola y se incluirán en otro bloque. La recompensa por los bloques en la cadena más corta no estará presente en la cadena más larga, por lo que prácticamente se perderán, razón por la cual existe un tiempo de maduración de 100 bloques impuesto por la red para generaciones.

Para b) Usted cita "Cuando el cliente bitcoin cambia a otra cadena más larga, todo [...]" - Pero mi pregunta es ¿cómo se puede cambiar conscientemente, por ejemplo, según un RPC, la cadena?
El software de la billetera siempre selecciona la cadena más larga; no hay una opción de RPC para forzar un cambio de cadena.