深入比特币以太坊源码带你解读POW共识机制

Posted 剑行歌之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入比特币以太坊源码带你解读POW共识机制相关的知识,希望对你有一定的参考价值。

概念

       全称为Proof Of Work,又叫工作量证明。POW是最早的共识机制。POW是指工作者通过一定的工作量,提供一个能被大多数验证者快速验证的答案,从而得到奖励的机制。

原理

讲原理之前,先给大家普及两个概念:难度值和nonce

难度值

       难度值就是矿工挖矿成功的难度成程度,那这个是怎么判断的呢?我们先学习一个公式:
        target值 = 最大目标值 / 难度值
        其中最大目标值是固定的,出块之前,区块链网络设置了一个target值,target值越低,生成有效hash的集合就越小,生成有效hash就越困难。当前出块难度值,它决定了大概需要经过多少次哈希运算才能产生一个合法的区块。出块之前,区块链网络设置了一个target值,target值越低,生成有效hash的集合就越小,生成有效hash就越困难。

nonce

       nonce值是什么呢?它就是一个随机数,系统区块工作证明的参数。由于给定的一组数据只能生成一个hash,矿工如何确保他们生成的hash小于target?它们通过添加一个称为nonce的整数(number only used once )来改变输入的数据,一旦找到一个有效的hash,它就被广播到网络中,同时区块被添加到区块链中,找到这个nonce整数的矿工就能获得奖励。

原理

       上面两个概念了解了之后呢,原理其实就很容易理解了。pow机制的原理其实就是:系统设定好挖矿难度(比特币2016个块之后重新计算,以太坊每次生成区块都重新计算),然后矿工开始工作出块,矿工每次出块都是nonce从1开始递增进行寻找可用的nonce值,直到找到符合规则、可用的hash为止,最先找到的矿工可获得挖矿奖励。

源码解读

理论我们讲的差不多了,大家坐稳扶好,接下来直接上代码进行分析,一口气读完舒适感最佳。

比特币
static bool GenerateBlock(ChainstateManager& chainman, CBlock& block, uint64_t& max_tries, unsigned int& extra_nonce, uint256& block_hash)
{
	//  区块hash置空
    block_hash.SetNull();

    {
        LOCK(cs_main);
        CHECK_NONFATAL(std::addressof(::ChainActive()) == std::addressof(chainman.ActiveChain()));
        IncrementExtraNonce(&block, chainman.ActiveChain().Tip(), extra_nonce);
    }

    CChainParams chainparams(Params());

	// 获取可用nonce值
    while (max_tries > 0 && block.nNonce < std::numeric_limits<uint32_t>::max() && !CheckProofOfWork(block.GetHash(), block.nBits, chainparams.GetConsensus()) && !ShutdownRequested()) {
        ++block.nNonce;
        --max_tries;
    }
    if (max_tries == 0 || ShutdownRequested()) {
        return false;
    }
    if (block.nNonce == std::numeric_limits<uint32_t>::max()) {
        return true;
    }

    std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(block);
    if (!chainman.ProcessNewBlock(chainparams, shared_pblock, true, nullptr)) {
        throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
    }

    block_hash = block.GetHash();
    return true;
}

计算nonce值的那一段我们单独进行分析

while (max_tries > 0 && block.nNonce < std::numeric_limits<uint32_t>::max() && !CheckProofOfWork(block.GetHash(), block.nBits, chainparams.GetConsensus()) && !ShutdownRequested()) {
    ++block.nNonce;
    --max_tries;
}

        1.首先判断是否达到最大重试次数MaxTries > 0 ,maxTries默认值DEFAULT_MAX_TRIES为1000000,达到最大重试次数未获得可用nonce,则该矿工此次挖矿失败。

if (max_tries == 0 || ShutdownRequested()) {
   return false;
}

        2.判断nNonce < std::numeric_limits<uint32_t>::max(),即控制nonce在一次挖矿作业中的随机次数不得超过uint32的最大值。如果nNonce值修改的次数已经超过了规定的次数还没有找到工作量证明的一个解,则废弃这个候选区块,重新回到前面创建一个新的候选区块。

if (block.nNonce == std::numeric_limits<uint32_t>::max()) {
    return true;
}

        3.执行CheckProofOfWork,源码如下

bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params)
{
    bool fNegative;
    bool fOverflow;
    arith_uint256 bnTarget;

    bnTarget.SetCompact(nBits, &fNegative, &fOverflow);

    // Check range
    if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
        return false;

    // Check proof of work matches claimed amount
    if (UintToArith256(hash) > bnTarget)
        return false;

    return true;
}

上面函数大概意思就是根据nBits难度值获取到的target,是在可用区间内的,并且计算得出的hash小于target值,则本次hash为可用hash值。
        4.未挖矿成功则一直循环计算,直到找到可用nonce值或上述1、2、3中某一步骤不符合while循环条件为止。

以太坊

待整理

优点

去中心化

将记账权公平的分派到所有节点,记账权是通过看节点的PoW, 谁挖矿最快, 谁就能拿到这个矿

安全

破解系统至少需要攻击51%的节点,成本高,耗时长

去信任化

节点之间无需信任保证,通过零知识证明快速验证安全性

缺点

出块速度慢,共识时间长

       顾名思义,工作量证明需要大量的工作计算hash,花费的共识时间长,出块速度慢。比如比特币出块时间10分钟,每秒钟支持最大交易数仅为7笔。

能耗大

       挖矿需要大量的哈希运算,需要电力和各种算力资源,而且找到合适的哈希值实际上并没有其他的作用

算力集中化

       由于矿池的出现,导致现在算力集中在几家,BTC.COM,Antpool,ViaBTC前三大矿池,已经占到了全网52.4%的算力水平。

思考

我们看完文章就应该知道,pow的初衷就是它的破解复杂度,安全性高,pow的攻击破解需要攻击51%的节点才可能实现。但是算力集中化的出现,导致前几大矿池拥有的算力超过了51%,可能会出现他们联合起来恶意出块的现象,违背了pow的初衷。

比特币源码链接:
https://github.com/bitcoin/bitcoin

以上是关于深入比特币以太坊源码带你解读POW共识机制的主要内容,如果未能解决你的问题,请参考以下文章

POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考

POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考

以太坊2.0共识机制,POS

以太坊挖矿

PoW挖矿算法原理及其在比特币以太坊中的实现

以太坊2.0未来将颠覆世界!数字货币-比特币2020-2-19走势预测解析!