¿Dónde está el cálculo de ajuste para el valor objetivo en el código fuente?

¿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.

Respuestas (1)

La función está CalculateNextWorkRequireden pow.cppL#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)

gracias. ¿Cuándo se deshabilitaría la reorientación? ¿Cómo aparece esto?
¿Y en qué parte de este código está el legendario error roto y sin corregir que causa actualizaciones cada 2015 en lugar de 2016 bloques?