Exemple #1
0
 private static BlockPolicyViolationException ValidateMinerAuthorityRaw(
     Block <NCAction> block,
     IVariableSubPolicy <ImmutableHashSet <Address> > authorizedMinersPolicy)
 {
     // For genesis block, any miner can mine.
     if (block.Index == 0)
     {
         return(null);
     }
     // If not an authorized mining block index, any miner can mine.
     else if (!authorizedMinersPolicy.IsTargetIndex(block.Index))
     {
         return(null);
     }
     // Otherwise, block's miner should be one of the authorized miners.
     else if (authorizedMinersPolicy.Getter(block.Index).Contains(block.Miner))
     {
         return(null);
     }
     else
     {
         return(new BlockPolicyViolationException(
                    $"The block #{block.Index} {block.Hash} is not mined by an authorized miner."));
     }
 }
Exemple #2
0
        internal static BlockPolicyViolationException ValidateNextBlockRaw(
            BlockChain <NCAction> blockChain,
            Block <NCAction> nextBlock,
            IVariableSubPolicy <HashAlgorithmType> hashAlgorithmTypePolicy,
            IVariableSubPolicy <int> maxBlockBytesPolicy,
            IVariableSubPolicy <int> minTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerSignerPerBlockPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > authorizedMinersPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > permissionedMinersPolicy)
        {
            if (ValidateHashAlgorithmTypeRaw(
                    nextBlock,
                    hashAlgorithmTypePolicy) is InvalidBlockHashAlgorithmTypeException ibhate)
            {
                return(ibhate);
            }
            else if (ValidateBlockBytesRaw(
                         nextBlock,
                         maxBlockBytesPolicy) is InvalidBlockBytesLengthException ibble)
            {
                return(ibble);
            }
            else if (ValidateTxCountPerBlockRaw(
                         nextBlock,
                         minTransactionsPerBlockPolicy,
                         maxTransactionsPerBlockPolicy) is InvalidBlockTxCountException ibtce)
            {
                return(ibtce);
            }
            else if (ValidateTxCountPerSignerPerBlockRaw(
                         nextBlock,
                         maxTransactionsPerSignerPerBlockPolicy) is InvalidBlockTxCountPerSignerException ibtcpse)
            {
                return(ibtcpse);
            }
            else
            {
                if (nextBlock.Index == 0)
                {
                    return(null);
                }
                else if (authorizedMinersPolicy.IsTargetIndex(nextBlock.Index))
                {
                    return(ValidateMinerAuthorityRaw(
                               nextBlock,
                               authorizedMinersPolicy));
                }
                else if (permissionedMinersPolicy.IsTargetIndex(nextBlock.Index))
                {
                    return(ValidateMinerPermissionRaw(
                               nextBlock,
                               permissionedMinersPolicy));
                }
            }

            return(null);
        }
Exemple #3
0
 private static BlockPolicyViolationException ValidateMinerPermissionRaw(
     Block <NCAction> block,
     IVariableSubPolicy <ImmutableHashSet <Address> > permissionedMinersPolicy)
 {
     // If the set of permissioned miners is empty, any miner can mine.
     if (!permissionedMinersPolicy.IsTargetIndex(block.Index))
     {
         return(null);
     }
     else if (permissionedMinersPolicy.Getter(block.Index).Contains(block.Miner))
     {
         return(null);
     }
     else
     {
         return(new BlockPolicyViolationException(
                    $"Block #{block.Index} {block.Hash} is not mined by " +
                    $"a permissioned miner: {block.Miner}"));
     }
 }
Exemple #4
0
        internal static BlockPolicyViolationException ValidateNextBlockRaw(
            BlockChain <NCAction> blockChain,
            Block <NCAction> nextBlock,
            IVariableSubPolicy <int> minTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerSignerPerBlockPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > authorizedMinersPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > permissionedMinersPolicy)
        {
            // FIXME: Tx count validation should be done in libplanet, not here.
            // Should be removed once libplanet is updated.
            if (ValidateTxCountPerBlockRaw(
                    nextBlock,
                    minTransactionsPerBlockPolicy,
                    maxTransactionsPerBlockPolicy,
                    maxTransactionsPerSignerPerBlockPolicy) is BlockPolicyViolationException bpve)
            {
                return(bpve);
            }
            else
            {
                if (nextBlock.Index == 0)
                {
                    return(null);
                }
                else if (authorizedMinersPolicy.IsTargetIndex(nextBlock.Index))
                {
                    return(ValidateMinerAuthorityRaw(
                               nextBlock,
                               authorizedMinersPolicy));
                }
                else if (permissionedMinersPolicy.IsTargetIndex(nextBlock.Index))
                {
                    return(ValidateMinerPermissionRaw(
                               nextBlock,
                               permissionedMinersPolicy));
                }
            }

            return(null);
        }
Exemple #5
0
        private static bool IsAllowedToMineRaw(
            Address miner,
            long index,
            IVariableSubPolicy <ImmutableHashSet <Address> > authorizedMinersPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > permissionedMinersPolicy)
        {
            // For genesis blocks, any miner is allowed to mine.
            if (index == 0)
            {
                return(true);
            }
            else if (authorizedMinersPolicy.IsTargetIndex(index))
            {
                return(authorizedMinersPolicy.Getter(index).Contains(miner));
            }
            else if (permissionedMinersPolicy.IsTargetIndex(index))
            {
                return(permissionedMinersPolicy.Getter(index).Contains(miner));
            }

            // If none of the conditions apply, any miner is allowed to mine.
            return(true);
        }