按 Burstcoin 的设计,每 4 分钟出一个块,那么如果出块更快或更慢怎么办呢?就靠这个 base target 去调整啦。Base target 的值越大,难度越低,出块就越快。这个在原理上和比特币以太坊是类似的。
- 对于创世区块,会有一个难度的初始值
if (block.getId() == Genesis.GENESIS_BLOCK_ID && block.getPreviousBlockId() == 0) {
block.setBaseTarget(Constants.INITIAL_BASE_TARGET);
- 对于头 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));
- 在算出当前块与前面第 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。