No se puede minar Genesis / First Block (PIVX Fork / Clone) [cerrado]

Haga lo que haga, no puedo extraer el primer bloque después del bloque de génesis. Mientras tanto, asumí que había extraído el bloque Génesis y no puedo extraer el primer bloque usando el comando "setgenerate true". Pero, puedo estar equivocado. Es posible que en realidad NO haya extraído el bloque de génesis. Sí, me he confundido. He generado claves nuevas. Entonces, esto es lo que he hecho desde el principio.

1) Código antes del bloque de génesis:

En "chainparams.php", actualicé lo siguiente.

boost::assign::map_list_of(0, uint256("0x01"));
static const Checkpoints::CCheckpointData data = {
    &mapCheckpoints,
    1538530667, // * UNIX timestamp of last checkpoint block
    0,    // * total number of transactions between genesis and last checkpoint
                //   (the tx=... number in the SetBestChain debug.log lines)
    500        // * estimated number of transactions per day after checkpoint
};

pchMessageStart[0] = 0x91;
pchMessageStart[1] = 0xc5;
pchMessageStart[2] = 0xfa;
pchMessageStart[3] = 0xe3;
vAlertPubKey = ParseHex("04ae6724abca5c2e2e9524d3cd10a303e0ef3f02d324bac4d06aceb873fb8591f1a968d9a2e5ac7024d5a45643d189b99015314d7ef1ff5f8799b9680d6e668471");

const char* pszTimestamp = "my new message here. trying to learn how to create an altcoin.";
txNew.vout[0].nValue = 50 * COIN;
txNew.vout[0].scriptPubKey = CScript() << ParseHex("047394ed7e750f6202487e7c8ec1e61bbd2fb5cdc6f0f5488af4d2ea082bec606fea95eea381cd0466cf6ea53d8f42c299f9d0e2a3bc313515fc52f02a16fef0a0") << OP_CHECKSIG;
genesis.nTime = 1538530667;
genesis.nBits = 0x1e0ffff0;

assert(hashGenesisBlock == uint256("0x01"));
assert(genesis.hashMerkleRoot == uint256("0x01"));

fRequireRPCPassword = false;
fMiningRequiresPeers = false;
fAllowMinDifficultyBlocks = false;
fDefaultConsistencyChecks = false;
fRequireStandard = true;
fMineBlocksOnDemand = true;
fSkipProofOfWorkCheck = false;
fTestnetToBeDeprecatedFieldRPC = false;
fHeadersFirstSyncingActive = false;

vFixedSeeds.clear();
vSeeds.clear();

En el archivo main.cpp cambié lo siguiente

int64_t nSubsidy = 0;

if(nHeight == 0) {
    nSubsidy = 0;
} else if( .......

Tenga en cuenta que también he intentado cambiar el valor de nSubsidy para nHight = 0 a "50 * COIN" y también a un valor más alto como "5000 * COIN". Todo resulta en el mismo problema.

2) Usó el siguiente código para crear el bloque de génesis.

if(genesis.GetHash() != uint256("0x"))
{
      printf("MSearching for genesis block...\n");
      uint256 hashTarget;
      hashTarget.SetCompact(genesis.nBits);
      while(uint256(genesis.GetHash()) > uint256(hashTarget))
      {
          ++genesis.nNonce;
          if (genesis.nNonce == 0)
          {
              printf("Mainnet NONCE WRAPPED, incrementing time");
              std::cout << std::string("Mainnet NONCE WRAPPED, incrementing time:\n");
              ++genesis.nTime;
          }
          if (genesis.nNonce % 10000 == 0)
          {
              printf("Mainnet: nonce %08u: hash = %s \n", genesis.nNonce, genesis.GetHash().ToString().c_str());
          }
      }
      printf("Mainnet block.nTime = %u \n", genesis.nTime);
      printf("Mainnet block.nNonce = %u \n", genesis.nNonce);
      printf("Mainnet block.hashMerkleRoot: %s\n", genesis.hashMerkleRoot.ToString().c_str());
      printf("Mainnet block.GetHash = %s\n", genesis.GetHash().ToString().c_str());
}

3) Obtuve los siguientes resultados.

