BTC系列 - Fork BTC

BCH

BCH是BTC的扩容方案,使用8M大区块,不支持SegWit,因为开发团队认为有了8M这么大的区块SegWit已变得无关紧要。BCH吸取了去年以太坊 fork的教训,加入了双向重放保护,所以fork后并没有出现损失等混乱情况。后来其他的fork token也普遍效仿,普遍加入重放保护。BCH于BTC区块高度478599fork,时间在2017年8月。

BCH的算法与BTC相同,一些Pool还加入BTC/BCH自动切换功能,可为worker自动切换至收益高的token。最初BCH采用紧急难度调整机制(EDA),但后来发现EDA并不够稳定,有时候难度是BTC的3倍以上。所以BCH于2018年11月13日执行了硬fork升级,目前已经加入DAA难度调整机制。

BCH由BitcoinABC、Bitcoin Unlimited、BitcoinXT等多个团队共同开发维护,所以权利并不是集中在一方手中。

BCD(比特钻石)

BCD,是Bitcoin Diamond的缩写,中文名为比特钻石。由Evey与007团队联合开发,Bitcoin Diamond Foundation负责运营。BCD首次公布是在SegWit2x fork宣告失败之后,于BTC区块高度495866 fork,在2017年11月底进行。BCD使用8M大区块,支持SegWit,具有重放保护,并使用新的工作验证算法创建区块,相比BTC,它具有事务隐私保护功能,事务额也可进行加密。

BCD的总量为2.1亿个,刚好是BTC的10倍,其中有1.7亿个BCD提供给BTC的持有者,分发兑换比例是1BTC:10BCD,其余4000万个BCD将自动转入社区奖励池作为奖励。

在这里插入图片描述

Fork步骤 (可自行定制)

  1. 更改所有网络的默认端口(mainnet,testnet,regtest):
		nRPCPort = <port_number>; //在chainparamsbase.cpp中
		nDefaultPort = <port_number>; //在chainparams.cpp中
  1. 更改所有网络的“魔术消息”或消息前缀(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>;
  1. 更改所有网络(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;
  1. 更改区块奖励(可选)

    这是worker用于解决区块的token数量。

		//在validation.cpp中
		CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
  1. 改变coinbase成熟度(可选)

    这决定了需要多少块确认才能使用coinbase奖励

		// in consensus/consensus.h
		static const int COINBASE_MATURITY = 100;
  1. 更改减半间隔(可选)

    这决定了块奖励减半的频率。在btc中,每2016块或每4年减半(块时间为10分钟)。请注意,这是间接影响总token供应的方法之一。
    cpp // in chainparams.cpp consensus.nSubsidyHalvingInterval = 210000 //补贴减半间隔

  2. 更新最大数量

		static const CAmount MAX_MONEY = 21000000 * COIN; 在amount.h。
  1. 重置最小链工作
		//在chainparams.cpp中:
		consensus.nMinimumChainWork = uint256S(“00000000000000000000000000000000000000000000000000000000000100010001”);
  1. 删除DNS种子

    这些节点可用于在开始时为连接设定种子。

    • 在chainparams.cpp,删除行开头vSeeds.emplace_back
  2. 删除检查站

    这些是区块链中的检查点,但您将从零开始。

    • 在chainparams.cpp,设置checkpointData = {};
  3. 更新 DEFAULT_MAX_TIP_AGE

    允许区块相隔10年(4000天)(允许在2009年开采的原始成因块)。请注意,您也可以生产自己的创世块,但这更为复杂。

		//在validation.cpp中:
		int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE * 4000;
  1. 更改所有网络的阻止时间(可选)(mainnet,testnet,regtest)
		//在chainparams.cpp 
		consensus.nPowTargetSpacing = 10 * 60; // 60秒* 10 = 10分钟
  1. 更改所有网络的难度调整间隔(可选)(mainnet,testnet,regtest)

    这决定了块难度的调整频率,以便块时间可以平均consensus.nPowTargetSpacing参数。

		// in chainparams.cpp 
		consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; //两个星期

测试步骤

  1. 由于要做btc的fork链,得先用btc的二进制程序连到btc的dns同步全节点数据(以保证继承主网上的所有数据)
  2. 主网已经产生了57W+的块,在同步完之前无法进行mine
  3. 同步完之后,关闭程序
  4. 修改fork链源码,将fork高度调整为当前块的下个块.同时去掉代码中的dns节点 (以及其它的调整)
  5. 使用修改后的fork链的二进制程序,执行mine命令,产生出fork块及后面的块(代码中对fork块的难度做调整)
  6. 产生出一定的块后,再作为自己链的dns节点,配置到代码中

往期精彩回顾:
区块链知识系列
密码学系列
共识系列
公链调研系列
以太坊系列
EOS系列
智能合约系列
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖魁首

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值