Cuando leo este libro Master Bitcoin , tengo un problema para entender la "Dificultad" en el Capítulo 8.
Hay una ecuación de dificultad:
New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)
Me siento confundido.
De acuerdo con la fórmula, si el Tiempo real fuera más largo que 20160 minutos , la Dificultad nueva sería mayor que la Dificultad anterior , y luego el Tiempo real sería más y más largo.
Se ve muy extraño. Para mí la ecuación debería ser:
New Difficulty = Old Difficulty * (20160 minutes / Actual Time of Last 2016 Blocks)
Sin embargo, encontré que esta fórmula es consistente con la del código bitcoin.
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
{
if (params.fPowNoRetargeting)
return pindexLast->nBits;
// Limit adjustment step
int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
if (nActualTimespan < params.nPowTargetTimespan/4)
nActualTimespan = params.nPowTargetTimespan/4;
if (nActualTimespan > params.nPowTargetTimespan*4)
nActualTimespan = params.nPowTargetTimespan*4;
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
bnNew.SetCompact(pindexLast->nBits);
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
if (bnNew > bnPowLimit)
bnNew = bnPowLimit;
return bnNew.GetCompact();
}
Entonces encontré esta respuesta .
Esto es lo que entiendo, pero por qué es diferente de la ecuación del libro y el código.
actualizar
Creo que esto era sólo una expresión ambigua.
La mejor expresión debería ser:
New Difficulty Target = Old Difficulty Target * (Actual Time of Last 2016 Blocks / 20160 minutes)
El código que está citando en realidad no se ocupa de la dificultad. Se trata de objetivos . El objetivo es el valor máximo de 256 bits que se le permite tener al hash del bloque.
La dificultad se define como 2^208 * 65535/objetivo .
En cuanto al libro, eso se ve mal de hecho.
hola
pieter wuille