Burstcoin 的 base target

Burstcoin 的 base target

按 Burstcoin 的设计,每 4 分钟出一个块,那么如果出块更快或更慢怎么办呢?就靠这个 base target 去调整啦。Base target 的值越大,难度越低,出块就越快。这个在原理上和比特币以太坊是类似的。 1. 对于创世区块,会有一个难度的初始值 ``` if (block.getId() == Genesis.GENESIS_BLOCK_ID && block.getPreviousBlockId() == 0) { block.setBaseTarget(Constants.INITIAL_BASE_TARGET); ``` 1. 对于头 2700 个块,计算每个块的base target 时,先取出前 4 个块的 base target 平均值。 ``` Block itBlock = previousBlock; BigInteger avgBaseTarget = BigInteger.valueOf(itBlock.getBaseTarget()); do { itBlock = downloadCache.getBlock(itBlock.getPreviousBlockId()); avgBaseTarget = avgBaseTarget.add(BigInteger.valueOf(itBlock.getBaseTarget())); } while (itBlock.getHeight() > block.getHeight() - 4); avgBaseTarget = avgBaseTarget.divide(BigInteger.valueOf(4)); ``` 1. 在算出当前块与前面第 4 个块的出块时间差,出 4 个块的理想时间值是 4 * 4 * 60 = 960s,如果实际时间差大于这个值,则应该增大 base target 以减小难度,如果实际时间差小于这个值,则应该减小 base target 以增大难度。 ``` long curBaseTarget = avgBaseTarget.longValue(); long newBaseTarget = BigInteger.valueOf(curBaseTarget).multiply(BigInteger.valueOf(difTime)) .divide(BigInteger.valueOf(240L * 4)).longValue(); ``` 代码中的 newBaseTarget 就是调整过后的 base target。

按 Burstcoin 的设计,每 4 分钟出一个块,那么如果出块更快或更慢怎么办呢?就靠这个 base target 去调整啦。Base target 的值越大,难度越低,出块就越快。这个在原理上和比特币以太坊是类似的。

  1. 对于创世区块,会有一个难度的初始值
  if (block.getId() == Genesis.GENESIS_BLOCK_ID && block.getPreviousBlockId() == 0) {
      block.setBaseTarget(Constants.INITIAL_BASE_TARGET);
  1. 对于头 2700 个块,计算每个块的base target 时,先取出前 4 个块的 base target 平均值。
      Block itBlock = previousBlock;
      BigInteger avgBaseTarget = BigInteger.valueOf(itBlock.getBaseTarget());
      do {
        itBlock = downloadCache.getBlock(itBlock.getPreviousBlockId());
        avgBaseTarget = avgBaseTarget.add(BigInteger.valueOf(itBlock.getBaseTarget()));
      } while (itBlock.getHeight() > block.getHeight() - 4);
      avgBaseTarget = avgBaseTarget.divide(BigInteger.valueOf(4));
  1. 在算出当前块与前面第 4 个块的出块时间差,出 4 个块的理想时间值是 4 4 60 = 960s,如果实际时间差大于这个值,则应该增大 base target 以减小难度,如果实际时间差小于这个值,则应该减小 base target 以增大难度。
      long curBaseTarget = avgBaseTarget.longValue();
      long newBaseTarget = BigInteger.valueOf(curBaseTarget).multiply(BigInteger.valueOf(difTime))
          .divide(BigInteger.valueOf(240L * 4)).longValue();

代码中的 newBaseTarget 就是调整过后的 base target。

  • 发表于 2019-08-10 21:31
  • 阅读 ( 2352 )
  • 学分 ( 5 )
  • 分类:分布式存储

评论