private AElfConsensusHeaderInformation GetConsensusExtraDataToPublishOutValue(Round currentRound, string publicKey, AElfConsensusTriggerInformation triggerInformation) { currentRound.RealTimeMinersInformation[publicKey].ProducedTinyBlocks = currentRound .RealTimeMinersInformation[publicKey].ProducedTinyBlocks.Add(1); currentRound.RealTimeMinersInformation[publicKey].ProducedBlocks = currentRound.RealTimeMinersInformation[publicKey].ProducedBlocks.Add(1); currentRound.RealTimeMinersInformation[publicKey].ActualMiningTimes .Add(Context.CurrentBlockTime); Assert(triggerInformation.RandomHash != null, "Random hash should not be null."); var inValue = currentRound.CalculateInValue(triggerInformation.RandomHash); var outValue = Hash.FromMessage(inValue); var signature = Hash.FromTwoHashes(outValue, triggerInformation.RandomHash); // Just initial signature value. var previousInValue = Hash.Empty; // Just initial previous in value. if (TryToGetPreviousRoundInformation(out var previousRound) && !IsFirstRoundOfCurrentTerm(out _)) { signature = previousRound.CalculateSignature(inValue); if (triggerInformation.PreviousRandomHash != null && triggerInformation.PreviousRandomHash != Hash.Empty) { // If PreviousRandomHash is null or Hash.Empty, it means the sender unable or unwilling to publish his previous in value. previousInValue = previousRound.CalculateInValue(triggerInformation.PreviousRandomHash); // Self check. if (Hash.FromMessage(previousInValue) != previousRound.RealTimeMinersInformation[publicKey].OutValue) { Context.LogDebug(() => "Failed to produce block at previous round?"); previousInValue = Hash.Empty; } } } var updatedRound = currentRound.ApplyNormalConsensusData(publicKey, previousInValue, outValue, signature); updatedRound.RealTimeMinersInformation[publicKey].ImpliedIrreversibleBlockHeight = Context.CurrentHeight; ShareInValueOfCurrentRound(updatedRound, previousRound, inValue, publicKey); // To publish Out Value. return(new AElfConsensusHeaderInformation { SenderPubkey = publicKey.ToByteString(), Round = updatedRound, Behaviour = triggerInformation.Behaviour }); }