public uint NBitcoinStyle_CalculateNextWorkRequired(BlockHeader header, uint lastRetargetTime) { if (_nbitcoin_consensus.PowNoRetargeting) { return(header.Bits); } // Limit adjustment step var nActualTimespan = TimeSpan.FromSeconds(header.TimeStamp - lastRetargetTime); if (nActualTimespan < TimeSpan.FromTicks(_nbitcoin_consensus.PowTargetTimespan.Ticks / 4)) { nActualTimespan = TimeSpan.FromTicks(_nbitcoin_consensus.PowTargetTimespan.Ticks / 4); } if (nActualTimespan > TimeSpan.FromTicks(_nbitcoin_consensus.PowTargetTimespan.Ticks * 4)) { nActualTimespan = TimeSpan.FromTicks(_nbitcoin_consensus.PowTargetTimespan.Ticks * 4); } // Retarget var bnNew = new NBitcoin_Target(header.Bits).ToBigInteger(); var cmp = new NBitcoin_Target(bnNew).ToCompact(); bnNew = bnNew * (new BigInteger((long)nActualTimespan.TotalSeconds)); bnNew = bnNew / (new BigInteger((long)_nbitcoin_consensus.PowTargetTimespan.TotalSeconds)); var newTarget = new NBitcoin_Target(bnNew); if (newTarget > _nbitcoin_consensus.PowLimit) { newTarget = _nbitcoin_consensus.PowLimit; } return(newTarget.ToCompact()); }
public NBitcoin.Target NBitcoinCalculateNextWorkRequired(BlockHeader header, uint lastRetargetTime) { NBitcoin.Consensus consensus = NBitcoin.Network.Main.Consensus; // Limit adjustment step var nActualTimespan = TimeSpan.FromSeconds(header.TimeStamp - lastRetargetTime); if (nActualTimespan < TimeSpan.FromTicks(consensus.PowTargetTimespan.Ticks / 4)) { nActualTimespan = TimeSpan.FromTicks(consensus.PowTargetTimespan.Ticks / 4); } if (nActualTimespan > TimeSpan.FromTicks(consensus.PowTargetTimespan.Ticks * 4)) { nActualTimespan = TimeSpan.FromTicks(consensus.PowTargetTimespan.Ticks * 4); } // Retarget var bnNew = new NBitcoin.Target(header.Bits).ToBigInteger(); uint cmp = new NBitcoin.Target(bnNew).ToCompact(); bnNew = bnNew * (new BigInteger((long)nActualTimespan.TotalSeconds)); bnNew = bnNew / (new BigInteger((long)consensus.PowTargetTimespan.TotalSeconds)); var newTarget = new NBitcoin.Target(bnNew); if (newTarget > consensus.PowLimit) { newTarget = consensus.PowLimit; } return(newTarget); }
public void Setup() { _t1 = new MS_Target(_perfectCompactValue); _nt1 = new NBitcoin_Target(_perfectCompactValue); _header = new BlockHeader { TimeStamp = _blockTime, Bits = _bits }; }
public void NBitcoinCalculateNextWorkRequiredTest(uint lastRetargetTime, int height, uint blockTime, uint bits, uint expectedResult) { var header = new BlockHeader { TimeStamp = blockTime, Bits = bits }; NBitcoin.Target result = NBitcoinCalculateNextWorkRequired(header, lastRetargetTime); Assert.Equal(expectedResult, result.ToCompact()); }