public void ColdStakingActivatedOnStratisNode() { using (NodeBuilder builder = NodeBuilder.Create(this)) { // Create separate network parameters for this test. var network = new StratisOverrideRegTest(); // Set the date ranges such that ColdStaking will 'Start' immediately after the initial confirmation window. network.Consensus.BIP9Deployments[StratisBIP9Deployments.ColdStaking] = new BIP9DeploymentsParameters(1, 0, DateTime.Now.AddDays(50).ToUnixTimestamp()); // Set a small confirmation window to reduce time taken by this test. network.Consensus.MinerConfirmationWindow = 10; // Minimum number of 'votes' required within the conformation window to reach 'LockedIn' state. network.Consensus.RuleChangeActivationThreshold = 8; CoreNode stratisNode = builder.CreateStratisPosNode(network).WithWallet(); stratisNode.Start(); // ColdStaking activation: // - Deployment state changes every 'MinerConfirmationWindow' blocks. // - Remains in 'Defined' state until 'startedHeight'. // - Changes to 'Started' state at 'startedHeight'. // - Changes to 'LockedIn' state at 'lockedInHeight' (as coldstaking should already be signaled in blocks). // - Changes to 'Active' state at 'activeHeight'. int startedHeight = network.Consensus.MinerConfirmationWindow - 1; int lockedInHeight = startedHeight + network.Consensus.MinerConfirmationWindow; int activeHeight = lockedInHeight + network.Consensus.MinerConfirmationWindow; // Generate enough blocks to cover all state changes. TestHelper.MineBlocks(stratisNode, activeHeight + 1); // Check that coldstaking states got updated as expected. ThresholdConditionCache cache = (stratisNode.FullNode.NodeService <IConsensusRuleEngine>() as ConsensusRuleEngine).NodeDeployments.BIP9; Assert.Equal(ThresholdState.Defined, cache.GetState(stratisNode.FullNode.Chain.GetBlock(startedHeight - 1), StratisBIP9Deployments.ColdStaking)); Assert.Equal(ThresholdState.Started, cache.GetState(stratisNode.FullNode.Chain.GetBlock(startedHeight), StratisBIP9Deployments.ColdStaking)); Assert.Equal(ThresholdState.LockedIn, cache.GetState(stratisNode.FullNode.Chain.GetBlock(lockedInHeight), StratisBIP9Deployments.ColdStaking)); Assert.Equal(ThresholdState.Active, cache.GetState(stratisNode.FullNode.Chain.GetBlock(activeHeight), StratisBIP9Deployments.ColdStaking)); // Verify that the block created before activation does not have the 'CheckColdStakeVerify' flag set. var rulesEngine = stratisNode.FullNode.NodeService <IConsensusRuleEngine>(); ChainedHeader prevHeader = stratisNode.FullNode.Chain.GetBlock(activeHeight - 1); DeploymentFlags flags1 = (rulesEngine as ConsensusRuleEngine).NodeDeployments.GetFlags(prevHeader); Assert.Equal(0, (int)(flags1.ScriptFlags & ScriptVerify.CheckColdStakeVerify)); // Verify that the block created after activation has the 'CheckColdStakeVerify' flag set. DeploymentFlags flags2 = (rulesEngine as ConsensusRuleEngine).NodeDeployments.GetFlags(stratisNode.FullNode.Chain.Tip); Assert.NotEqual(0, (int)(flags2.ScriptFlags & ScriptVerify.CheckColdStakeVerify)); } }
public void SegwitActivatedOnStraxNode() { using (NodeBuilder builder = NodeBuilder.Create(this)) { var network = new StraxOverrideRegTest(); // Set the date ranges such that segwit will 'Start' immediately after the initial confirmation window. network.Consensus.BIP9Deployments[StraxBIP9Deployments.Segwit] = new BIP9DeploymentsParameters("Test", 1, 0, DateTime.Now.AddDays(50).ToUnixTimestamp(), 8); // Set a small confirmation window to reduce time taken by this test. network.Consensus.MinerConfirmationWindow = 10; CoreNode stratisNode = builder.CreateStratisPosNode(network).WithWallet(); stratisNode.Start(); // Deployment activation: // - Deployment state changes every 'MinerConfirmationWindow' blocks. // - Remains in 'Defined' state until 'startedHeight'. // - Changes to 'Started' state at 'startedHeight'. // - Changes to 'LockedIn' state at 'lockedInHeight' (we are assuming that in this test every mined block will signal Segwit support) // - Changes to 'Active' state at 'activeHeight'. int startedHeight = network.Consensus.MinerConfirmationWindow - 1; int lockedInHeight = startedHeight + network.Consensus.MinerConfirmationWindow; int activeHeight = lockedInHeight + network.Consensus.MinerConfirmationWindow; // Generate enough blocks to cover all state changes. TestHelper.MineBlocks(stratisNode, activeHeight + 1); // Check that Segwit states got updated as expected. ThresholdConditionCache cache = (stratisNode.FullNode.NodeService <IConsensusRuleEngine>() as ConsensusRuleEngine).NodeDeployments.BIP9; Assert.Equal(ThresholdState.Defined, cache.GetState(stratisNode.FullNode.ChainIndexer.GetHeader(startedHeight - 1), StraxBIP9Deployments.Segwit)); Assert.Equal(ThresholdState.Started, cache.GetState(stratisNode.FullNode.ChainIndexer.GetHeader(startedHeight), StraxBIP9Deployments.Segwit)); Assert.Equal(ThresholdState.LockedIn, cache.GetState(stratisNode.FullNode.ChainIndexer.GetHeader(lockedInHeight), StraxBIP9Deployments.Segwit)); Assert.Equal(ThresholdState.Active, cache.GetState(stratisNode.FullNode.ChainIndexer.GetHeader(activeHeight), StraxBIP9Deployments.Segwit)); // Verify that the block created before activation does not have the 'Witness' script flag set. var rulesEngine = stratisNode.FullNode.NodeService <IConsensusRuleEngine>(); ChainedHeader prevHeader = stratisNode.FullNode.ChainIndexer.GetHeader(activeHeight - 1); DeploymentFlags flags1 = (rulesEngine as ConsensusRuleEngine).NodeDeployments.GetFlags(prevHeader); Assert.Equal(0, (int)(flags1.ScriptFlags & ScriptVerify.Witness)); // Verify that the block created after activation has the 'Witness' flag set. DeploymentFlags flags2 = (rulesEngine as ConsensusRuleEngine).NodeDeployments.GetFlags(stratisNode.FullNode.ChainIndexer.Tip); Assert.NotEqual(0, (int)(flags2.ScriptFlags & ScriptVerify.Witness)); } }
/// <summary> /// Computes what the block version of a newly created block should be, given a previous header and the /// current set of BIP9 deployments defined in the consensus. /// </summary> /// <param name="prevChainedHeader">The header of the previous block in the chain.</param> /// <remarks>This method is currently used during block creation only. Different nodes may not implement /// BIP9, or may disagree about what the current valid set of deployments are. It is therefore not strictly /// possible to validate a block version number in anything more than general terms.</remarks> public int ComputeBlockVersion(ChainedHeader prevChainedHeader) { uint version = ThresholdConditionCache.VersionbitsTopBits; var thresholdConditionCache = new ThresholdConditionCache(this.Parent.Network.Consensus); for (int deployment = 0; deployment < thresholdConditionCache.ArraySize; deployment++) { ThresholdState state = thresholdConditionCache.GetState(prevChainedHeader, deployment); if ((state == ThresholdState.LockedIn) || (state == ThresholdState.Started)) { version |= thresholdConditionCache.Mask(deployment); } } return((int)version); }
private int ComputeBlockVersion(ChainedHeader prevChainedHeader, NBitcoin.Consensus consensus) { uint version = ThresholdConditionCache.VersionbitsTopBits; var thresholdConditionCache = new ThresholdConditionCache(consensus); IEnumerable <BIP9Deployments> deployments = Enum.GetValues(typeof(BIP9Deployments)).OfType <BIP9Deployments>(); foreach (BIP9Deployments deployment in deployments) { ThresholdState state = thresholdConditionCache.GetState(prevChainedHeader, deployment); if ((state == ThresholdState.LockedIn) || (state == ThresholdState.Started)) { version |= thresholdConditionCache.Mask(deployment); } } return((int)version); }
private int ComputeBlockVersion(ChainedBlock pindexPrev, NBitcoin.Consensus consensus) { var nVersion = ThresholdConditionCache.VERSIONBITS_TOP_BITS; var thresholdConditionCache = new ThresholdConditionCache(consensus); var deploymensts = Enum.GetValues(typeof(BIP9Deployments)) .OfType <BIP9Deployments>(); foreach (var deployment in deploymensts) { var state = thresholdConditionCache.GetState(pindexPrev, deployment); if (state == ThresholdState.LockedIn || state == ThresholdState.Started) { nVersion |= thresholdConditionCache.Mask(deployment); } } return((int)nVersion); }
private int ComputeBlockVersion(ChainedBlock prevChainedBlock, NBitcoin.Consensus consensus) { uint nVersion = ThresholdConditionCache.VERSIONBITS_TOP_BITS; var thresholdConditionCache = new ThresholdConditionCache(consensus); IEnumerable <BIP9Deployments> deploymensts = Enum.GetValues(typeof(BIP9Deployments)) .OfType <BIP9Deployments>(); foreach (BIP9Deployments deployment in deploymensts) { ThresholdState state = thresholdConditionCache.GetState(prevChainedBlock, deployment); if ((state == ThresholdState.LockedIn) || (state == ThresholdState.Started)) { nVersion |= thresholdConditionCache.Mask(deployment); } } return((int)nVersion); }