private static async Task <BlockTemplate> MineBlockAsync(TestChainContext testChainContext, Script scriptPubKey, TxMempool mempool,
                                                                 MempoolSchedulerLock mempoolLock, bool getMutatedBlock = false)
        {
            BlockTemplate newBlock = CreateBlockTemplate(testChainContext, scriptPubKey, mempool, mempoolLock);

            if (getMutatedBlock)
            {
                BuildMutatedBlock(newBlock);
            }

            newBlock.Block.UpdateMerkleRoot();

            TryFindNonceForProofOfWork(testChainContext, newBlock);

            if (!getMutatedBlock)
            {
                await ValidateBlock(testChainContext, newBlock);
            }
            else
            {
                CheckBlockIsMutated(newBlock);
            }

            return(newBlock);
        }
Beispiel #2
0
 public PowMining(
     IAsyncLoopFactory asyncLoopFactory,
     IBlockProvider blockProvider,
     IConsensusManager consensusManager,
     ChainIndexer chainIndexer,
     IDateTimeProvider dateTimeProvider,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     INodeLifetime nodeLifetime,
     ILoggerFactory loggerFactory,
     IInitialBlockDownloadState initialBlockDownloadState)
 {
     this.asyncLoopFactory          = asyncLoopFactory;
     this.blockProvider             = blockProvider;
     this.chainIndexer              = chainIndexer;
     this.consensusManager          = consensusManager;
     this.dateTimeProvider          = dateTimeProvider;
     this.loggerFactory             = loggerFactory;
     this.initialBlockDownloadState = initialBlockDownloadState;
     this.logger       = loggerFactory.CreateLogger(this.GetType().FullName);
     this.mempool      = mempool;
     this.mempoolLock  = mempoolLock;
     this.network      = network;
     this.nodeLifetime = nodeLifetime;
     this.miningCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(new[] { this.nodeLifetime.ApplicationStopping });
 }
