BTC分叉链与分叉步骤
BCH
BCH是BTC的扩容方案,使用8M大区块,不支持SegWit,因为开发团队认为有了8M这么大的区块SegWit已变得无关紧要。BCH吸取了去年以太坊分叉的教训,加入了双向重放保护,所以分叉后并没有出现资产损失等混乱情况。后来其他的分叉币也普遍效仿,普遍加入重放保护。BCH于比特币区块高度478599分叉,时间在2017年8月。
BCH的挖抗算法、矿机与BTC相同,一些矿池还加入BTC/BCH自动切换功能,可为矿工自动切换至收益高的币种。最初BCH采用紧急难度调整机制(EDA),但后来发现EDA并不够稳定,有时候挖矿难度是BTC的3倍以上。所以BCH于2018年11月13日执行了硬分叉升级,目前已经加入DAA难度调整机制。
BCH由BitcoinABC、Bitcoin Unlimited、BitcoinXT等多个团队共同开发维护,所以权利并不是集中在一方手中。
BCD(比特币钻石)
BCD,是Bitcoin Diamond的缩写,中文名为比特币钻石。由Evey与007团队联合开发,Bitcoin Diamond Foundation负责运营。BCD首次公布是在SegWit2x分叉宣告失败之后,于比特币区块高度495866分叉,在2017年11月底进行。BCD使用8M大区块,支持SegWit,具有重放保护,并使用新的工作验证算法创建区块,相比BTC,它具有转账隐私保护功能,交易额也可进行加密。
比特币钻石的总发行量为2.1亿个,刚好是比特币的10倍,其中有1.7亿个比特币钻石提供给比特币的持有者,分发兑换比例是1BTC:10BCD,其余4000万个比特币现金将自动转入社区奖励池作为挖矿奖励。
11月16日,交易所Okex.com与Btcbox.co.jp宣布支持BCD。除此之外,还有Exx.com、Aex.com、Cex.com、Kex.com、Coinbene.com和Rightbtc.com等交易所也表示将会上架BCD。
分叉步骤 (可自行定制)
-
更改所有网络的默认端口(mainnet,testnet,regtest):
nRPCPort = <port_number>; //在chainparamsbase.cpp中 nDefaultPort = <port_number>; //在chainparams.cpp中
-
更改所有网络的“魔术消息”或消息前缀(mainnet,testnet,regtest):
//在chainparams.cpp中 pchMessageStart [0] = 0x <random_byte_value>; pchMessageStart [1] = 0x <random_byte_value>; pchMessageStart [2] = 0x <random_byte_value>; pchMessageStart [3] = 0x <random_byte_value>;
-
更改所有网络(mainnet,testnet,regtest)和所有地址类型(P2PKH,P2SH和密钥)的地址前缀(可选)。
这确定了地址的第一个字符(因此很容易识别)。请参阅地址前缀列表,了解要用于所需字符的字节值。
//在chainparams.cpp中(参见下面的其他网) base58Prefixes [PUBKEY_ADDRESS] = std :: vector <unsigned char>(1,0); base58Prefixes [SCRIPT_ADDRESS] = std :: vector <unsigned char>(1,5); base58Prefixes [SECRET_KEY] = std :: vector <unsigned char>(1,128);
-
更改区块奖励(可选)
这是矿工用于解决区块的硬币数量。
//在validation.cpp中 CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
-
改变coinbase成熟度(可选)
这决定了需要多少块确认才能花费采矿奖励(coinbase交易)。
// in consensus/consensus.h static const int COINBASE_MATURITY = 100;
-
更改减半间隔(可选)
这决定了块奖励减半的频率。在比特币中,每2016块或每4年减半(块时间为10分钟)。请注意,这是间接影响总硬币供应的方法之一。
// in chainparams.cpp consensus.nSubsidyHalvingInterval = 210000 //补贴减半间隔
-
更新最大货币支票价值
static const CAmount MAX_MONEY = 21000000 * COIN; 在amount.h。
-
重置最小链工作
//在chainparams.cpp中: consensus.nMinimumChainWork = uint256S(“00000000000000000000000000000000000000000000000000000000000100010001”);
-
删除DNS种子
这些节点可用于在开始时为连接设定种子。
- 在chainparams.cpp,删除行开头vSeeds.emplace_back
-
删除检查站
这些是区块链中的检查点,但您将从零开始。
- 在chainparams.cpp,设置checkpointData = {};
-
更新 DEFAULT_MAX_TIP_AGE
允许区块相隔10年(4000天)(允许在2009年开采的原始成因块)。请注意,您也可以挖掘自己的创世块,但这更为复杂。
//在validation.cpp中: int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE * 4000;
-
更改所有网络的阻止时间(可选)(mainnet,testnet,regtest)
//在chainparams.cpp consensus.nPowTargetSpacing = 10 * 60; // 60秒* 10 = 10分钟
-
更改所有网络的难度调整间隔(可选)(mainnet,testnet,regtest)
这决定了块难度的调整频率,以便块时间可以平均consensus.nPowTargetSpacing参数。
// in chainparams.cpp consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; //两个星期
测试步骤
- 由于要做btc的分叉链,得先用btc的二进制程序连到btc的dns同步全节点数据(以保证继承主网上的所有数据)
- 主网已经产生了57W+的块,在同步完之前无法进行挖矿
- 同步完之后,关闭程序
- 修改分叉链源码,将分叉高度调整为当前块的下个块.同时去掉代码中的dns节点 (以及其它的调整)
- 使用修改后的分叉链的二进制程序,执行挖矿命令,产生出分叉块及后面的块(代码中对分叉块的难度做调整)
- 产生出一定的块后,再作为自己链的dns节点,配置到代码中