block.nTime = 1538530667
block.nNonce = 3916247
block.hashMerkleRoot: 668d1e9c1c4f354589b9357d0ac0135b5e236f13ea8cf3bdf79e3670d347e07b
block.GetHash = 00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820

4) Se actualizó la información anterior en el archivo "chainparams.cpp".

boost::assign::map_list_of(0, uint256("00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820"));

genesis.nTime = 1538530667;
genesis.nBits = 0x1e0ffff0;
genesis.nNonce = 3916247;

assert(hashGenesisBlock == uint256("00000320986bcdf6c2e62f36321232ce1dfc77dc0e0b4a79e2199d8b77fa4820"));
assert(genesis.hashMerkleRoot == uint256("668d1e9c1c4f354589b9357d0ac0135b5e236f13ea8cf3bdf79e3670d347e07b"));

5) Eliminé el código que usé para crear el bloque de génesis que usé en el paso 2 (arriba).

6) Compilado de nuevo, sin errores ni problemas.

7) Hice este VPS actual como servidor y creé un archivo "coin.conf" y agregué lo siguiente:

server=1
rpcuser=user
rpcpassword=password
listen=1
daemon=1

8) NO cloné este servidor para crear un nuevo cliente. En cambio, creé un nuevo VPS, instalé todas las dependencias y copié la carpeta completa: proyecto completo en ese VPS del cliente para configurar el cliente.

9) Agregué lo siguiente en el archivo "coin.conf" en el VPS del cliente.

addnode=<ipaddress of the server> (Ex: 207.87.10.2)

10) Comenzó la billetera - "coin-qt" en el servidor. Sin errores.

11) Comenzó la billetera - "coin-qt" en el cliente. Sin errores.

12) Ambos conectados sin problemas.

13) Ejecuté el siguiente comando en el cliente para extraer el primer bloque.

setgenerate true

Obtuve el siguiente error.

"wallet keypool empty"

dejó de usar setgenerate

setgenerate false

14) Ejecutó el siguiente comando.

keypoolrefill

15) Nuevamente intenté setgenerate

setgenerate true

16) Comprobado el archivo debug.log. Esto es lo que estoy recibiendo.

CreateNewBlock(): total size 1000
ERROR: CheckProofOfWork() : hash doesn't match nBits
ERROR: CheckBlockHeader() : proof of work failed
ERROR: CheckBlock() : CheckBlockHeader failed
CreateNewBlock() : TestBlockValidity failed
keypool return 2
keypool reserve 2

Imprimí los hashes en el archivo de depuración. Esto es lo que obtengo.

Hash = 35301222bb9164c21222107e1c43045c50c190d63eb8be2ad193ed38228b26a1
bnTarget = 00000fffff000000000000000000000000000000000000000000000000000000

Estoy atrapado aquí. Haga lo que haga, cuantas veces empiezo de cero, termino aquí.

¿Hay alguna otra configuración que deba cambiar relacionada con ProofOfWork? ¿Qué estoy haciendo mal? ¿Alguien me puede ayudar?

También he estado pirateando una bifurcación PIVX. Intentaré generar un bloque de génesis con su código en mi bifurcación mañana y veré si obtengo un resultado diferente. Podríamos comparar el código fuente que estamos usando a través de GitHub. ¿Te importaría compartir un enlace?
Votado negativo. Tenemos muchas preguntas sobre problemas de programación al crear una nueva altcoin. No creo que tales preguntas beneficien a una audiencia general, y este es un sitio de preguntas y respuestas, no un lugar de apoyo. Además, como experiencia de aprendizaje, contribuir a un proyecto existente es mucho más valioso.
¿Pudiste resolver este problema? No se ha dado una respuesta adecuada, pero parece que ha tenido éxito en la extracción del bloque de génesis de acuerdo con su pregunta más reciente: bitcoin.stackexchange.com/questions/79977/…
Hola Joe, bueno, no pude hacer que esto funcionara con la horquilla PIVX. Usé otra bifurcación que era una bifurcación de PIVX y luego cambié falso a verdadero para fSkipProofOfWorkCheck = verdadero (esta no es la forma correcta) y lo hice funcionar. Pero, nunca conseguí que esto funcionara manteniendo fSkipProofOfWorkCheck = false;

Respuestas (1)

