¿Cómo puedo crear un nuevo Bloque Génesis? [cerrado]

Estoy tratando de crear una moneda de prueba usando litecoin. Para crear el bloque de génesis, cambié algunas líneas a:

block.nTime = 1390948469; // current time

uint256 hashGenesisBlock("0x"); //I dont now it's true or false

uint256 hash = block.GetHash();
        printf("%s\n", hash.ToString().c_str());
        printf("%s\n", hashGenesisBlock.ToString().c_str());
        printf("%s\n", block.hashMerkleRoot.ToString().c_str());
        assert(block.hashMerkleRoot == uint256("0x")); //I dont now it's true or false.
        block.print();
        assert(hash == hashGenesisBlock);

Cuando construyo el daemon y lo ejecuto, aparece este error:

litecoind: main.cpp:2788: bool InitBlockIndex(): Assertion `hash == hashGenesisBlock' failed.
Aborted

Cuando reviso el ./litecoin debug.logarchivo, veo el hashMerkleRoot y el hashGenesisBlock anteriores que litecoin usa ahora. No puedo crear nuevos hash y merkle root.

Respuestas (4)

Crear bloque de génesis. Algunas personas se quedan atrapadas allí, es muy fácil:

  • encuentre la función LoadBlockIndex(), adentro, cambie:
    • parafrasear (pszTimestamp) a cualquier fase reciente de noticias.
    • obtenga la última hora de Unix (busque en Google) y coloque block.nTime.
    • configure cualquier nNonce (realmente no importa), también puede cambiar el tiempo/nonce para testnet, si desea usarlo.

Una vez que haya terminado, guárdelo. Ahora el bloque de génesis no coincidirá con la verificación de hash y la verificación de raíz de merkle, no importa.

La primera vez que ejecute el código compilado (daemon o qt), dirá "la afirmación falló". Simplemente salga del programa, vaya al directorio de configuración (en AppData/Roaming), abra debug.log, obtenga el hash después de "block.GetHash() =", cópielo y péguelo al principio de main.cpp, hashGenesisBlock. Obtenga también la raíz de merkle en el mismo archivo de registro, péguela en la posición ... en el siguiente código, en LoadBlockIndex()

 assert(block.hashMerkleRoot == uint256("0x..."));

Vuelva a compilar el código y se creará el bloque de génesis.

Por cierto, no olvide cambiar "txNew.vout[0].nValue = " a la moneda por bloque que definió, no importa dejar 50, solo sea consistente con su moneda por bloque (haga esto antes de ajustar el hash y m-root, de lo contrario se cambiarán de nuevo).

consulte https://bitcointalk.org/index.php?topic=225690.0 para obtener información completa

Cambié el pszTimestamp, puse el último tiempo de Unix. Después de compilar y comenzar a hacer daemon, litecoind: main.cpp:2788: bool InitBlockIndex(): Assertion hash == hashGenesisBlock' failed. Abortedobtengo . Cuando reviso debug.log, veo el génesis original de litecoin y los hashes de merkleroot. ¿Qué estoy haciendo mal?
Intenté esto pero tengo ERROR: CheckProofOfWork() : hash doesn't match nBits- ¿alguna idea?
Hola. Ahora la fuente ha cambiado mucho. Y algunas variables que existían no existen, o cambiaron de nombre o vienen nuevas variables. Entonces, ¿cómo hacer esto (crear un nuevo bloque de génesis para hacer una nueva moneda alternativa) basado en la nueva fuente actual?

Si desea generar nuestro propio bloque de génesis único, debe generar y reemplazar al menos los siguientes parámetros:

  • nTime (el tiempo de Unix. Su billetera mostrará el mensaje "No hay fuente de bloque disponible 5 semanas atrás" mencionado si tiene 5 semanas a partir de ahora)
  • pszTimeStamp (la "marca de tiempo" para "justificar" que no se ha realizado una extracción previa)
  • hashMerkleRoot (la raíz merkle basada en la transacción coinbase del bloque)
  • hashGenesisBlock (¡el propio hash de génesis!)
  • nNonce (el nounce correcto que se incrementa al buscar el hash que satisface el objetivo (=dificultad))

La clave pública en el script de transacción de salida también se puede cambiar a un valor único. Sin embargo, como el bloque de génesis no se puede gastar de todos modos, se puede usar la misma clave pública que en, por ejemplo, Litecoin. Además, los nBits no deben cambiarse si planea crear un clon de Litecoin.

Puede usar este script para crear los valores para un genesisblock scrypt: https://github.com/lhartikk/GenesisH0

¿Cuánto tiempo se tarda en promedio en generarlo? ¿horas? ¿dias? ¿semanas? meses> o incluso más?
Hola. Ahora la fuente ha cambiado mucho. Y algunas variables que existían no existen, o cambiaron de nombre o vienen nuevas variables. Entonces, ¿cómo hacer esto (crear un nuevo bloque de génesis para hacer una nueva moneda alternativa) basado en la nueva fuente actual?

No veo el código donde realmente cambias el blockhash del objeto. El método hashGenesisBlock()devuelve un hash, pero nunca se pasa al blockobjeto.

Además, la primera línea de tu código también tiene un error: la hora actual es 1390959227, no 1390948469. Esto también podría causar un problema.

Hola. Ahora la fuente ha cambiado mucho. Y algunas variables que existían no existen, o cambiaron de nombre o vienen nuevas variables. Entonces, ¿cómo hacer esto (crear un nuevo bloque de génesis para hacer una nueva moneda alternativa) basado en la nueva fuente actual?

Creé mi génesis usando este código, pero debes comentar todas las afirmaciones en chainparams.cpp:

arith_uint256 best = arith_uint256();
int n=0;
arith_uint256 hashTarget = arith_uint256().SetCompact(genesis.nBits);
while (UintToArith256(genesis.GetHash()) > hashTarget) {
  arith_uint256 c=UintToArith256(genesis.GetHash());
                 
  if(c < best || n==0)
    {
      best = c;
      n=1;
      printf("%s %s %s\n",genesis.GetHash().GetHex().c_str(),hashTarget.GetHex().c_str(),
         best.GetHex().c_str());
    }
  
  ++genesis.nNonce;
  if (genesis.nNonce == 0) { ++genesis.nTime; }
}
printf("%s\n",genesis.ToString().c_str());