Beispiel #3
0
        public SmartContractBlockDefinition(
            IBlockBufferGenerator blockBufferGenerator,
            ICoinView coinView,
            IConsensusManager consensusManager,
            IDateTimeProvider dateTimeProvider,
            IContractExecutorFactory executorFactory,
            ILoggerFactory loggerFactory,
            ITxMempool mempool,
            MempoolSchedulerLock mempoolLock,
            MinerSettings minerSettings,
            Network network,
            ISenderRetriever senderRetriever,
            IStateRepositoryRoot stateRoot,
            IBlockExecutionResultCache executionCache,
            ICallDataSerializer callDataSerializer,
            NodeDeployments nodeDeployments)
            : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network, nodeDeployments)
        {
            this.coinView           = coinView;
            this.executorFactory    = executorFactory;
            this.logger             = loggerFactory.CreateLogger(this.GetType());
            this.senderRetriever    = senderRetriever;
            this.stateRoot          = stateRoot;
            this.callDataSerializer = callDataSerializer;
            this.executionCache     = executionCache;
            this.refundOutputs      = new List <TxOut>();
            this.receipts           = new List <Receipt>();

            // When building smart contract blocks, we will be generating and adding both transactions to the block and txouts to the coinbase.
            // At the moment, these generated objects aren't accounted for in the block size and weight accounting.
            // This means that if blocks started getting full, this miner could start generating blocks greater than the max consensus block size.
            // To avoid this without significantly overhauling the BlockDefinition, for now we just lower the block size by a percentage buffer.
            // If in the future blocks are being built over the size limit and you need an easy fix, just increase the size of this buffer.
            this.Options = blockBufferGenerator.GetOptionsWithBuffer(this.Options);
        }
 public PowMining(
     IAsyncLoopFactory asyncLoopFactory,
     IBlockProvider blockProvider,
     IConsensusLoop consensusLoop,
     ConcurrentChain chain,
     IDateTimeProvider dateTimeProvider,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     INodeLifetime nodeLifetime,
     ILoggerFactory loggerFactory)
 {
     this.asyncLoopFactory = asyncLoopFactory;
     this.blockProvider    = blockProvider;
     this.chain            = chain;
     this.consensusLoop    = consensusLoop;
     this.dateTimeProvider = dateTimeProvider;
     this.loggerFactory    = loggerFactory;
     this.logger           = loggerFactory.CreateLogger(this.GetType().FullName);
     this.mempool          = mempool;
     this.mempoolLock      = mempoolLock;
     this.network          = network;
     this.nodeLifetime     = nodeLifetime;
     this.miningCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(new[] { this.nodeLifetime.ApplicationStopping });
 }
        protected BlockDefinition(
            IConsensusManager consensusManager,
            IDateTimeProvider dateTimeProvider,
            ILoggerFactory loggerFactory,
            ITxMempool mempool,
            MempoolSchedulerLock mempoolLock,
            MinerSettings minerSettings,
            Network network,
            NodeDeployments nodeDeployments)
        {
            this.ConsensusManager = consensusManager;
            this.DateTimeProvider = dateTimeProvider;
            this.logger           = loggerFactory.CreateLogger(this.GetType().FullName);
            this.Mempool          = mempool;
            this.MempoolLock      = mempoolLock;
            this.Network          = network;
            this.nodeDeployments  = nodeDeployments;

            this.Options         = minerSettings.BlockDefinitionOptions;
            this.BlockMinFeeRate = this.Options.BlockMinFeeRate;

            // Whether we need to account for byte usage (in addition to weight usage).
            this.NeedSizeAccounting = (this.Options.BlockMaxSize < network.Consensus.Options.MaxBlockSerializedSize);

            this.Configure();
        }
        protected BlockDefinition(
            IConsensusLoop consensusLoop,
            IDateTimeProvider dateTimeProvider,
            ILoggerFactory loggerFactory,
            ITxMempool mempool,
            MempoolSchedulerLock mempoolLock,
            Network network,
            BlockDefinitionOptions options = null)
        {
            this.ConsensusLoop    = consensusLoop;
            this.DateTimeProvider = dateTimeProvider;
            this.logger           = loggerFactory.CreateLogger(this.GetType().FullName);
            this.Mempool          = mempool;
            this.MempoolLock      = mempoolLock;
            this.Network          = network;

            this.Options         = options ?? new BlockDefinitionOptions();
            this.BlockMinFeeRate = this.Options.BlockMinFeeRate;

            // Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity.
            this.BlockMaxWeight = (uint)Math.Max(4000, Math.Min(PowMining.DefaultBlockMaxWeight - 4000, this.Options.BlockMaxWeight));

            // Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity.
            this.BlockMaxSize = (uint)Math.Max(1000, Math.Min(network.Consensus.Option <PowConsensusOptions>().MaxBlockSerializedSize - 1000, this.Options.BlockMaxSize));

            // Whether we need to account for byte usage (in addition to weight usage).
            this.NeedSizeAccounting = (this.BlockMaxSize < network.Consensus.Option <PowConsensusOptions>().MaxBlockSerializedSize - 1000);

            this.Configure();
        }
Beispiel #7
0
 public SmartContractMempoolValidator(ITxMempool memPool, MempoolSchedulerLock mempoolLock,
                                      IDateTimeProvider dateTimeProvider, MempoolSettings mempoolSettings, ChainIndexer chainIndexer,
                                      ICoinView coinView, ILoggerFactory loggerFactory, NodeSettings nodeSettings,
                                      IConsensusRuleEngine consensusRules, IEnumerable <IMempoolRule> mempoolRules, NodeDeployments nodeDeployments)
     : base(memPool, mempoolLock, dateTimeProvider, mempoolSettings, chainIndexer, coinView, loggerFactory, nodeSettings, consensusRules, mempoolRules, nodeDeployments)
 {
     // Dirty hack, but due to AllowedScriptTypeRule we don't need to check for standard scripts on any network, even live.
     // TODO: Remove ASAP. Ensure RequireStandard isn't used on SC mainnets, or the StandardScripts check is modular.
     mempoolSettings.RequireStandard = false;
 }
