/// <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 }); }
/// <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 }); }