public void AddTransactions_WithoutTransactionsInMempool_DoesNotAddEntriesToBlock() { var newOptions = new PowConsensusOptions() { MaxBlockWeight = 1500 }; this.ExecuteWithConsensusOptions(newOptions, () => { var chain = GenerateChainWithHeight(5, this.network, new Key()); this.consensusLoop.Setup(c => c.Tip) .Returns(chain.GetBlock(5)); var indexedTransactionSet = new TxMempool.IndexedTransactionSet(); this.txMempool.Setup(t => t.MapTx) .Returns(indexedTransactionSet); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var result = powBlockAssembler.AddTransactions(); Assert.Empty(result.Block.Transactions); Assert.Equal(0, result.Selected); Assert.Equal(0, result.Updated); }); }
public void AddTransactions_TransactionAlreadyInInblock_DoesNotAddTransactionToBlock() { var newOptions = new PowConsensusOptions() { MaxBlockWeight = 1500 }; this.ExecuteWithConsensusOptions(newOptions, () => { var chain = GenerateChainWithHeight(5, this.network, this.key); this.consensusLoop.Setup(c => c.Tip) .Returns(chain.GetBlock(5)); var transaction = CreateTransaction(this.network, this.key, 5, new Money(400 * 1000 * 1000), new Key(), new uint256(124124)); var txFee = new Money(1000); var entries = SetupTxMempool(chain, newOptions, txFee, transaction); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); powBlockAssembler.AddInBlockTxEntries(entries); var result = powBlockAssembler.AddTransactions(); Assert.Empty(result.Block.Transactions); Assert.Equal(0, result.Selected); Assert.Equal(0, result.Updated); }); }
public void TestBlockValidity_UsesRuleContextToValidateBlock() { var newOptions = new PowConsensusOptions() { MaxBlockWeight = 1500 }; this.ExecuteWithConsensusOptions(newOptions, () => { var chain = GenerateChainWithHeight(5, this.network, new Key()); this.consensusLoop.Setup(c => c.Tip).Returns(chain.GetBlock(5)); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var block = powBlockAssembler.OnTestBlockValidity(); Assert.NotNull(this.callbackRuleContext); Assert.False(this.callbackRuleContext.CheckMerkleRoot); Assert.False(this.callbackRuleContext.CheckPow); Assert.Equal(block.GetHash(), this.callbackRuleContext.BlockValidationContext.Block.GetHash()); Assert.Equal(chain.GetBlock(5).HashBlock, this.callbackRuleContext.ConsensusTip.HashBlock); Assert.Equal(1500, this.callbackRuleContext.Consensus.Option <PowConsensusOptions>().MaxBlockWeight); this.consensusLoop.Verify(); }); }
public void CreateCoinbase_CreatesCoinbaseTemplateTransaction_AddsToBlockTemplate() { this.ExecuteWithConsensusOptions(new PowConsensusOptions(), () => { var chain = GenerateChainWithHeight(5, this.network, this.key); this.dateTimeProvider.Setup(d => d.GetAdjustedTimeAsUnixTimestamp()) .Returns(new DateTime(2017, 1, 7, 0, 0, 1, DateTimeKind.Utc).ToUnixTimestamp()); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var result = powBlockAssembler.CreateCoinBase(chain.Tip, this.key.ScriptPubKey); Assert.NotEmpty(result.Block.Transactions); Assert.Equal(-1, result.TxSigOpsCost[0]); Assert.Equal(new Money(-1), result.VTxFees[0]); var resultingTransaction = result.Block.Transactions[0]; Assert.Equal((uint)new DateTime(2017, 1, 7, 0, 0, 1, DateTimeKind.Utc).ToUnixTimestamp(), resultingTransaction.Time); Assert.True(resultingTransaction.IsCoinBase); Assert.False(resultingTransaction.IsCoinStake); Assert.Equal(Money.Zero, resultingTransaction.TotalOut); Assert.NotEmpty(resultingTransaction.Inputs); Assert.Equal(TxIn.CreateCoinbase(6).ScriptSig, resultingTransaction.Inputs[0].ScriptSig); Assert.NotEmpty(resultingTransaction.Outputs); Assert.Equal(this.key.ScriptPubKey, resultingTransaction.Outputs[0].ScriptPubKey); Assert.Equal(Money.Zero, resultingTransaction.Outputs[0].Value); }); }
public void ComputeBlockVersion_UsingChainTipAndConsensus_NoBip9DeploymentActive_UpdatesHeightAndVersion() { this.ExecuteWithConsensusOptions(new PowConsensusOptions(), () => { var chain = GenerateChainWithHeight(5, this.network, new Key()); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var result = powBlockAssembler.ComputeBlockVersion(chain.GetBlock(4)); Assert.Equal(5, result.Height); uint version = ThresholdConditionCache.VersionbitsTopBits; Assert.Equal((int)version, result.Version); }); }
public void UpdateHeaders_UsingChainAndNetwork_PreparesBlockHeaders() { this.ExecuteWithConsensusOptions(new PowConsensusOptions(), () => { this.dateTimeProvider.Setup(d => d.GetTimeOffset()).Returns(new DateTimeOffset(new DateTime(2017, 1, 7, 0, 0, 0, DateTimeKind.Utc))); var chain = GenerateChainWithHeight(5, this.network, new Key(), new Target(235325239)); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var block = powBlockAssembler.OnUpdateHeaders(chain.Tip); Assert.Equal(chain.Tip.HashBlock, block.Header.HashPrevBlock); Assert.Equal((uint)1483747200, block.Header.Time); Assert.Equal(1.9610088966776103E+35, block.Header.Bits.Difficulty); Assert.Equal((uint)0, block.Header.Nonce); }); }
public void ComputeBlockVersion_UsingChainTipAndConsensus_Bip9DeploymentActive_UpdatesHeightAndVersion() { var options = this.network.Consensus.Options; var minerConfirmationWindow = this.network.Consensus.MinerConfirmationWindow; var ruleChangeActivationThreshold = this.network.Consensus.RuleChangeActivationThreshold; try { var newOptions = new PowConsensusOptions(); this.network.Consensus.Options = newOptions; this.network.Consensus.BIP9Deployments[0] = new BIP9DeploymentsParameters(19, new DateTimeOffset(new DateTime(2016, 1, 1, 0, 0, 0, DateTimeKind.Utc)), new DateTimeOffset(new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc))); this.network.Consensus.MinerConfirmationWindow = 2; this.network.Consensus.RuleChangeActivationThreshold = 2; var chain = GenerateChainWithHeightAndActivatedBip9(5, this.network, new Key(), this.network.Consensus.BIP9Deployments[0]); var powBlockAssembler = new PowTestBlockAssembler(this.consensusLoop.Object, this.dateTimeProvider.Object, this.LoggerFactory.Object, this.txMempool.Object, new MempoolSchedulerLock(), this.network); var result = powBlockAssembler.ComputeBlockVersion(chain.GetBlock(4)); Assert.Equal(5, result.Height); uint version = ThresholdConditionCache.VersionbitsTopBits; int expectedVersion = (int)(version |= (((uint)1) << 19)); Assert.Equal(expectedVersion, result.Version); Assert.NotEqual((int)ThresholdConditionCache.VersionbitsTopBits, result.Version); } finally { // This is a static in the global context so be careful updating it. I'm resetting it after being done testing so I don't influence other tests. this.network.Consensus.Options = options; this.network.Consensus.BIP9Deployments[0] = null; this.network.Consensus.MinerConfirmationWindow = minerConfirmationWindow; this.network.Consensus.RuleChangeActivationThreshold = ruleChangeActivationThreshold; } }