Ejemplo n.º 1
0
        public void DifficultyAdjustment()
        {
            TimeSpan defaultInterval =
                DifficultyAdjustment <DumbAction> .DefaultTargetBlockInterval;
            long defaultStability =
                DifficultyAdjustment <DumbAction> .DefaultDifficultyStability;
            long defaultMinimum =
                DifficultyAdjustment <DumbAction> .DefaultMinimumDifficulty;

            // Should work with defaults.
            DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                defaultInterval,
                defaultStability,
                defaultMinimum);

            // Negative block interval.
            Assert.Throws <ArgumentOutOfRangeException>(() =>
                                                        DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                                                            TimeSpan.FromMilliseconds(-5),
                                                            defaultStability,
                                                            defaultMinimum));

            // Zero block interval.
            Assert.Throws <ArgumentOutOfRangeException>(() =>
                                                        DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                                                            TimeSpan.FromMilliseconds(0),
                                                            defaultStability,
                                                            defaultMinimum));

            // Invalid stability due to being too low.
            Assert.Throws <ArgumentOutOfRangeException>(() =>
                                                        DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                                                            defaultInterval,
                                                            0,
                                                            defaultMinimum));

            // Stability being equal to minimum difficulty should be fine.
            DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                defaultInterval,
                defaultMinimum,
                defaultMinimum);

            // Invalid stability in relation to minimum difficulty for stability being too high.
            Assert.Throws <ArgumentOutOfRangeException>(() =>
                                                        DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                                                            defaultInterval,
                                                            defaultMinimum + 1,
                                                            defaultMinimum));

            // Invalid minimum difficulty for being too low.
            Assert.Throws <ArgumentOutOfRangeException>(() =>
                                                        DifficultyAdjustment <DumbAction> .AlgorithmFactory(
                                                            defaultInterval,
                                                            defaultStability,
                                                            0));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets a <see cref="BlockPolicy"/> constructed from given parameters.
        /// </summary>
        /// <param name="minimumDifficulty">The minimum difficulty that a <see cref="Block{T}"/>
        /// can have.  This is ignored for genesis blocks.</param>
        /// <param name="minTransactionsPerBlockPolicy">Used for minimum number of transactions
        /// required per block.</param>
        /// <param name="maxTransactionsPerBlockPolicy">The maximum number of
        /// <see cref="Transaction{T}"/>s that a <see cref="Block{T}"/> can have.</param>
        /// <param name="maxTransactionsPerSignerPerBlockPolicy">The maximum number of
        /// <see cref="Transaction{T}"/>s from a single miner that a <see cref="Block{T}"/>
        /// can have.</param>
        /// <param name="authorizedMinersPolicy">Used for authorized mining.</param>
        /// <param name="permissionedMinersPolicy">Used for permissioned mining.</param>
        /// <returns>A <see cref="BlockPolicy"/> constructed from given parameters.</returns>
        internal IBlockPolicy <NCAction> GetPolicy(
            long minimumDifficulty,
            IVariableSubPolicy <int> maxBlockBytesPolicy,
            IVariableSubPolicy <int> minTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerBlockPolicy,
            IVariableSubPolicy <int> maxTransactionsPerSignerPerBlockPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > authorizedMinersPolicy,
            IVariableSubPolicy <ImmutableHashSet <Address> > permissionedMinersPolicy)
        {
#if UNITY_EDITOR
            return(new DebugPolicy());
#else
            maxBlockBytesPolicy = maxBlockBytesPolicy
                                  ?? MaxBlockBytesPolicy.Default;
            minTransactionsPerBlockPolicy = minTransactionsPerBlockPolicy
                                            ?? MinTransactionsPerBlockPolicy.Default;
            maxTransactionsPerBlockPolicy = maxTransactionsPerBlockPolicy
                                            ?? MaxTransactionsPerBlockPolicy.Default;
            maxTransactionsPerSignerPerBlockPolicy = maxTransactionsPerSignerPerBlockPolicy
                                                     ?? MaxTransactionsPerSignerPerBlockPolicy.Default;
            authorizedMinersPolicy = authorizedMinersPolicy
                                     ?? AuthorizedMinersPolicy.Default;
            permissionedMinersPolicy = permissionedMinersPolicy
                                       ?? PermissionedMinersPolicy.Default;

            // FIXME: Slight inconsistency due to pre-existing delegate.
            HashAlgorithmGetter getHashAlgorithmType =
                index => HashAlgorithmTypePolicy.Mainnet.Getter(index);

            // FIXME: Ad hoc solution to poorly defined tx validity.
            ImmutableHashSet <Address> allAuthorizedMiners =
                authorizedMinersPolicy.SpannedSubPolicies
                .Select(spannedSubPolicy => spannedSubPolicy.Value)
#pragma warning disable LAA1002
                .Aggregate(
                    authorizedMinersPolicy.DefaultValue,
                    (union, next) => union.Union(next));
#pragma warning restore LAA1002

            Func <BlockChain <NCAction>, Transaction <NCAction>, TxPolicyViolationException> validateNextBlockTx =
                (blockChain, transaction) => ValidateNextBlockTxRaw(
                    blockChain, transaction, allAuthorizedMiners);
            Func <BlockChain <NCAction>, Block <NCAction>, BlockPolicyViolationException> validateNextBlock =
                (blockChain, block) => ValidateNextBlockRaw(
                    blockChain,
                    block,
                    minTransactionsPerBlockPolicy,
                    maxTransactionsPerBlockPolicy,
                    maxTransactionsPerSignerPerBlockPolicy,
                    authorizedMinersPolicy,
                    permissionedMinersPolicy);
            Func <BlockChain <NCAction>, long> getNextBlockDifficulty = blockChain =>
                                                                        GetNextBlockDifficultyRaw(
                blockChain,
                BlockInterval,
                DifficultyStability,
                minimumDifficulty,
                authorizedMinersPolicy,
                defaultAlgorithm: chain => DifficultyAdjustment <NCAction> .BaseAlgorithm(
                    chain, BlockInterval, DifficultyStability, minimumDifficulty));
            Func <Address, long, bool> isAllowedToMine = (address, index) => IsAllowedToMineRaw(
                address,
                index,
                authorizedMinersPolicy,
                permissionedMinersPolicy);

            return(new BlockPolicy(
                       new RewardGold(),
                       blockInterval: BlockInterval,
                       difficultyStability: DifficultyStability,
                       minimumDifficulty: minimumDifficulty,
                       canonicalChainComparer: new TotalDifficultyComparer(),
                       hashAlgorithmGetter: getHashAlgorithmType,
                       validateNextBlockTx: validateNextBlockTx,
                       validateNextBlock: validateNextBlock,
                       getMaxBlockBytes: maxBlockBytesPolicy.Getter,
                       getMinTransactionsPerBlock: minTransactionsPerBlockPolicy.Getter,
                       getMaxTransactionsPerBlock: maxTransactionsPerBlockPolicy.Getter,
                       getMaxTransactionsPerSignerPerBlock: maxTransactionsPerSignerPerBlockPolicy.Getter,
                       getNextBlockDifficulty: getNextBlockDifficulty,
                       isAllowedToMine: isAllowedToMine));
#endif
        }