public CoreNode(string folder, INodeRunner runner, NodeBuilder builder, Network network, bool cleanfolders = true, string configfile = "bitcoin.conf") { this.runner = runner; this.Folder = folder; this.State = CoreNodeState.Stopped; if (cleanfolders) { this.CleanFolder(); } Directory.CreateDirectory(folder); this.DataFolder = Path.Combine(folder, "data"); Directory.CreateDirectory(this.DataFolder); var pass = Encoders.Hex.EncodeData(RandomUtils.GetBytes(20)); this.creds = new NetworkCredential(pass, pass); this.Config = Path.Combine(this.DataFolder, configfile); this.ConfigParameters.Import(builder.ConfigParameters); this.ports = new int[2]; this.FindPorts(this.ports); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); this.networkPeerFactory = new NetworkPeerFactory(network, DateTimeProvider.Default, loggerFactory); }
protected void WhenExecutingTheRule(ConsensusRuleBase rule, RuleContext ruleContext) { try { this.logger = new Mock <ILogger>(); rule.Logger = this.logger.Object; var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var dateTimeProvider = new DateTimeProvider(); rule.Parent = new PowConsensusRuleEngine( KnownNetworks.RegTest, new Mock <ILoggerFactory>().Object, new Mock <IDateTimeProvider>().Object, new ChainIndexer(this.network), new NodeDeployments(KnownNetworks.RegTest, new ChainIndexer(this.network)), new ConsensusSettings(NodeSettings.Default(KnownNetworks.RegTest)), new Mock <ICheckpoints>().Object, new Mock <ICoinView>().Object, new Mock <IChainState>().Object, new InvalidBlockHashStore(dateTimeProvider), new NodeStats(dateTimeProvider, loggerFactory), new AsyncProvider(loggerFactory, new Mock <ISignals>().Object, new Mock <NodeLifetime>().Object), new ConsensusRulesContainer()); rule.Initialize(); (rule as AsyncConsensusRule).RunAsync(ruleContext).GetAwaiter().GetResult(); } catch (Exception e) { this.caughtExecption = e; } }
public CanGetSenderRuleTest() { var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); this.network = new SmartContractsRegTest(); this.senderRetriever = new Mock <ISenderRetriever>(); this.rule = new CanGetSenderRule(this.senderRetriever.Object) { Parent = new PowConsensusRuleEngine( this.network, new Mock <ILoggerFactory>().Object, new Mock <IDateTimeProvider>().Object, new ChainIndexer(this.network), new NodeDeployments(KnownNetworks.RegTest, new ChainIndexer(this.network)), new ConsensusSettings(NodeSettings.Default(this.network)), new Mock <ICheckpoints>().Object, new Mock <ICoinView>().Object, new Mock <IChainState>().Object, new InvalidBlockHashStore(null), new NodeStats(null, loggerFactory), new AsyncProvider(new Mock <ILoggerFactory>().Object, new Mock <ISignals>().Object, new NodeLifetime()), new ConsensusRulesContainer()) }; this.rule.Initialize(); }
public void SpeedCalculatedCorrectlyWhenSeveralBehaviorsStall() { var behaviors = new List <BlockPullerBehavior>(); for (int i = 0; i < 125; i++) { var puller = new Mock <IBlockPuller>(); var ibdState = new Mock <IInitialBlockDownloadState>(); ibdState.Setup(x => x.IsInitialBlockDownload()).Returns(() => true); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); behaviors.Add(new BlockPullerBehavior(puller.Object, ibdState.Object, DateTimeProvider.Default, loggerFactory)); } foreach (BlockPullerBehavior behavior in behaviors) { behavior.AddSample(0, 30); } long sum = behaviors.Sum(x => x.SpeedBytesPerSecond); Assert.Equal(0, sum); }
public INetworkPeer CreateNetworkPeerClient() { var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var selfEndPointTracker = new SelfEndpointTracker(loggerFactory); // Needs to be initialized beforehand. selfEndPointTracker.UpdateAndAssignMyExternalAddress(new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), this.ProtocolPort), false); var ibdState = new Mock <IInitialBlockDownloadState>(); ibdState.Setup(x => x.IsInitialBlockDownload()).Returns(() => true); var networkPeerFactory = new NetworkPeerFactory(this.runner.Network, DateTimeProvider.Default, loggerFactory, new PayloadProvider().DiscoverPayloads(), selfEndPointTracker, ibdState.Object, new Configuration.Settings.ConnectionManagerSettings()); return(networkPeerFactory.CreateConnectedNetworkPeerAsync("127.0.0.1:" + this.ProtocolPort).GetAwaiter().GetResult()); }
public void CanDiscoverAndConnectToPeersOnTheNetwork() { var parameters = new NetworkPeerConnectionParameters(); var testFolder = TestDirectory.Create("CanDiscoverAndConnectToPeersOnTheNetwork"); var nodeSettings = new NodeSettings { DataDir = testFolder.FolderName }; nodeSettings.DataFolder = new DataFolder(nodeSettings); var addressManager = new PeerAddressManager(nodeSettings.DataFolder); var addressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), addressManager) { PeersToDiscover = 3 }; parameters.TemplateBehaviors.Add(addressManagerBehaviour); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); INetworkPeerFactory networkPeerFactory = new NetworkPeerFactory(DateTimeProvider.Default, loggerFactory); var peerDiscoveryLoop = new PeerDiscoveryLoop( new AsyncLoopFactory(loggerFactory), Network.Main, parameters, new NodeLifetime(), addressManager, networkPeerFactory); peerDiscoveryLoop.DiscoverPeers(); // Wait until we have discovered 3 peers. TestHelper.WaitLoop(() => addressManager.Peers.Count > 3); // Wait until at least one successful connection // has been made. while (true) { try { var peerOne = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover); NetworkPeer node = networkPeerFactory.CreateConnectedNetworkPeer(Network.Main, peerOne, parameters); node.VersionHandshake(); node.Disconnect(); break; } catch { } } ; }
public INetworkPeer CreateNetworkPeerClient() { var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var networkPeerFactory = new NetworkPeerFactory(this.runner.Network, DateTimeProvider.Default, loggerFactory, new PayloadProvider().DiscoverPayloads(), new SelfEndpointTracker()); return(networkPeerFactory.CreateConnectedNetworkPeerAsync("127.0.0.1:" + this.ProtocolPort).GetAwaiter().GetResult()); }
public void PeerBanning_Add_WhiteListed_Peer_Does_Not_Get_Banned() { var dataFolder = CreateDataFolder(this); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var ipAddress = IPAddress.Parse("::ffff:192.168.0.1"); var endpoint = new IPEndPoint(ipAddress, 80); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, dataFolder, loggerFactory, new Mock <ISelfEndpointTracker>().Object); peerAddressManager.AddPeer(endpoint, endpoint.Address.MapToIPv6()); var nodeSettings = new NodeSettings(new StratisRegTest()); var connectionManagerSettings = new ConnectionManagerSettings(nodeSettings); var connectionManagerBehaviour = new Mock <IConnectionManagerBehavior>(); connectionManagerBehaviour.Setup(c => c.Whitelisted).Returns(true); var networkPeer = new Mock <INetworkPeer>(); networkPeer.Setup(n => n.PeerEndPoint).Returns(endpoint); networkPeer.Setup(n => n.Behavior <IConnectionManagerBehavior>()).Returns(connectionManagerBehaviour.Object); var networkPeerFactory = new Mock <INetworkPeerFactory>(); networkPeerFactory.Setup(n => n.CreateConnectedNetworkPeerAsync(endpoint, null, null)).ReturnsAsync(networkPeer.Object); var peerCollection = new Mock <IReadOnlyNetworkPeerCollection>(); peerCollection.Setup(p => p.FindByIp(It.IsAny <IPAddress>())).Returns(new List <INetworkPeer>() { networkPeer.Object }); var connectionManager = new Mock <IConnectionManager>(); connectionManager.Setup(c => c.ConnectionSettings).Returns(connectionManagerSettings); connectionManager.Setup(c => c.ConnectedPeers).Returns(peerCollection.Object); var peerBanning = new PeerBanning(connectionManager.Object, loggerFactory, DateTimeProvider.Default, peerAddressManager); peerBanning.BanAndDisconnectPeer(endpoint, connectionManagerSettings.BanTimeSeconds, nameof(PeerBanningTest)); // Peer is whitelised and will not be banned. PeerAddress peer = peerAddressManager.FindPeer(endpoint); Assert.False(peer.BanUntil.HasValue); Assert.Null(peer.BanUntil); Assert.Null(peer.BanReason); }
public BlockPullerBehaviorTests() { var puller = new Mock <IBlockPuller>(); var ibdState = new Mock <IInitialBlockDownloadState>(); ibdState.Setup(x => x.IsInitialBlockDownload()).Returns(() => true); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); this.behavior = new BlockPullerBehavior(puller.Object, ibdState.Object, loggerFactory); }
public INetworkPeer CreateNetworkPeerClient() { var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var selfEndPointTracker = new SelfEndpointTracker(loggerFactory); // Needs to be initialized beforehand. selfEndPointTracker.UpdateAndAssignMyExternalAddress(new IPEndPoint(IPAddress.Parse("0.0.0.0").MapToIPv6Ex(), this.ProtocolPort), false); var networkPeerFactory = new NetworkPeerFactory(this.runner.Network, DateTimeProvider.Default, loggerFactory, new PayloadProvider().DiscoverPayloads(), selfEndPointTracker); return(networkPeerFactory.CreateConnectedNetworkPeerAsync("127.0.0.1:" + this.ProtocolPort).GetAwaiter().GetResult()); }
public void CompatibileNodesStayConnectedAfterHardFork() { // Set the hard-fork parameters. this.Network.Consensus.Options.EnforceMinProtocolVersionAtBlockHeight = 5; this.Network.Consensus.Options.EnforcedMinProtocolVersion = ProtocolVersion.CIRRUS_VERSION; // Configure local node version. var nodeSettings = NodeSettings.Default(this.Network, ProtocolVersion.CIRRUS_VERSION); nodeSettings.MinProtocolVersion = ProtocolVersion.ALT_PROTOCOL_VERSION; // Create the ChainIndexer. var chain = new ChainIndexer(this.Network); // Create behaviour using the test wraper which exposes protected properties and methods ExtendedLoggerFactory loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); EnforcePeerVersionCheckBehaviorWrapper behavior = new EnforcePeerVersionCheckBehaviorWrapper(chain, nodeSettings, this.Network, loggerFactory); // Intentionally set Peer Version to 0 as its value it shouldn't be used anythere in the test. var localPeer = CreateNetworkPeer(0); behavior.Attach(localPeer); var remotePeer = CreateNetworkPeer(ProtocolVersion.CIRRUS_VERSION); // Set the initial block height to 1. for (int i = 0; i < 4; i++) { this.AppendBlock(chain); behavior.TestOnMessageReceivedAsync(remotePeer, null); Assert.Equal(NetworkPeerState.Connected, localPeer.State); } // Nodes shouldn't disconnect when reaching and exceeding the EnforceMinProtocolVersionAtBlockHeight height. for (int i = 0; i < 5; i++) { this.AppendBlock(chain); behavior.TestOnMessageReceivedAsync(remotePeer, null); Assert.Equal(NetworkPeerState.Connected, localPeer.State); } // New connections established after the hard-fork should not be disconnected. remotePeer = CreateNetworkPeer(ProtocolVersion.CIRRUS_VERSION); behavior.TestOnMessageReceivedAsync(remotePeer, null); Assert.Equal(NetworkPeerState.Connected, localPeer.State); }
public void PeerBanning_Add_Peers_To_Address_Manager_And_Ban_IP_Range() { var dataFolder = CreateDataFolder(this); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var ipAddress80 = IPAddress.Parse("::ffff:192.168.0.1"); var endpoint80 = new IPEndPoint(ipAddress80, 80); var ipAddress81 = IPAddress.Parse("::ffff:192.168.0.1"); var endpoint81 = new IPEndPoint(ipAddress81, 81); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, dataFolder, loggerFactory, new Mock <ISelfEndpointTracker>().Object); peerAddressManager.AddPeer(endpoint80, IPAddress.Loopback); peerAddressManager.AddPeer(endpoint81, IPAddress.Loopback); var nodeSettings = new NodeSettings(new StratisRegTest()); var connectionManagerSettings = new ConnectionManagerSettings(nodeSettings); var peerCollection = new Mock <IReadOnlyNetworkPeerCollection>(); peerCollection.Setup(p => p.FindByIp(It.IsAny <IPAddress>())).Returns(new List <INetworkPeer>()); var connectionManager = new Mock <IConnectionManager>(); connectionManager.Setup(c => c.ConnectionSettings).Returns(connectionManagerSettings); connectionManager.Setup(c => c.ConnectedPeers).Returns(peerCollection.Object); var peerBanning = new PeerBanning(connectionManager.Object, loggerFactory, DateTimeProvider.Default, peerAddressManager); peerBanning.BanAndDisconnectPeer(endpoint80, connectionManagerSettings.BanTimeSeconds, nameof(PeerBanningTest)); // Both endpoints should be banned. PeerAddress peer = peerAddressManager.FindPeer(endpoint80); Assert.True(peer.BanUntil.HasValue); Assert.NotNull(peer.BanUntil); Assert.NotEmpty(peer.BanReason); peer = peerAddressManager.FindPeer(endpoint81); Assert.True(peer.BanUntil.HasValue); Assert.NotNull(peer.BanUntil); Assert.NotEmpty(peer.BanReason); }
public void PeerBanning_Resetting_Expired_BannedPeer() { DataFolder dataFolder = CreateDataFolder(this); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); IPAddress ipAddress = IPAddress.Parse("::ffff:192.168.0.1"); var endpoint = new IPEndPoint(ipAddress, 80); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, dataFolder, loggerFactory, new Mock <ISelfEndpointTracker>().Object); peerAddressManager.AddPeer(endpoint, IPAddress.Loopback); var nodeSettings = new NodeSettings(new StratisRegTest()); var connectionManagerSettings = new ConnectionManagerSettings(nodeSettings); var peerCollection = new Mock <IReadOnlyNetworkPeerCollection>(); peerCollection.Setup(p => p.FindByIp(It.IsAny <IPAddress>())).Returns(new List <INetworkPeer>()); var connectionManager = new Mock <IConnectionManager>(); connectionManager.Setup(c => c.ConnectionSettings).Returns(connectionManagerSettings); connectionManager.Setup(c => c.ConnectedPeers).Returns(peerCollection.Object); var peerBanning = new PeerBanning(connectionManager.Object, loggerFactory, DateTimeProvider.Default, peerAddressManager); peerBanning.BanAndDisconnectPeer(endpoint, 1, nameof(PeerBanningTest)); peerAddressManager.SavePeers(); // Wait one second for ban to expire. Thread.Sleep(1000); peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, dataFolder, loggerFactory, new Mock <ISelfEndpointTracker>().Object); peerAddressManager.LoadPeers(); PeerAddress peer = peerAddressManager.FindPeer(endpoint); Assert.Null(peer.BanTimeStamp); Assert.Null(peer.BanUntil); Assert.Empty(peer.BanReason); }
public CoreNode(NodeRunner runner, NodeBuilder builder, Network network, string configfile) { this.runner = runner; this.State = CoreNodeState.Stopped; var pass = Encoders.Hex.EncodeData(RandomUtils.GetBytes(20)); this.creds = new NetworkCredential(pass, pass); this.Config = Path.Combine(this.runner.DataFolder, configfile); this.ConfigParameters.Import(builder.ConfigParameters); this.ports = new int[2]; this.FindPorts(this.ports); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); this.networkPeerFactory = new NetworkPeerFactory(network, DateTimeProvider.Default, loggerFactory, new PayloadProvider().DiscoverPayloads(), new SelfEndpointTracker()); }
public async Task InitializeAsync() { this.blockinfo = new List <Blockinfo>(); var lst = blockinfoarr.Cast <long>().ToList(); for (int i = 0; i < lst.Count; i += 2) { this.blockinfo.Add(new Blockinfo { extranonce = (int)lst[i], nonce = (uint)lst[i + 1] }); } // Note that by default, these tests run with size accounting enabled. this.network = Network.Main; var hex = Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"); this.scriptPubKey = new Script(new[] { Op.GetPushOp(hex), OpcodeType.OP_CHECKSIG }); this.newBlock = new BlockTemplate(this.network); this.entry = new TestMemPoolEntryHelper(); this.chain = new ConcurrentChain(this.network); this.network.Consensus.Options = new PowConsensusOptions(); IDateTimeProvider dateTimeProvider = DateTimeProvider.Default; this.cachedCoinView = new CachedCoinView(new InMemoryCoinView(this.chain.Tip.HashBlock), dateTimeProvider, new LoggerFactory()); var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); NodeSettings nodeSettings = new NodeSettings(args: new string[] { "-checkpoints" }); var consensusSettings = new ConsensusSettings().Load(nodeSettings); PowConsensusValidator consensusValidator = new PowConsensusValidator(this.network, new Checkpoints(), dateTimeProvider, loggerFactory); NetworkPeerFactory networkPeerFactory = new NetworkPeerFactory(this.network, dateTimeProvider, loggerFactory, new PayloadProvider().DiscoverPayloads(), new SelfEndpointTracker()); var peerAddressManager = new PeerAddressManager(DateTimeProvider.Default, nodeSettings.DataFolder, loggerFactory, new SelfEndpointTracker()); var peerDiscovery = new PeerDiscovery(new AsyncLoopFactory(loggerFactory), loggerFactory, Network.Main, networkPeerFactory, new NodeLifetime(), nodeSettings, peerAddressManager); var connectionSettings = new ConnectionManagerSettings(); connectionSettings.Load(nodeSettings); var connectionManager = new ConnectionManager(dateTimeProvider, loggerFactory, this.network, networkPeerFactory, nodeSettings, new NodeLifetime(), new NetworkPeerConnectionParameters(), peerAddressManager, new IPeerConnector[] { }, peerDiscovery, connectionSettings); LookaheadBlockPuller blockPuller = new LookaheadBlockPuller(this.chain, connectionManager, new LoggerFactory()); PeerBanning peerBanning = new PeerBanning(connectionManager, loggerFactory, dateTimeProvider, peerAddressManager); NodeDeployments deployments = new NodeDeployments(this.network, this.chain); ConsensusRules consensusRules = new PowConsensusRules(this.network, loggerFactory, dateTimeProvider, this.chain, deployments, consensusSettings, new Checkpoints(), this.cachedCoinView, blockPuller).Register(new FullNodeBuilderConsensusExtension.PowConsensusRulesRegistration()); this.consensus = new ConsensusLoop(new AsyncLoopFactory(loggerFactory), consensusValidator, new NodeLifetime(), this.chain, this.cachedCoinView, blockPuller, new NodeDeployments(this.network, this.chain), loggerFactory, new ChainState(new InvalidBlockHashStore(dateTimeProvider)), connectionManager, dateTimeProvider, new Signals.Signals(), consensusSettings, nodeSettings, peerBanning, consensusRules); await this.consensus.StartAsync(); this.entry.Fee(11); this.entry.Height(11); var date1 = new MemoryPoolTests.DateTimeProviderSet(); date1.time = dateTimeProvider.GetTime(); date1.timeutc = dateTimeProvider.GetUtcNow(); this.DateTimeProvider = date1; this.mempool = new TxMempool(dateTimeProvider, new BlockPolicyEstimator(new MempoolSettings(nodeSettings), new LoggerFactory(), nodeSettings), new LoggerFactory(), nodeSettings); this.mempoolLock = new MempoolSchedulerLock(); // Simple block creation, nothing special yet: this.newBlock = AssemblerForTest(this).Build(this.chain.Tip, this.scriptPubKey); this.chain.SetTip(this.newBlock.Block.Header); await this.consensus.ValidateAndExecuteBlockAsync(new RuleContext(new BlockValidationContext { Block = this.newBlock.Block }, this.network.Consensus, this.consensus.Tip) { CheckPow = false, CheckMerkleRoot = false }); // We can't make transactions until we have inputs // Therefore, load 100 blocks :) this.baseheight = 0; List <Block> blocks = new List <Block>(); this.txFirst = new List <Transaction>(); for (int i = 0; i < this.blockinfo.Count; ++i) { var pblock = this.newBlock.Block.Clone(); // pointer for convenience pblock.Header.HashPrevBlock = this.chain.Tip.HashBlock; pblock.Header.Version = 1; pblock.Header.Time = Utils.DateTimeToUnixTime(this.chain.Tip.GetMedianTimePast()) + 1; Transaction txCoinbase = pblock.Transactions[0].Clone(); txCoinbase.Inputs.Clear(); txCoinbase.Version = 1; txCoinbase.AddInput(new TxIn(new Script(new[] { Op.GetPushOp(this.blockinfo[i].extranonce), Op.GetPushOp(this.chain.Height) }))); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this) txCoinbase.AddOutput(new TxOut(Money.Zero, new Script())); pblock.Transactions[0] = txCoinbase; if (this.txFirst.Count == 0) { this.baseheight = this.chain.Height; } if (this.txFirst.Count < 4) { this.txFirst.Add(pblock.Transactions[0]); } pblock.UpdateMerkleRoot(); pblock.Header.Nonce = this.blockinfo[i].nonce; this.chain.SetTip(pblock.Header); await this.consensus.ValidateAndExecuteBlockAsync(new RuleContext(new BlockValidationContext { Block = pblock }, this.network.Consensus, this.consensus.Tip) { CheckPow = false, CheckMerkleRoot = false }); blocks.Add(pblock); } // Just to make sure we can still make simple blocks this.newBlock = AssemblerForTest(this).Build(this.chain.Tip, this.scriptPubKey); Assert.NotNull(this.newBlock); }
public async Task InitializeAsync() { this.blockinfo = new List <Blockinfo>(); List <long> lst = blockinfoarr.Cast <long>().ToList(); for (int i = 0; i < lst.Count; i += 2) { this.blockinfo.Add(new Blockinfo { extranonce = (int)lst[i], nonce = (uint)lst[i + 1] }); } // Note that by default, these tests run with size accounting enabled. this.network = KnownNetworks.RegTest; byte[] hex = Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"); this.scriptPubKey = new Script(new[] { Op.GetPushOp(hex), OpcodeType.OP_CHECKSIG }); this.entry = new TestMemPoolEntryHelper(); this.ChainIndexer = new ChainIndexer(this.network); this.network.Consensus.Options = new ConsensusOptions(); IDateTimeProvider dateTimeProvider = DateTimeProvider.Default; var loggerFactory = new ExtendedLoggerFactory(); loggerFactory.AddConsoleWithFilters(); var inMemoryCoinView = new InMemoryCoinView(this.ChainIndexer.Tip.HashBlock); var nodeStats = new NodeStats(dateTimeProvider, loggerFactory); var nodeSettings = new NodeSettings(this.network, args: new string[] { "-checkpoints" }); var consensusSettings = new ConsensusSettings(nodeSettings); this.cachedCoinView = new CachedCoinView(inMemoryCoinView, dateTimeProvider, new LoggerFactory(), nodeStats, consensusSettings); var signals = new Signals.Signals(loggerFactory, null); var asyncProvider = new AsyncProvider(loggerFactory, signals, new NodeLifetime()); var deployments = new NodeDeployments(this.network, this.ChainIndexer); var genesis = this.network.GetGenesis(); var chainState = new ChainState() { BlockStoreTip = new ChainedHeader(genesis.Header, genesis.GetHash(), 0) }; var consensusRulesContainer = new ConsensusRulesContainer(); foreach (var ruleType in this.network.Consensus.ConsensusRules.HeaderValidationRules) { consensusRulesContainer.HeaderValidationRules.Add(Activator.CreateInstance(ruleType) as HeaderValidationConsensusRule); } foreach (var ruleType in this.network.Consensus.ConsensusRules.FullValidationRules) { consensusRulesContainer.FullValidationRules.Add(Activator.CreateInstance(ruleType) as FullValidationConsensusRule); } this.ConsensusRules = new PowConsensusRuleEngine(this.network, loggerFactory, dateTimeProvider, this.ChainIndexer, deployments, consensusSettings, new Checkpoints(), this.cachedCoinView, chainState, new InvalidBlockHashStore(dateTimeProvider), nodeStats, asyncProvider, consensusRulesContainer).SetupRulesEngineParent(); this.consensus = ConsensusManagerHelper.CreateConsensusManager(this.network, chainState: chainState, inMemoryCoinView: inMemoryCoinView, chainIndexer: this.ChainIndexer, consensusRules: this.ConsensusRules); await this.consensus.InitializeAsync(chainState.BlockStoreTip); this.entry.Fee(11); this.entry.Height(11); var dateTimeProviderSet = new DateTimeProviderSet { time = dateTimeProvider.GetTime(), timeutc = dateTimeProvider.GetUtcNow() }; this.DateTimeProvider = dateTimeProviderSet; this.mempool = new TxMempool(dateTimeProvider, new BlockPolicyEstimator(new MempoolSettings(nodeSettings), loggerFactory, nodeSettings), loggerFactory, nodeSettings); this.mempoolLock = new MempoolSchedulerLock(); // We can't make transactions until we have inputs // Therefore, load 100 blocks :) this.baseheight = 0; var blocks = new List <Block>(); this.txFirst = new List <Transaction>(); this.nonce = 0; for (int i = 0; i < this.blockinfo.Count; ++i) { Block block = this.network.CreateBlock(); block.Header.HashPrevBlock = this.consensus.Tip.HashBlock; block.Header.Version = 1; block.Header.Time = Utils.DateTimeToUnixTime(this.ChainIndexer.Tip.GetMedianTimePast()) + 1; Transaction txCoinbase = this.network.CreateTransaction(); txCoinbase.Version = 1; txCoinbase.AddInput(new TxIn(new Script(new[] { Op.GetPushOp(this.blockinfo[i].extranonce), Op.GetPushOp(this.ChainIndexer.Height) }))); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this) txCoinbase.AddOutput(new TxOut(Money.Zero, new Script())); block.AddTransaction(txCoinbase); if (this.txFirst.Count == 0) { this.baseheight = this.ChainIndexer.Height; } if (this.txFirst.Count < 4) { this.txFirst.Add(block.Transactions[0]); } block.Header.Bits = block.Header.GetWorkRequired(this.network, this.ChainIndexer.Tip); block.UpdateMerkleRoot(); while (!block.CheckProofOfWork()) { block.Header.Nonce = ++this.nonce; } // Serialization sets the BlockSize property. block = Block.Load(block.ToBytes(), this.network.Consensus.ConsensusFactory); var res = await this.consensus.BlockMinedAsync(block); if (res == null) { throw new InvalidOperationException(); } blocks.Add(block); } // Just to make sure we can still make simple blocks this.newBlock = AssemblerForTest(this).Build(this.ChainIndexer.Tip, this.scriptPubKey); Assert.NotNull(this.newBlock); }