コード例 #1
0
        /// <summary>
        /// In AEDPoS, we calculate next several continual previous_in_values to provide random hash.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override RandomNumberOrder RequestRandomNumber(Empty input)
        {
            var tokenHash = Context.TransactionId;

            if (TryToGetCurrentRoundInformation(out var currentRound))
            {
                var requestInformation = new RandomNumberRequestHandler(currentRound, Context.CurrentHeight)
                                         .GetRandomNumberRequestInformation();

                State.RandomNumberInformationMap[tokenHash] = requestInformation;

                // For clearing tokens of certain round number.
                if (State.RandomNumberTokenMap[currentRound.RoundNumber] == null)
                {
                    State.RandomNumberTokenMap[currentRound.RoundNumber] = new HashList {
                        Values = { tokenHash }
                    };
                }
                else
                {
                    State.RandomNumberTokenMap[currentRound.RoundNumber].Values.Add(tokenHash);
                }

                Context.Fire(new RandomNumberRequestHandled
                {
                    Requester   = Context.Sender,
                    BlockHeight = requestInformation.ExpectedBlockHeight,
                    TokenHash   = tokenHash
                });

                Context.LogDebug(() =>
                                 $"Handled a request of random number: {tokenHash}.current height: {Context.CurrentHeight}, target height: {requestInformation.ExpectedBlockHeight}");

                return(new RandomNumberOrder
                {
                    BlockHeight = requestInformation.ExpectedBlockHeight,
                    TokenHash = tokenHash
                });
            }

            // Impossible.
            Assert(false, "Failed to get current round information");

            // Won't reach here anyway.
            return(new RandomNumberOrder
            {
                BlockHeight = long.MaxValue
            });
        }
コード例 #2
0
        /// <summary>
        /// In AEDPoS, we calculate next several continual previous_in_values to provide random hash.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override RandomNumberOrder RequestRandomNumber(RequestRandomNumberInput input)
        {
            var tokenHash = Context.TransactionId;

            if (TryToGetCurrentRoundInformation(out var currentRound))
            {
                var information = new RandomNumberRequestHandler(currentRound, Context.CurrentHeight)
                                  .GetRandomNumberRequestInformation();

                information.ExpectedBlockHeight             = Math.Max(input.MinimumBlockHeight, information.ExpectedBlockHeight);
                State.RandomNumberInformationMap[tokenHash] = information;

                // For clear usage.
                if (State.RandomNumberTokenMap[currentRound.RoundNumber] == null)
                {
                    State.RandomNumberTokenMap[currentRound.RoundNumber] = new HashList {
                        Values = { tokenHash }
                    };
                }
                else
                {
                    State.RandomNumberTokenMap[currentRound.RoundNumber].Values.Add(tokenHash);
                }

                Context.Fire(new RandomNumberRequestHandled
                {
                    Requester   = Context.Sender,
                    BlockHeight = information.ExpectedBlockHeight,
                    TokenHash   = tokenHash
                });

                return(new RandomNumberOrder
                {
                    BlockHeight = information.ExpectedBlockHeight,
                    TokenHash = tokenHash
                });
            }

            // Not possible.
            Assert(false, "Failed to get current round information");

            // Won't reach here anyway.
            return(new RandomNumberOrder
            {
                BlockHeight = long.MaxValue
            });
        }