示例#1
0
        public bool Check(IBlockValidationContext context, ref BlockValidationState validationState)
        {
            int transactionsCount = context.Block.Transactions !.Length;

            if (
                transactionsCount == 0 ||
                transactionsCount * _consensusParameters.WitnessScaleFactor > _consensusParameters.MaxBlockWeight ||
                GetBlockSize(context.Block) * _consensusParameters.WitnessScaleFactor > _consensusParameters.MaxBlockWeight
                )
            {
                return(validationState.Invalid(BlockValidationStateResults.Consensus, "bad-blk-length", "size limits failed"));
            }

            return(true);
        }
        public bool Check(IBlockValidationContext context, ref BlockValidationState validationState)
        {
            Transaction[] transactions = context.Block.Transactions !;

            for (int i = 0; i < transactions.Length; i++)
            {
                if (!PerformCheck(transactions[i], out TransactionValidationState? transactionValidationState))
                {
                    // checks performed here are context-free validation checks. The only possible failures are consensus failures.
                    return(validationState.Invalid(BlockValidationStateResults.Consensus, transactionValidationState.RejectReason !, transactionValidationState.DebugMessage !));
                }
            }

            return(true);
        }
示例#3
0
        public bool Check(IBlockValidationContext context, ref BlockValidationState validationState)
        {
            if (IsBlockMalleated(context.Block.Transactions !))
            {
                return(validationState.Invalid(BlockValidationStateResults.Mutated, "bad-txns-duplicate", "duplicate transaction"));
            }

            UInt256 computedMerkleRoot = _merkleRootCalculator.GetBlockMerkleRoot(context.Block);

            if (context.Block.Header !.MerkleRoot != computedMerkleRoot)
            {
                return(validationState.Invalid(BlockValidationStateResults.Mutated, "bad-txnmrklroot", "hashMerkleRoot mismatch"));
            }

            return(true);
        }
示例#4
0
        public bool Check(IBlockValidationContext context, ref BlockValidationState validationState)
        {
            Protocol.Types.Transaction[] transactions = context.Block.Transactions !;

            // First transaction must be coinbase, the rest must not be
            if ((transactions.Length == 0) || !transactions[0].IsCoinBase())
            {
                validationState.Invalid(BlockValidationStateResults.Consensus, "bad-cb-missing", "first tx is not coinbase");
                return(false);
            }

            for (int i = 1; i < transactions.Length; i++)
            {
                if (transactions[i].IsCoinBase())
                {
                    validationState.Invalid(BlockValidationStateResults.Consensus, "bad-cb-multiple", "more than one coinbase");
                    return(false);
                }
            }

            return(true);
        }