Puedo confirmar que tu código funciona. Implementé su código en algunos proyectos que, a su vez, se bifurcaron de PIVX. No pude generar bloques de génesis en cada proyecto, lo que sugeriría que hay algo más en esto que solo chainparams.cpp . Sin embargo, logré que el daemon produjera bloques de génesis que también se podían usar en algunos de estos proyectos que se bifurcaron de PIVX.

Eliminé todos los hashes/puntos de control/puertos modificados antiguos y luego incluí su código de la siguiente manera:

        hashGenesisBlock = genesis.GetHash();
        if(genesis.GetHash() != uint256("0x"))
        {
        printf("MSearching for genesis block...\n");
        uint256 hashTarget;
        hashTarget.SetCompact(genesis.nBits);
        while(uint256(genesis.GetHash()) > uint256(hashTarget))
        {
            ++genesis.nNonce;
            if (genesis.nNonce == 0)
            {
                printf("Mainnet NONCE WRAPPED, incrementing time");
                std::cout << std::string("Mainnet NONCE WRAPPED, incrementing time:\n");
                ++genesis.nTime;
            }
            if (genesis.nNonce % 10000 == 0)
            {
               printf("Mainnet: nonce %08u: hash = %s \n", genesis.nNonce, genesis.GetHash().ToString().c_str());
            }
        }
        printf("Mainnet block.nTime = %u \n", genesis.nTime);
        printf("Mainnet block.nNonce = %u \n", genesis.nNonce);
        printf("Mainnet block.hashMerkleRoot: %s\n", genesis.hashMerkleRoot.ToString().c_str());
        printf("Mainnet block.GetHash = %s\n", genesis.GetHash().ToString().c_str());
        }

        vFixedSeeds.clear();
        vSeeds.clear();

        [...]

        fRequireRPCPassword = false;        // default true
        fMiningRequiresPeers = false;       // default true
        fAllowMinDifficultyBlocks = false;
        fDefaultConsistencyChecks = false;
        fRequireStandard = true;
        fMineBlocksOnDemand = true;     // default false
        fSkipProofOfWorkCheck = false;      // default false
        fTestnetToBeDeprecatedFieldRPC = false;
        fHeadersFirstSyncingActive = false;

Espero que esto pueda señalarte en la dirección correcta.

¡Excelente! ¿Puede darme los pasos que usó para producir bloques de génesis por daemon?
Tenga en cuenta que NO es mi código. Encontré en de otra fuente. No puedo encontrar el enlace para compartirlo aquí. Acabo de cambiar un par de líneas para que funcione. Eso es todo.
Ah, lo supuse porque yo mismo he estado buscando el código correcto durante bastante tiempo. ¡Gran trabajo armando esto! Después de insertar el código en chainparams.cpp, reconfiguré y compilé el código ( ./configure && make ) y luego ejecuté el demonio ( cd coin/src && ./coind ). Comenzó a buscar y se cerró después de un minuto o dos, dándome el bloque hash/merkle root/nonce.
De acuerdo. Gracias. ¿Ha encontrado el error - "txout.nvalue negativo" al intentar extraer el primer bloque usando el comando "setgenerate true"? Estoy atrapado allí. Esto está en una horquilla PIVX.
Hola, lo siento por estar fuera de línea durante un mes. Me encuentro con el mismo problema: " 2018-11-08 14:45:15 CreateNewBlock() : TestBlockValidity falló 2018-11-08 14:45:15 CreateNewBlock: no se pudo detectar masternode para pagar 2018-11-08 14:45 :15 CreateNewBlock(): tamaño total 1000 2018-11-08 14:45:15 CheckBlock() : omitir comprobaciones de bloqueo de transacciones 2018-11-08 14:45:15 ERROR: CheckTransaction() : txout.nValue negativo 2018-11 -08 14:45:15 ERROR: CheckBlock() : CheckTransaction falló " ¿Tuviste suerte?
Encontré la parte de eludir esto. En main.cpp, busque la parte que dice: " // Verifique los valores de salida negativos o desbordados CAmount nValueOut = 0;" Cambié este valor a una recompensa de bloque positiva (digamos 100) y comenté las 14 líneas posteriores para eludir la verificación. Mi problema ahora es que, al minar, está buscando un masternode para pagar, pero como no hay monedas, no hay masternodes... Problema. ¿Alguna idea sobre cómo evitar esto?