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步骤 (可自行定制)
- 更改所有网络的默认端口(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);
-
更改区块奖励(可选)
这是worker用于解决区块的token数量。
//在validation.cpp中
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
-
改变coinbase成熟度(可选)
这决定了需要多少块确认才能使用coinbase奖励
// in consensus/consensus.h
static const int COINBASE_MATURITY = 100;
-
更改减半间隔(可选)
这决定了块奖励减半的频率。在btc中,每2016块或每4年减半(块时间为10分钟)。请注意,这是间接影响总token供应的方法之一。
cpp // 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的fork链,得先用btc的二进制程序连到btc的dns同步全节点数据(以保证继承主网上的所有数据)
- 主网已经产生了57W+的块,在同步完之前无法进行mine
- 同步完之后,关闭程序
- 修改fork链源码,将fork高度调整为当前块的下个块.同时去掉代码中的dns节点 (以及其它的调整)
- 使用修改后的fork链的二进制程序,执行mine命令,产生出fork块及后面的块(代码中对fork块的难度做调整)
- 产生出一定的块后,再作为自己链的dns节点,配置到代码中