Beispiel #8
0
 public PoABlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, new MinerSettings(NodeSettings.Default(network)), network)
 {
 }
Beispiel #9
0
 protected x42BlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     MinerSettings minerSettings,
     Network network,
     NodeDeployments nodeDeployments) : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network, nodeDeployments)
 {
     this.logger = loggerFactory.CreateLogger(this.GetType().FullName);
 }
Beispiel #10
0
 public PoABlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     MinerSettings minerSettings,
     NodeDeployments nodeDeployments)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network, nodeDeployments)
 {
 }
 public PowBlockAssembler(
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     AssemblerOptions options = null)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network)
 {
     this.logger = loggerFactory.CreateLogger(this.GetType().FullName);
 }
Beispiel #12
0
 public PowTestBlockAssembler(
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     AssemblerOptions options = null)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network, options)
 {
     this.block = this.BlockTemplate.Block;
 }
Beispiel #13
0
 public PowTestBlockAssembler(
     IConsensusLoop consensusLoop,
     Network network,
     MempoolSchedulerLock mempoolLock,
     ITxMempool mempool,
     IDateTimeProvider dateTimeProvider,
     ChainedBlock chainTip,
     ILoggerFactory loggerFactory,
     AssemblerOptions options = null) :
     base(chainTip, consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network, options)
 {
     base.pblock = this.pblocktemplate.Block;
 }
 public PosTestBlockAssembler(
     IConsensusLoop consensusLoop,
     Network network,
     MempoolSchedulerLock mempoolLock,
     ITxMempool mempool,
     IDateTimeProvider dateTimeProvider,
     IStakeChain stakeChain,
     IStakeValidator stakeValidator,
     ILoggerFactory loggerFactory)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network, stakeChain, stakeValidator)
 {
     base.block = this.BlockTemplate.Block;
 }
Beispiel #15
0
 public PowTestBlockDefinition(
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     IConsensusRules consensusRules,
     BlockDefinitionOptions options = null)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network, consensusRules)
 {
     this.block = this.BlockTemplate.Block;
 }
Beispiel #16
0
 public BlocksDisconnectedSignaled(
     ITxMempool mempool,
     IMempoolValidator mempoolValidator,
     MempoolSchedulerLock mempoolLock,
     ILoggerFactory loggerFactory,
     ISignals signals)
 {
     this.mempool          = mempool;
     this.mempoolValidator = mempoolValidator;
     this.mempoolLock      = mempoolLock;
     this.signals          = signals;
     this.logger           = loggerFactory.CreateLogger(this.GetType().FullName);
 }
 public PosTestBlockAssembler(IConsensusLoop consensusLoop,
                              Network network,
                              MempoolSchedulerLock mempoolLock,
                              ITxMempool mempool,
                              IDateTimeProvider dateTimeProvider,
                              IStakeChain stakeChain,
                              IStakeValidator stakeValidator,
                              ChainedBlock chainTip,
                              ILoggerFactory loggerFactory,
                              AssemblerOptions options = null) :
     base(consensusLoop, network, mempoolLock, mempool, dateTimeProvider, stakeChain, stakeValidator, chainTip, loggerFactory, options)
 {
     base.pblock = this.pblocktemplate.Block;
 }
Beispiel #18
0
 public PowBlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     MinerSettings minerSettings,
     Network network,
     IConsensusRuleEngine consensusRules,
     BlockDefinitionOptions options = null)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network)
 {
     this.consensusRules = consensusRules;
     this.logger         = loggerFactory.CreateLogger("Impleum.Bitcoin.FullNode");
 }
