比特币源码解析(8) - 数据结构 - 共识-呼,是出一口气;吸,是争一口气!(生活不止眼前的苟且,还有读不懂的诗和到不了的远方。)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012183589/article/details/77776749

0x00 摘要

共识机制一直以来都是区块链研究领域的热点,比特币采用的是POW机制,通过大量的算力来解决一个困难性问题从而产生新的区块,而正因为产生新的区块需要大量的算力,网络中的节点才相信最长的链是最可靠的,这种最长链原则也是比特币中共识的原理。

0x01 Consensus

// src/consensus/params.h
namespace Consensus {

enum DeploymentPos
{
    DEPLOYMENT_TESTDUMMY,
    DEPLOYMENT_CSV, // Deployment of BIP68, BIP112, and BIP113.
    DEPLOYMENT_SEGWIT, // Deployment of BIP141, BIP143, and BIP147.
    // NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
    MAX_VERSION_BITS_DEPLOYMENTS
};

/** * Struct for each individual consensus rule change using BIP9. */
struct BIP9Deployment {
    /** Bit position to select the particular bit in nVersion. */
    int bit;
    /** Start MedianTime for version bits miner confirmation. Can be a date in the past */
    int64_t nStartTime;
    /** Timeout/expiry MedianTime for the deployment attempt. */
    int64_t nTimeout;
};

/** * 影响共识的参数 */
struct Params {
    uint256 hashGenesisBlock;  // 创世区块的hash
    int nSubsidyHalvingInterval;  // 奖励减半时间间隔
    /** Block height and hash at which BIP34 becomes active */
    int BIP34Height;  // 区块高度
    uint256 BIP34Hash;  // 区块hash
    /** Block height at which BIP65 becomes active */
    int BIP65Height;
    /** Block height at which BIP66 becomes active */
    int BIP66Height;
    /** * 在2016个区块中至少要有多少个区块被矿工确认,规则改变才能生效 * 在BIP9上线时还使用(nPowTargetTimespan / nPowTargetSpacing)值 * Examples: 1916 for 95%, 1512 for testchains. */
    uint32_t nRuleChangeActivationThreshold;
    uint32_t nMinerConfirmationWindow;
    BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS];
    /** POW参数 */
    uint256 powLimit;  // 难度
    bool fPowAllowMinDifficultyBlocks; //是否允许最低难度
    bool fPowNoRetargeting;  // 不调整难度
    int64_t nPowTargetSpacing; // 区块产生平均时间
    int64_t nPowTargetTimespan; // 难度调整时间
    int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; }
    uint256 nMinimumChainWork;  // 当前难度最小值
    uint256 defaultAssumeValid; // 在此区块之前的区块都认为是有效的
};
} // namespace Consensus
阅读更多

更多精彩内容