Las monedas preminadas del bloque de génesis desaparecen después de una transacción de la cuenta/billetera

Verifique toda la pregunta una vez antes de marcar negativamente o marcar como duplicado de

¿Por qué no se puede gastar la base de monedas del bloque de génesis?

Por qué no puedo obtener la transacción del bloque de génesis [duplicado]

Estoy creando AltCoin a partir de la fuente litecoin . Y estoy usando GenesisHO generando detalles del bloque de génesis como nonce, hash de génesis, merkle, etc.

Mientras generaba el bloque de génesis, cambié los parámetros del valor de la moneda en el valor de la moneda de génesis. es decir, -vparámetros y hash de génesis generado y merkle, etc.

He hecho cambios con respecto a génesis, nonce, monedas para el bloque génesis.

genesis = CreateGenesisBlock(1538404994, 2086003386, 0x1e0ffff0, 1, 50000 * COIN);

p.ej. Quiero preminar 50.000 monedas en el bloque génesis. No quiero dar una condición en la validación.cpp como si la altura del bloque 1 fuera la recompensa de 50,000.

Generé la clave de publicación y usé la misma clave de publicación mientras generaba el hash de génesis. Así que puedo usar esas monedas de bloque de génesis importando la clave privada de esa clave de publicación.

Después de todo el cambio anterior en la fuente, construí daemon, cli, tx y qt desde la misma fuente.

Próximo

Desde cli, he ejecutado el comando ( coin-cli generate 1) para generar un bloque para poder obtener la moneda del bloque de génesis (¡Sí! Inicialmente, estará en estado inmaduro después de x (que configuré en 1) la cantidad de bloque estará en estado maduro ). E importó esa clave privada en la billetera.

Resultado de arriba:

Después de la ejecución de coin-cli generate 1las monedas de génesis, se generan. Se muestran en la billetera y en la cuenta con el nombre de cuenta ""

Minería iniciada (usando cpuminer) que tiene la dirección de otra cuenta. Y después de unos bloques, las monedas del bloque de génesis se convirtieron al estado maduro.

Problema

Ahora, cuando traté de transferir desde ese bloque de monedas de génesis, no se transfirió a ninguna dirección. No se muestra en la billetera qt, pero usando el comando cli se muestra el saldo.

Entonces, ¿dónde necesito hacer otros cambios para que esa moneda de génesis sea gastable?

Detalles de transacciones

ingrese la descripción de la imagen aquí

Detalles del saldo de qt wallet y command

ingrese la descripción de la imagen aquíPara minar usando cpuminer

Fuente de Litecoin: https://github.com/litecoin-project/litecoin/tree/0.14

ACTUALIZAR

También probé y seguí los pasos de esta respuesta Después de actualizar según la respuesta anterior en validation.cpp, aquí está el enlace de la misma

Actualización 2

Los cambios mencionados en la respuesta con respecto a la validación.cpp y el archivo de validación.cpp actualizado aquí y el mismo cambio actualizado mencionado a continuación en la línea sabia

Cambios en caso especial para el bloque de génesis, omitiendo la conexión de sus transacciones (su base de monedas no se puede gastar)

Cambios para afirmar(pindex->pprev);

Se agregó el método WriteUndoDataForBlock:

Cambiar para omitir la escritura de datos de deshacer para el bloque de génesis

Después de actualizar las cosas anteriores, da errorSegmentation fault (core dumped)

Y aquí están los detalles de debug.log

Gracias.

¿Hiciste algún ajuste a validation.cpp, específicamente esta línea? github.com/litecoin-project/litecoin/blob/0.14/src/…
@JBaczuk Bueno, en realidad, como novato. Lo que probé es comentado como verdadero; declaración y compilar de nuevo, pero da error cuando comencé la falla de segmentación del daemon (núcleo volcado). ¿Necesito hacer algún cambio en ese archivo para eso?
@JBaczuk, verifique la pregunta. He agregado una actualización
Tienes razón al comentar esa línea. Tiene fallas de segmento porque está tratando de hacer referencia a un bloque anterior cuando está en el Génesis, pero no hay ninguno. buscar assert(pindex->pprev)_ Todos los cambios que necesita hacer están en ese archivo.
@JBaczuk Ohh, está bien, pero una vez, verifique mi pregunta actualizada mencionada como Actualización 2

Respuestas (1)

Debe hacer algunas cosas para que el bloque de génesis sea gastable, todo incluido validation.cpp(no probado):

  1. Permitir conexión tx, L#2904 :

    if (*pindexPrev->phashBlock == chainparams.GetConsensus().hashGenesisBlock)
        // return true;
    
  2. Omita la verificación de la cantidad de coinbase para el bloque de génesis, L#1933 :

    if (block.vtx[0]->GetValueOut() > blockReward && block.GetHash() != chainparams.GetConsensus().hashGenesisBlock)
        return state.DoS(100,
                         error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0]->GetValueOut(), blockReward),= REJECT_INVALID, "bad-cb-amount");
    
  3. Omita la escritura de datos de deshacer para el bloque de génesis L#1947 :

    if (block.GetHash() != chainparams.GetConsensus().hashGenesisBlock)
    {
        if (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS))
            {
                if (pindex->GetUndoPos().IsNull()) {
                    CDiskBlockPos _pos;
                    if (!FindUndoPos(state, pindex->nFile, _pos, ::GetSerializeSize(blockundo, SER_DISK, CLIENT_VERSION) + 40))
                        return error("ConnectBlock(): FindUndoPos failed");
                    if (!UndoWriteToDisk(blockundo, _pos, pindex->pprev->GetBlockHash(), chainparams.MessageStart()))
                        return AbortNode(state, "Failed to write undo data");
    
                    // update nUndoPos in block index
                    pindex->nUndoPos = _pos.nPos;
                    pindex->nStatus |= BLOCK_HAVE_UNDO;
                }
    
                pindex->RaiseValidity(BLOCK_VALID_SCRIPTS);
                setDirtyBlockIndex.insert(pindex);
        }
    }
    
Muy bien, déjame intentar con el cambio anterior. después de eliminar los cambios que he dado en la Actualización 2
Validación.cpp actualizado según la respuesta. pero enfrentando el mismo problema. aquí he adjuntado pantallas de billeteras