public void CanCheckBlockWithWitness() { var block = new Block(Encoders.Hex.DecodeData("000000202f6f6a130549473222411b5c6f54150d63b32aadf10e57f7d563cfc7010000001e28204471ef9ef11acd73543894a96a3044932b85e99889e731322a8ec28a9f9ae9fc56ffff011d0011b40202010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2c028027266a24aa21a9ed09154465f26a2a4144739eba3e83b3e9ae6a1f69566eae7dc3747d48f1183779010effffffff0250b5062a0100000023210263ed47e995cbbf1bc560101e3b76c6bdb1b094a185450cea533781ce598ff2b6ac0000000000000000266a24aa21a9ed09154465f26a2a4144739eba3e83b3e9ae6a1f69566eae7dc3747d48f1183779012000000000000000000000000000000000000000000000000000000000000000000000000001000000000101cecd90cd38ac6858c47f2fe9f28145d6e18f9c5abc7ef1a41e2f19e6fe0362580100000000ffffffff0130b48d06000000001976a91405481b7f1d90c5a167a15b00e8af76eb6984ea5988ac0247304402206104c335e4adbb920184957f9f710b09de17d015329fde6807b9d321fd2142db02200b24ad996b4aa4ff103000348b5ad690abfd9fddae546af9e568394ed4a83113012103a65786c1a48d4167aca08cf6eb8eed081e13f45c02dc6000fd8f3bb16242579a00000000")); var consensusFlags = new ConsensusFlags() { ScriptFlags = ScriptVerify.Witness | ScriptVerify.P2SH | ScriptVerify.Standard, LockTimeFlags = LockTimeFlags.MedianTimePast, EnforceBIP34 = true }; var context = new ContextInformation() { BestBlock = new ContextBlockInformation() { MedianTimePast = DateTimeOffset.Parse("2016-03-31T09:02:19+00:00", CultureInfo.InvariantCulture), Height = 10111 }, NextWorkRequired = block.Header.Bits, Time = DateTimeOffset.UtcNow }; var validator = new ConsensusValidator(new NBitcoin.Consensus()); validator.CheckBlockHeader(block.Header); validator.ContextualCheckBlockHeader(block.Header, context); validator.ContextualCheckBlock(block, consensusFlags, context); validator.CheckBlock(block); }
public void ValidSomeBlocks() { using (NodeContext ctx = NodeContext.Create(network: Network.Main)) { var network = ctx.Network; var chain = new ConcurrentChain(network.GetGenesis().Header); if (network == NBitcoin.Network.Main) { chain.Load(GetFile("main.data", "https://aois.blob.core.windows.net/public/main.data")); } else { chain.Load(GetFile("test.data", "https://aois.blob.core.windows.net/public/test.data")); } var stack = new CoinViewStack( new CacheCoinView( new PrefetcherCoinView( new BackgroundCommiterCoinView( ctx.PersistentCoinView)))); var cache = stack.Find <CacheCoinView>(); var backgroundCommiter = stack.Find <BackgroundCommiterCoinView>(); ConsensusValidator valid = new ConsensusValidator(network.Consensus); valid.UseConsensusLib = false; Node node = Node.Connect(network, "yournode"); node.VersionHandshake(); var puller = new CustomNodeBlockPuller(chain, node); var lastSnapshot = valid.PerformanceCounter.Snapshot(); var lastSnapshot2 = ctx.PersistentCoinView.PerformanceCounter.Snapshot(); var lastSnapshot3 = cache.PerformanceCounter.Snapshot(); foreach (var block in valid.Run(stack, puller)) { if ((DateTimeOffset.UtcNow - lastSnapshot.Taken) > TimeSpan.FromSeconds(5.0)) { Console.WriteLine(); Console.WriteLine("ActualLookahead :\t" + puller.ActualLookahead + " blocks"); Console.WriteLine("Downloaded Count :\t" + puller.RollingAverageDownloadedCount + " blocks"); Console.WriteLine("CoinViewTip :\t" + backgroundCommiter.Tip.Height); Console.WriteLine("CommitingTip :\t" + backgroundCommiter.CommitingTip.Height); Console.WriteLine("InnerTip :\t" + backgroundCommiter.InnerTip.Height); Console.WriteLine("Cache entries :\t" + cache.CacheEntryCount); var snapshot = valid.PerformanceCounter.Snapshot(); Console.Write(snapshot - lastSnapshot); lastSnapshot = snapshot; var snapshot2 = ctx.PersistentCoinView.PerformanceCounter.Snapshot(); Console.Write(snapshot2 - lastSnapshot2); lastSnapshot2 = snapshot2; var snapshot3 = cache.PerformanceCounter.Snapshot(); Console.Write(snapshot3 - lastSnapshot3); lastSnapshot3 = snapshot3; } } } }
public MempoolValidator(TxMempool memPool, MempoolScheduler mempoolScheduler, ConsensusValidator consensusValidator, DateTimeProvider dateTimeProvider, NodeSettings nodeArgs, ConcurrentChain chain, CoinView coinView) { this.memPool = memPool; this.mempoolScheduler = mempoolScheduler; this.consensusValidator = consensusValidator; this.dateTimeProvider = dateTimeProvider; this.nodeArgs = nodeArgs; this.chain = chain; this.coinView = coinView; freeLimiter = new FreeLimiterSection(); this.PerformanceCounter = new MempoolPerformanceCounter(); }
public static IFullNodeBuilder AddRequired(this IFullNodeBuilder builder) { builder.UseBaseFeature(); // TODO: move some of the required services will move to their own feature return(builder.ConfigureServices(service => { var dataFolder = new DataFolder(builder.NodeSettings); // TODO: move to ConsensusFeature (required for mempool) var coinviewdb = new DBreezeCoinView(builder.Network, dataFolder.CoinViewPath); var coinView = new CachedCoinView(coinviewdb) { MaxItems = builder.NodeSettings.Cache.MaxItems }; var consensusValidator = new ConsensusValidator(builder.Network.Consensus); service.AddSingleton(consensusValidator); service.AddSingleton <DBreezeCoinView>(coinviewdb); service.AddSingleton <CoinView>(coinView); })); }
public FullNodeController( IFullNode fullNode = null, NodeSettings nodeSettings = null, Network network = null, ConsensusValidator consensusValidator = null, ConcurrentChain chain = null, ChainBehavior.ChainState chainState = null, BlockStoreManager blockManager = null, MempoolManager mempoolManager = null, Connection.ConnectionManager connectionManager = null) : base( fullNode: fullNode, nodeSettings: nodeSettings, network: network, consensusValidator: consensusValidator, chain: chain, chainState: chainState, blockManager: blockManager, mempoolManager: mempoolManager, connectionManager: connectionManager) { }
public BaseRPCController( IFullNode fullNode = null, NodeSettings nodeSettings = null, Network network = null, ConsensusValidator consensusValidator = null, ConsensusLoop consensusLoop = null, ConcurrentChain chain = null, ChainBehavior.ChainState chainState = null, BlockStoreManager blockManager = null, MempoolManager mempoolManager = null, Connection.ConnectionManager connectionManager = null) { this._FullNode = fullNode; this._Settings = nodeSettings; this._Network = network; this._ConsensusValidator = consensusValidator; this._ConsensusLoop = consensusLoop; this._Chain = chain; this._ChainState = chainState; this._BlockManager = blockManager; this._MempoolManager = mempoolManager; this._ConnectionManager = connectionManager; }
public void ValidSomeBlocks() { using (NodeContext ctx = NodeContext.Create(network: Network.Main, clean: false)) { var network = ctx.Network; var chain = new ConcurrentChain(network.GetGenesis().Header); if (network == NBitcoin.Network.Main) { chain.Load(GetFile("main.data", "https://aois.blob.core.windows.net/public/main.data")); } else { chain.Load(GetFile("test.data", "https://aois.blob.core.windows.net/public/test.data")); } //var threads = new CustomThreadPoolTaskScheduler(10, 100, "Parallel Coin Fetcher"); var stack = new CoinViewStack( new CacheCoinView( // PrefetcherCoinView( //new ParallelCoinView(threads, new BackgroundCommiterCoinView( ctx.PersistentCoinView))); //); //new InMemoryCoinView(chain.Genesis)); var bottom = stack.Bottom; var cache = stack.Find <CacheCoinView>(); var backgroundCommiter = stack.Find <BackgroundCommiterCoinView>(); ConsensusValidator valid = new ConsensusValidator(network.Consensus); valid.UseConsensusLib = false; Node node = Node.Connect(network, "yournode"); node.VersionHandshake(); var puller = new CustomNodeBlockPuller(chain, node); var lastSnapshot = valid.PerformanceCounter.Snapshot(); var lastSnapshot2 = ctx.PersistentCoinView.PerformanceCounter.Snapshot(); var lastSnapshot3 = cache == null ? null : cache.PerformanceCounter.Snapshot(); foreach (var block in valid.Run(stack, puller)) { if ((DateTimeOffset.UtcNow - lastSnapshot.Taken) > TimeSpan.FromSeconds(5.0)) { Console.WriteLine(); Console.WriteLine("ActualLookahead :\t" + puller.ActualLookahead + " blocks"); Console.WriteLine("Median Downloaded :\t" + puller.MedianDownloadCount + " blocks"); if (backgroundCommiter != null) { Console.WriteLine("CoinViewTip :\t" + backgroundCommiter.Tip.Height); Console.WriteLine("CommitingTip :\t" + backgroundCommiter.CommitingTip.Height); } Console.WriteLine("Bottom Tip :\t" + bottom.Tip.Height); if (cache != null) { Console.WriteLine("Cache entries :\t" + cache.CacheEntryCount); } var snapshot = valid.PerformanceCounter.Snapshot(); Console.Write(snapshot - lastSnapshot); lastSnapshot = snapshot; var snapshot2 = ctx.PersistentCoinView.PerformanceCounter.Snapshot(); Console.Write(snapshot2 - lastSnapshot2); lastSnapshot2 = snapshot2; if (cache != null) { var snapshot3 = cache.PerformanceCounter.Snapshot(); Console.Write(snapshot3 - lastSnapshot3); lastSnapshot3 = snapshot3; } } } } }