Beispiel #19
0
 public PowBlockDefinition(
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     MinerSettings minerSettings,
     Network network,
     IConsensusRules consensusRules,
     BlockDefinitionOptions options = null)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network)
 {
     this.consensusRules = consensusRules;
     this.logger         = loggerFactory.CreateLogger(this.GetType().FullName);
 }
 public PosTestBlockAssembler(
     IConsensusManager consensusManager,
     Network network,
     MempoolSchedulerLock mempoolLock,
     ITxMempool mempool,
     MinerSettings minerSettings,
     IDateTimeProvider dateTimeProvider,
     IStakeChain stakeChain,
     IStakeValidator stakeValidator,
     ILoggerFactory loggerFactory,
     NodeDeployments nodeDeployments)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network, stakeChain, stakeValidator, nodeDeployments)
 {
     base.block = this.BlockTemplate.Block;
 }
Beispiel #21
0
 public PosBlockAssembler(
     ConsensusLoop consensusLoop,
     Network network,
     MempoolSchedulerLock mempoolLock,
     TxMempool mempool,
     IDateTimeProvider dateTimeProvider,
     StakeChain stakeChain,
     ChainedBlock chainTip,
     ILoggerFactory loggerFactory,
     AssemblerOptions options = null)
     : base(consensusLoop, network, mempoolLock, mempool, dateTimeProvider, chainTip, loggerFactory, options)
 {
     this.logger     = loggerFactory.CreateLogger(this.GetType().FullName);
     this.stakeChain = stakeChain;
 }
Beispiel #22
0
        private static BlockTemplate CreateBlockTemplate(TestChainContext testChainContext, Script scriptPubKey,
                                                         TxMempool mempool, MempoolSchedulerLock mempoolLock)
        {
            PowBlockDefinition blockAssembler = new PowBlockDefinition(testChainContext.Consensus,
                                                                       testChainContext.DateTimeProvider, testChainContext.LoggerFactory as LoggerFactory, mempool, mempoolLock,
                                                                       new MinerSettings(testChainContext.NodeSettings), testChainContext.Network, testChainContext.ConsensusRules);

            BlockTemplate newBlock = blockAssembler.Build(testChainContext.Chain.Tip, scriptPubKey);

            int         nHeight    = testChainContext.Chain.Tip.Height + 1; // Height first in coinbase required for block.version=2
            Transaction txCoinbase = newBlock.Block.Transactions[0];

            txCoinbase.Inputs[0] = TxIn.CreateCoinbase(nHeight);
            return(newBlock);
        }
 public PosPowBlockDefinition(
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     IStakeChain stakeChain,
     IStakeValidator stakeValidator)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network, new BlockDefinitionOptions() { IsProofOfStake = false })
 {
     this.logger         = loggerFactory.CreateLogger(this.GetType().FullName);
     this.stakeChain     = stakeChain;
     this.stakeValidator = stakeValidator;
 }
