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?
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.
GT91
pieter wuille
joe uhren
Harish Kumar BP