BTTC层初始化配置

创世块包含配置网络的所有基本信息。它基本上是 Bor 链的配置文件。要启动 Bor 链,用户需要将文件的位置作为参数传递。

Borgenesis.json用作创世块和参数。这是 Bor 创世纪的一个例子config

"config": {
    "chainId": 15001,
    "homesteadBlock": 1,
    "eip150Block": 0,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "bor": {
      "period": 1,
      "producerDelay": 4,
      "sprint": 64,
      "backupMultiplier": 2,
      "validatorContract": "0x0000000000000000000000000000000000001000",
      "stateReceiverContract": "0x0000000000000000000000000000000000001001"
    }
  }
bor配置参数解释

period:出块时间

producerDelay:两次sprint之间的时间

sprint:每次sprint的块数

backupMultiplier:确定摆动时间的备用乘数 「后加」

validatorContract:Bor验证者集创始合约地址

stateReceiverContract:状态接收者创世合约地址

bor初始验证者地址设置

bttc层bor共识第一个sprint周期内的验证者集合,是从初识化合约中硬编码的数据获取的,

对于genesis中alloc->0000000000000000000000000000000000001000->code

默认的验证者地址是在BorValidatorSet.sol合约中的getInitialValidators设置的(查看代码

/// Get current validator set (last enacted or initial if no changes ever made) with current stake.
  function getInitialValidators() public view returns (address[] memory, uint256[] memory) {
    address[] memory addrs = new address[](3);
    addrs[0] = 0xfA841eAAcf03598bAadF0266eF6097C654DE5465;
    addrs[1] = 0x80CFb197Be875eE45294AC31406E6483e3eAb02E;
    addrs[2] = 0x0aB3ab4542ED5FA2A67B2B8DAbC82C42162853A6;
    uint256[] memory powers = new uint256[](3);
    powers[0] = 1;
    powers[1] = 1;
    powers[2] = 1;
    return (addrs, powers);
  }

对于私链的自定义可以通过提供的模版方式进行修改

首先clone https://github.com/bttcprotocol/genesis-contracts.git

然后修改初始化验证者列表,为自己需要的地址集合

https://github.com/bttcprotocol/genesis-contracts/blob/master/validators.json

然后就可以生成我们自己的初始合约

node generate-borvalidatorset.js --bttc-chain-id 9527 --delivery-chain-id delivery-9527
--bttc-chain-id:是对应bttc层的链id
--delivery-chain-id: 是设置delivery层的链id

重新创建后getInitialValidators中获取的就是我们自定义的初始话验证者地址集合了

使用genesis初始化bttc层启动后,第一个sprint周期内,会使用自定义的验证者集合进行出块,

查询此初始期间block的miner为0x0000000000000000000000000000000000000000

默认的话,下一周期开始与delivery层进行数据获取 // TODO

如果是为了单独测试bttc层,避免delivery层的干扰,可以禁用delivery层,也就是第一个sprint周期后,也不会向

delivery层获取验证者集合,一直消费合约初始化的验证者集合。

关闭delivery层链接的方式是,启动参数添加

--bor.withoutheimdall

需要注意,当前最新代码,该withoutheimdall参数目前只支持启动参数传入,config方式参数未支持。

如果添加参数后,将会执行WithoutHeimdall判断逻辑,相应的代码逻辑为

miner->commitNewWork->commit->FinalizeAndAssemble->(headerNumber%c.config.Sprint == 0)->checkAndCommitSpan->needToCommitSpan->fetchAndCommitSpan->WithoutHeimdall
getNextHeimdallSpanForTest / HeimdallClient.FetchWithRetry

周期验证者地址确认后,将和其他pos链一样,各个当前周期验证者进行依次出块,以及区块同步,这里就不多做解释了

bttc官方提供的脚本环境

主网:https://github.com/bttcprotocol/launch/tree/master/mainnet-v1/without-sentry/bttc

测试网:https://github.com/bttcprotocol/launch/tree/master/testnet-1029/without-sentry/bttc

"bor": {
      "period": 2,
      "producerDelay": 6,
      "sprint": 64,
      "backupMultiplier": 2,
      "validatorContract": "0x0000000000000000000000000000000000001000",
      "stateReceiverContract": "0x0000000000000000000000000000000000001001",
      "overrideStateSyncRecords": {
      },