¿Puede alguien señalarme el código fuente y explicar cómo se calcula el promedio para el ajuste de dificultad que se lleva a cabo cada 2016? Actualización: he consultado con preguntas anteriores, pero no se ha documentado correctamente y no soy un experto, por lo que sería muy apreciado.
La función está CalculateNextWorkRequired
en pow.cpp
L#49 :
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();
}
Explicación :
1. Si el retargeting está deshabilitado, devuelve la última dificultad.
2. Calcule el intervalo de tiempo entre el último bloque y hace 2016 bloques
3. Trunque el intervalo de tiempo a no menos de 1/4 del intervalo de tiempo objetivo (3,5 días) o no mayor a 4 veces el intervalo de tiempo objetivo (8 semanas).
4. Multiplique el último objetivo de dificultad por la proporción realTimespan:targetTimespan
5. Trunque al objetivo máximo permitido (bnPowLimit) si el objetivo resultante es demasiado alto (dificultad muy baja)
Fritz
Fritz
JBaczuk
JBaczuk