简介
这里写图片描述
每一个块都会包含前一个区块的哈希(Hash Of Previous Block Header),并包含这次所含交易的信息(Merkle Root),最终形成一个链。块的哈希只是针对区块的头部来做,哈希的时候并不直接对所有交易来做,但是Merkle Root会包含交易信息的哈希,具体后面交易章节会做详细介绍。
初始化
bitcoind支持三种链,在src/chainparams.cpp中,分别对应三种class:
1. 主链:CMainParams
2. 测试链:CTestNetParams
3. 本地测试链:CRegTestParams
创世区块(Genesis Block)
链上的第一个区块,这个块没有Previous Block。
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
P2P种子
其中主链跟测试链都是线上的链,都需要初始化种子DNS,以便获取最新的区块链,以及广播交易、挖矿等信息。
而本地测试链,是本地的,不需要初始化种子。
vSeeds.emplace_back("seed.bitcoin.sipa.be"); // Pieter Wuille, only supports x1, x5, x9, and xd
vSeeds.emplace_back("dnsseed.bluematt.me"); // Matt Corallo, only supports x9
vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org"); // Luke Dashjr
vSeeds.emplace_back("seed.bitcoinstats.com"); // Christian Decker, supports x1 - xf
vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch"); // Jonas Schnelli, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.btc.petertodd.org"); // Peter Todd, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.bitcoin.sprovoost.nl"); // Sjors Provoost
共识初始化
consensus.nSubsidyHalvingInterval = 210000;
// 挖矿奖励减半时间间隔,用以控制整体币的数量
consensus.BIP16Exception = uint256S("0x00000000000002dc756eebf4f49723ed8d30cc28a5f108eb94b1ba88ac4f9c22");
consensus.BIP34Height = 227931;
// 区块高度,也就是说一共有多少个块
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
// 用以挖矿时,工作量的证明,这个会根据出块的速度而自动调整,以保证出块的速度恒定
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
// 区块难度调整时间,默认两周,以控制整体出块速度
consensus.nPowTargetSpacing = 10 * 60;
// 区块平均产生时间,默认10分钟
consensus.fPowAllowMinDifficultyBlocks = false;
// 默认不允许最低难度
consensus.fPowNoRetargeting = false;
consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
// 两周期望产生的块数,意味着每产生2016个块,会检查这2016个块产生的时间是否达到两周,如果高于或低于两周,会去调整powLimit
// 意味着挖矿的人越多,就越难挖到矿
|
|