¿Cómo disminuyo la dificultad en una red de prueba privada?

He creado una red de prueba privada. En el genesis.jsonarchivo, he cambiado el difficultya 1. Sin embargo, la extracción de un bloque aún lleva horas en mi CPU. Sospecho que se debe a alguna configuración relacionada con la adaptación de la red.

¿Cuál es el procedimiento correcto para disminuir la dificultad en una red de prueba privada, de modo que pueda extraer los primeros bloques en una CPU no muy potente?

Si la respuesta respondió a su inquietud, siéntase libre de aceptarla como la respuesta correcta marcando el signo de verificación debajo de los botones de votación.
No estoy seguro de que esta respuesta resuelva mi problema. Tan pronto como pueda investigar, lo aceptaré o publicaré un comentario indicando por qué no funcionó.
Claro, si editas tu pregunta o publicas algún comentario debajo de la respuesta, podría recomendarte una solución.

Respuestas (4)

Hay 2 formas de hacer esto:

  • Cambie el valor del parámetro de dificultad en genesis.jsonel archivo a un número pequeño (preferiblemente configúrelo en 0). Puede consultar este archivo de génesis de ejemplo

    {
       "config": {
          "chainId": 1994,
          "homesteadBlock": 0,
          "eip155Block": 0,
          "eip158Block": 0,
          "byzantiumBlock": 0
       },
       "difficulty": "0x0", //difficulty set to zero in hexadecimal format
       "gasLimit": "0x8000000",
       "alloc": {
          "9a963d0eefeb62678d8efb48561c81e51c552797": { 
              "balance": "9606938044258990275541962092341162602522202993782792835301376" 
          },
          "30f28686aef33adbfbc13797b1d9f5a2f2759f56": { 
              "balance": "9606938044258990275541962092341162602522202993782792835301376" 
          }
       }
    }
    

El problema con este método es que cuando aumenta el número de bloques, la dificultad también comienza a aumentar a un ritmo elevado. Entonces, para abordar ese problema, consulte la parte a continuación.

  • Puede reducir la tasa de aumento de la dificultad de los bloques haciendo algunos cambios en el código de consenso de go-ethereum. Abra consensus.goque reside en consensus/ethash/consensus.goy busque la línea de abajo.

return CalcDifficulty(chain.Config(), time, parent)

Ahora reemplace la línea de arriba con la de abajo.

return big.NewInt(1).

Ahora construye el go-ethereum usando el make gethcomando.

Le recomiendo encarecidamente que lea este artículo para una implementación más detallada del proceso anterior.

Explique 'cuando aumenta el número de bloque, la dificultad también comienza a aumentar a un ritmo elevado'. No creo que el número de bloque esté relacionado con la dificultad en absoluto.

Puede hacer que la dificultad sea estática modificando CalcDifficultyGeth para que devuelva un número estático. Ejemplo:

func CalcDifficulty(config *ChainConfig, time, parentTime uint64, parentNumber, parentDiff *big.Int) *big.Int {
    return big.NewInt(1)
}

Reconstruye Geth y usa tu versión modificada.

Fuente: Respuesta a ¿Es posible cambiar el tiempo objetivo del bloque?

Esta es la misma variable que pusimos en el bloque de génesis, ¿verdad? En caso afirmativo, ¿cuáles son las ventajas de este método?
@niksmac Edité para cambiar la dificultad a 1 para que la minería siempre sea rápida. De lo contrario, la dificultad aumentará gradualmente y la minería tomará ~ 15 segundos, que es lo que se desea en Homestead, pero probablemente no en su cadena privada.
¿Debo hacer este cambio y modificación en todos los nodos que están conectados a mi red privada de ethereum? o en el enodeque me estoy conectando? En caso afirmativo, ¿afecta la dificultad en la red blockchain privada en curso (por ejemplo: ya se extrajeron 491 312 bloques)? @eth♦
@Avatar Sí, creo que todos los nodos deberían ejecutar el mismo código/protocolo. Es mejor restablecer la cadena de bloques, pero si desea continuar, es posible que deba detener todos los nodos en el mismo número de bloque y reiniciarlos; de lo contrario, los nodos podrían bifurcarse en diferentes direcciones.
Esta exageración, porque si va a tener que reconstruir geth para aplicar esta solución, también puede eliminar su cadena y reiniciarla con una dificultad menor especificada en el bloque de génesis.
@fccoelho Eso es posible y en la respuesta, " hacer que la dificultad sea estática " es un enlace al problema que las personas pueden encontrar al comenzar con una dificultad menor en el bloque de génesis, y es que la dificultad puede seguir aumentando.
@eth ¿cómo puedo hacerlo con cpp-ethereum? No encontré ningún archivo con un nombre similar, por ejemplo, Consensus.cpp
No importa, encontré esta función miembro Ethash::calculateDifficulty.

Como se ve en este blog.

dificultad Un valor escalar correspondiente al nivel de dificultad aplicado durante el descubrimiento de este bloque. Define el objetivo de minería, que se puede calcular a partir del nivel de dificultad del bloque anterior y la marca de tiempo. Cuanto mayor sea la dificultad, estadísticamente más cálculos debe realizar un minero para descubrir un bloque válido. Este valor se utiliza para controlar el tiempo de generación de bloques de una cadena de bloques, manteniendo la frecuencia de generación de bloques dentro de un rango objetivo. En la red de prueba, mantenemos este valor bajo para evitar esperas durante las pruebas, ya que se requiere el descubrimiento de un Bloque válido para ejecutar una transacción en Blockchain.

La dificultad se establece 0x4000en el bloque de génesis, que me ayuda a extraer bloques cada ~5segundo.

I0401 07:06:16.533385    4556 ethash.go:252] Generating DAG: 98%
I0401 07:06:16.533482    4556 ethash.go:252] Generating DAG: 99%
I0401 07:06:16.533586    4556 ethash.go:252] Generating DAG: 100%
I0401 07:06:16.533668    4556 ethash.go:237] Done generating DAG for epoch 0, it took 10.562412ms

y minería

I0401 07:06:26.062135    4556 worker.go:348] 🔨  Mined block (#219 / 9704b2d0). Wait 5 blocks for confirmation
I0401 07:06:26.062687    4556 worker.go:569] commit new work on block 220 with 0 txs & 0 uncles. Took 484.843µs
I0401 07:06:26.063166    4556 worker.go:569] commit new work on block 220 with 0 txs & 0 uncles. Took 375.001µs
I0401 07:06:32.221697    4556 worker.go:348] 🔨  Mined block (#220 / 77bb4f70). Wait 5 blocks for confirmation
I0401 07:06:32.222280    4556 worker.go:569] commit new work on block 221 with 0 txs & 0 uncles. Took 521.439µs
Entonces, ¿no se puede cambiar la dificultad una vez que ha comenzado la minería en la cadena?
@TMOTTM sí, así es como parece.
Entonces, ¿no puedo hacer este cambio si tengo una red blockchain privada en curso (por ejemplo, ya extraje 491,312 bloques)? @niksmac
@Avatar así es como parece ser.