zcash難度調(diào)整算法

zcash的難度調(diào)整算法在zcash的協(xié)議文檔(Protocol Specification)p37,6.4.3 Dif culty adjustment中有詳細(xì)描述,在源碼中的實(shí)現(xiàn)位于
https://github.com/zcash/zcash/blob/master/src/pow.cpp 的CalculateNextWorkRequired中,由于源碼中的實(shí)現(xiàn)分散于各個相關(guān)文件,現(xiàn)使用C語言集中實(shí)現(xiàn)與解釋如下

常量定義

static int64_t pow_averaging_window = 17;
static int64_t pow_max_adjust_down = 32;
static int64_t pow_max_adjust_up = 16;
static int64_t pow_target_spacing = 150;
static int pow_median_blockspan = 11;
staic double pow_limit = 0.0;
    if(testnet)
        pow_limit = pow(2, 251) - 1;
    else
        pow_limit = pow(2, 243) - 1;

實(shí)現(xiàn)及解釋

int64_t get_actual_timespan(uint32_t height)
{
    uint64_t timestamps[11] = {0};
    uint64_t timestamps2[11] = {0};
   //獲取前當(dāng)前塊的前11個塊及height - pow_averaging_window前11塊的中位數(shù)(注意是降序排列)時間之差
    get_block_times(height, timestamps);
    get_block_times(height - pow_averaging_window, timestamps2);
    return get_median_time(timestamps) - get_median_time(timestamps2);
}
double get_nextblock_target(bool testnet, uint32_t height)
{
     double mean_target = 0.0;
    if (height <= pow_averaging_window) {
        mean_target = pow_limit;
    } else {
        sds nbits[17];
        //當(dāng)前塊的前17塊的難度
        get_block_nbits(height, nbits);
        //求得平均值
        mean_target = get_mean_target(nbits);
    }
   
    int64_t actual_timespan = get_actual_timespan(height);
    int64_t averaging_window_timespan = pow_averaging_window * pow_target_spacing;
    actual_timespan = averaging_window_timespan + (actual_timespan - averaging_window_timespan) / 4;
    int64_t min_actual_timespan = (averaging_window_timespan * (100 - pow_max_adjust_up)) / 100;
    int64_t max_actual_timespan = (averaging_window_timespan * (100 + pow_max_adjust_down)) / 100;
    if (actual_timespan < min_actual_timespan) {
        actual_timespan = min_actual_timespan;
    }
    if (actual_timespan > max_actual_timespan) {
        actual_timespan = max_actual_timespan;
    }

    printf("averaging_window_timespan:%ld, mean_target * actual_timespan:%lf\n", averaging_window_timespan, mean_target * actual_timespan);
    double target  = mean_target * actual_timespan / averaging_window_timespan;
    if (target > pow_limit)
        target = pow_limit;
    printf("target:%lf\n", target);
    return floor(target);
}

數(shù)據(jù)壓縮(會省略后幾位非零數(shù)字),得到nbit,此時得到的數(shù)據(jù)才會跟鏈上的數(shù)據(jù)相等

至于怎么得到nbits,請查閱
http://www.itdecent.cn/p/169458321386

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容