public async Task OpSpend_PreviousTransactionOther_FailureAsync() { TestRulesContext testContext = TestRulesContextFactory.CreateAsync(this.network); OpSpendRule rule = testContext.CreateRule <OpSpendRule>(); var context = new RuleContext(new ValidationContext(), testContext.DateTimeProvider.GetTimeOffset()); context.ValidationContext.BlockToValidate = testContext.Network.Consensus.ConsensusFactory.CreateBlock(); context.ValidationContext.BlockToValidate.Header.HashPrevBlock = testContext.ChainIndexer.Tip.HashBlock; context.ValidationContext.BlockToValidate.Transactions = new List <Transaction> { new Transaction() { Outputs = { new TxOut(Money.Zero, new Script(OpcodeType.OP_NOP)) } }, new Transaction() { Outputs = { new TxOut(Money.Zero, new Script(OpcodeType.OP_NOP)) } }, new Transaction() { Outputs = { new TxOut(Money.Zero, new Script(OpcodeType.OP_NOP)) } }, new Transaction() { Inputs = { new TxIn(new Script(new [] { (byte)ScOpcodeType.OP_SPEND })) } } }; await Assert.ThrowsAsync <ConsensusErrorException>(async() => await rule.RunAsync(context)); }
public async Task SmartContractFormatRule_SuccessAsync() { TestRulesContext testContext = TestRulesContextFactory.CreateAsync(this.network); ContractTransactionValidationRule rule = testContext.CreateContractValidationRule(); var context = new PowRuleContext(new ValidationContext(), testContext.DateTimeProvider.GetTimeOffset()); context.UnspentOutputSet = GetMockOutputSet(); context.ValidationContext.BlockToValidate = testContext.Network.Consensus.ConsensusFactory.CreateBlock(); var gasPriceSatoshis = 20; var gasLimit = 4_000_000; var gasBudgetSatoshis = gasPriceSatoshis * gasLimit; var relayFeeSatoshis = 10000; var totalSuppliedSatoshis = gasBudgetSatoshis + relayFeeSatoshis; var contractTxData = new ContractTxData(1, (ulong)gasPriceSatoshis, (Gas)gasLimit, 0, "TestMethod"); var serialized = this.callDataSerializer.Serialize(contractTxData); Transaction funding = new Transaction { Outputs = { new TxOut(totalSuppliedSatoshis, new Script()) } }; var transactionBuilder = new TransactionBuilder(testContext.Network); transactionBuilder.AddCoins(funding); transactionBuilder.SendFees(relayFeeSatoshis + gasBudgetSatoshis); transactionBuilder.Send(new Script(serialized), 0); Transaction transaction = transactionBuilder.BuildTransaction(false); context.ValidationContext.BlockToValidate.Transactions = new List <Transaction> { transaction }; await rule.RunAsync(context); }
public async Task TxOutSmartContractExec_AllTransactions_ValidationSuccessAsync() { TestRulesContext testContext = TestRulesContextFactory.CreateAsync(this.network); TxOutSmartContractExecRule rule = testContext.CreateRule <TxOutSmartContractExecRule>(); var context = new RuleContext(new ValidationContext(), testContext.DateTimeProvider.GetTimeOffset()); context.ValidationContext.BlockToValidate = testContext.Network.Consensus.ConsensusFactory.CreateBlock(); context.ValidationContext.BlockToValidate.Header.HashPrevBlock = testContext.Chain.Tip.HashBlock; context.ValidationContext.BlockToValidate.Transactions = new List <Transaction> { new Transaction { Outputs = { new TxOut(Money.Zero, new Script(new [] { (byte)ScOpcodeType.OP_CREATECONTRACT })) } } }; await rule.RunAsync(context); }
public void OpSpend_PreviousTransactionNone_FailureAsync() { TestRulesContext testContext = TestRulesContextFactory.CreateAsync(this.network); OpSpendRule rule = testContext.CreateRule <OpSpendRule>(); var context = new RuleContext(new ValidationContext(), this.network.Consensus, testContext.Chain.Tip, testContext.DateTimeProvider.GetTimeOffset()); context.ValidationContext.Block = testContext.Network.Consensus.ConsensusFactory.CreateBlock(); context.ValidationContext.Block.Header.HashPrevBlock = testContext.Chain.Tip.HashBlock; context.ValidationContext.Block.Transactions = new List <Transaction> { new Transaction() { Outputs = { new TxOut(new Money(1000), new Script(new [] { (byte)ScOpcodeType.OP_SPEND })) } } }; Task <ConsensusErrorException> error = Assert.ThrowsAsync <ConsensusErrorException>(async() => await rule.RunAsync(context)); }
/// <summary> /// Creates test chain with a consensus loop. /// </summary> public static TestRulesContext CreateAsync(Network network, [CallerMemberName] string pathName = null) { var testRulesContext = new TestRulesContext() { Network = network }; string dataDir = Path.Combine("TestData", pathName); Directory.CreateDirectory(dataDir); testRulesContext.NodeSettings = new NodeSettings(network, args: new[] { $"-datadir={dataDir}" }); testRulesContext.LoggerFactory = testRulesContext.NodeSettings.LoggerFactory; testRulesContext.LoggerFactory.AddConsoleWithFilters(); testRulesContext.DateTimeProvider = DateTimeProvider.Default; network.Consensus.Options = new ConsensusOptions(); //new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration().RegisterRules(network.Consensus); ConsensusSettings consensusSettings = new ConsensusSettings(testRulesContext.NodeSettings); testRulesContext.Checkpoints = new Checkpoints(); testRulesContext.ChainIndexer = new ChainIndexer(network); testRulesContext.ChainState = new ChainState(); testRulesContext.Signals = new Signals.Signals(testRulesContext.LoggerFactory, null); testRulesContext.AsyncProvider = new AsyncProvider(testRulesContext.LoggerFactory, testRulesContext.Signals, new NodeLifetime()); NodeDeployments deployments = new NodeDeployments(testRulesContext.Network, testRulesContext.ChainIndexer); testRulesContext.Consensus = new PowConsensusRuleEngine(testRulesContext.Network, testRulesContext.LoggerFactory, testRulesContext.DateTimeProvider, testRulesContext.ChainIndexer, deployments, consensusSettings, testRulesContext.Checkpoints, null, testRulesContext.ChainState, new InvalidBlockHashStore(new DateTimeProvider()), new NodeStats(new DateTimeProvider(), testRulesContext.LoggerFactory), testRulesContext.AsyncProvider, new ConsensusRulesContainer()).SetupRulesEngineParent(); testRulesContext.CallDataSerializer = new CallDataSerializer(new ContractPrimitiveSerializer(network)); return(testRulesContext); }