Beispiel #24
0
 public PowTestBlockDefinition(
     IConsensusManager consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     MinerSettings minerSettings,
     Network network,
     IConsensusRuleEngine consensusRules,
     NodeDeployments nodeDeployments,
     BlockDefinitionOptions options = null)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network, consensusRules, nodeDeployments)
 {
     this.block = this.BlockTemplate.Block;
 }
        public PowBlockAssembler(
            IConsensusLoop consensusLoop,
            Network network,
            MempoolSchedulerLock mempoolLock,
            ITxMempool mempool,
            IDateTimeProvider dateTimeProvider,
            ChainedBlock chainTip,
            ILoggerFactory loggerFactory,
            AssemblerOptions options = null)
        {
            this.logger = loggerFactory.CreateLogger(this.GetType().FullName);

            options = options ?? new AssemblerOptions();
            this.blockMinFeeRate = options.BlockMinFeeRate;

            // Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity.
            this.blockMaxWeight = (uint)Math.Max(4000, Math.Min(PowMining.DefaultBlockMaxWeight - 4000, options.BlockMaxWeight));

            // Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity.
            this.blockMaxSize = (uint)Math.Max(1000, Math.Min(network.Consensus.Option <PowConsensusOptions>().MaxBlockSerializedSize - 1000, options.BlockMaxSize));

            // Whether we need to account for byte usage (in addition to weight usage).
            this.needSizeAccounting = (this.blockMaxSize < network.Consensus.Option <PowConsensusOptions>().MaxBlockSerializedSize - 1000);

            this.consensusLoop    = consensusLoop;
            this.mempoolLock      = mempoolLock;
            this.mempool          = mempool;
            this.dateTimeProvider = dateTimeProvider;
            this.options          = options;
            this.network          = network;

            this.inBlock = new TxMempool.SetEntries();

            // Reserve space for coinbase tx.
            this.blockSize       = 1000;
            this.blockWeight     = 4000;
            this.blockSigOpsCost = 400;
            this.fIncludeWitness = false;

            // These counters do not include coinbase tx.
            this.blockTx = 0;
            this.fees    = 0;

            this.ChainTip       = chainTip;
            this.pblocktemplate = new BlockTemplate {
                Block = new Block(), VTxFees = new List <Money>()
            };
        }
Beispiel #26
0
 public SmartContractPoABlockDefinition(
     IBlockBufferGenerator blockBufferGenerator,
     ICoinView coinView,
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     IContractExecutorFactory executorFactory,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     ISenderRetriever senderRetriever,
     IStateRepositoryRoot stateRoot)
     : base(blockBufferGenerator, coinView, consensusManager, dateTimeProvider, executorFactory, loggerFactory, mempool, mempoolLock, new MinerSettings(NodeSettings.Default(network)), network, senderRetriever, stateRoot)
 {
     // TODO: Fix gross MinerSettings injection ^^
 }
 public PosPowBlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     MinerSettings minerSettings,
     IStakeChain stakeChain,
     IStakeValidator stakeValidator)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network)
 {
     this.logger         = loggerFactory.CreateLogger("Impleum.Bitcoin.Fullnode");
     this.stakeChain     = stakeChain;
     this.stakeValidator = stakeValidator;
 }
 public TestFederatedPegBlockDefinition(
     IBlockBufferGenerator blockBufferGenerator,
     ICoinView coinView,
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     IContractExecutorFactory executorFactory,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     ISenderRetriever senderRetriever,
     IStateRepositoryRoot stateRoot,
     MinerSettings minerSettings)
     : base(blockBufferGenerator, coinView, consensusManager, dateTimeProvider, executorFactory, loggerFactory, mempool, mempoolLock, network, senderRetriever, stateRoot, minerSettings)
 {
 }
 public PosBlockDefinition(
     IConsensusManager consensusManager,
     IDateTimeProvider dateTimeProvider,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     MinerSettings minerSettings,
     Network network,
     IStakeChain stakeChain,
     IStakeValidator stakeValidator)
     : base(consensusManager, dateTimeProvider, loggerFactory, mempool, mempoolLock, minerSettings, network)
 {
     this.logger         = loggerFactory.CreateLogger(this.GetType().FullName);
     this.stakeChain     = stakeChain;
     this.stakeValidator = stakeValidator;
 }
Beispiel #30
0
 public SmartContractBlockDefinition(
     CoinView coinView,
     IConsensusLoop consensusLoop,
     IDateTimeProvider dateTimeProvider,
     ISmartContractExecutorFactory executorFactory,
     ILoggerFactory loggerFactory,
     ITxMempool mempool,
     MempoolSchedulerLock mempoolLock,
     Network network,
     ContractStateRepositoryRoot stateRoot)
     : base(consensusLoop, dateTimeProvider, loggerFactory, mempool, mempoolLock, network)
 {
     this.coinView        = coinView;
     this.executorFactory = executorFactory;
     this.logger          = loggerFactory.CreateLogger(this.GetType());
     this.stateRoot       = stateRoot;
 }