From d74af4f57050195e0e95554cd269a1469e5406a3 Mon Sep 17 00:00:00 2001 From: iguana Date: Sat, 4 Jun 2016 11:59:00 +0300 Subject: [PATCH 1/2] BaseTarget calculation algorithm fixing the blocktimes. Fix: average block time considers last two existing blocks plus the new block --- .../scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala b/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala index 78d4e3cd..b2019a53 100644 --- a/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala +++ b/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala @@ -106,7 +106,7 @@ class NxtLikeConsensusModule(AvgDelay: Duration = 5.seconds) } else Future(None) } - private def effectiveBalance[TT](account: Account)(implicit transactionModule: TransactionModule[TT]) = + protected def effectiveBalance[TT](account: Account)(implicit transactionModule: TransactionModule[TT]) = transactionModule.blockStorage.state.asInstanceOf[BalanceSheet] .balanceWithConfirmations(account.address, EffectiveBalanceDepth) @@ -125,7 +125,8 @@ class NxtLikeConsensusModule(AvgDelay: Duration = 5.seconds) val height = history.heightOf(prevBlock).get val prevBaseTarget = consensusBlockData(prevBlock).baseTarget if (height % 2 == 0) { - val blocktimeAverage = history.averageDelay(prevBlock, AvgBlockTimeDepth) + val blocktimeAverage = history.parent(prevBlock, AvgBlockTimeDepth - 1) + .map( b => (timestamp - b.timestampField.value) / AvgBlockTimeDepth) .getOrElse(timestamp - prevBlock.timestampField.value) / 1000 val baseTarget = (if (blocktimeAverage > AvgDelayInSeconds) { From fa1ba40e46eb712454b2a3867c9220030905cc4a Mon Sep 17 00:00:00 2001 From: iguana Date: Sat, 4 Jun 2016 21:26:41 +0300 Subject: [PATCH 2/2] Fix of instance variable initialization --- .../scorex/consensus/nxt/NxtLikeConsensusModule.scala | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala b/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala index b2019a53..3d889d5a 100644 --- a/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala +++ b/scorex-consensus/src/main/scala/scorex/consensus/nxt/NxtLikeConsensusModule.scala @@ -27,9 +27,8 @@ class NxtLikeConsensusModule(AvgDelay: Duration = 5.seconds) val MaxBlocktimeLimit = normalize(67) val BaseTargetGamma = normalize(64) - private val AvgDelayInSeconds: Long = AvgDelay.toSeconds - - private def normalize(value: Long): Double = value * AvgDelayInSeconds / (60: Double) + private def avgDelayInSeconds: Long = AvgDelay.toSeconds + private def normalize(value: Long): Double = value * avgDelayInSeconds / (60: Double) override def isValid[TT](block: Block)(implicit transactionModule: TransactionModule[TT]): Boolean = Try { @@ -129,11 +128,11 @@ class NxtLikeConsensusModule(AvgDelay: Duration = 5.seconds) .map( b => (timestamp - b.timestampField.value) / AvgBlockTimeDepth) .getOrElse(timestamp - prevBlock.timestampField.value) / 1000 - val baseTarget = (if (blocktimeAverage > AvgDelayInSeconds) { - (prevBaseTarget * Math.min(blocktimeAverage, MaxBlocktimeLimit)) / AvgDelayInSeconds + val baseTarget = (if (blocktimeAverage > avgDelayInSeconds) { + (prevBaseTarget * Math.min(blocktimeAverage, MaxBlocktimeLimit)) / avgDelayInSeconds } else { prevBaseTarget - prevBaseTarget * BaseTargetGamma * - (AvgDelayInSeconds - Math.max(blocktimeAverage, MinBlocktimeLimit)) / (AvgDelayInSeconds * 100) + (avgDelayInSeconds - Math.max(blocktimeAverage, MinBlocktimeLimit)) / (avgDelayInSeconds * 100) }).toLong bounded(baseTarget, 1, Long.MaxValue).toLong } else {