public AElfDPoSInformation GenerateInfoForFirstTwoRounds() { var dict = new Dictionary <string, int>(); // First round foreach (var node in _miners.Nodes) { dict.Add(node, node[0]); } var sortedMiningNodes = from obj in dict orderby obj.Value descending select obj.Key; var enumerable = sortedMiningNodes.ToList(); var infosOfRound1 = new Round(); var selected = _miners.Nodes.Count / 2; for (var i = 0; i < enumerable.Count; i++) { var bpInfo = new BlockProducer { IsEBP = false }; if (i == selected) { bpInfo.IsEBP = true; } bpInfo.Order = i + 1; bpInfo.Signature = Hash.Generate(); bpInfo.TimeSlot = GetTimestampOfUtcNow(i * ConsensusConfig.Instance.DPoSMiningInterval + GlobalConfig.AElfWaitFirstRoundTime); infosOfRound1.BlockProducers.Add(enumerable[i], bpInfo); } // Second round dict = new Dictionary <string, int>(); foreach (var node in _miners.Nodes) { dict.Add(node, node[0]); } sortedMiningNodes = from obj in dict orderby obj.Value descending select obj.Key; enumerable = sortedMiningNodes.ToList(); var infosOfRound2 = new Round(); var addition = enumerable.Count * ConsensusConfig.Instance.DPoSMiningInterval + ConsensusConfig.Instance.DPoSMiningInterval; selected = _miners.Nodes.Count / 2; for (var i = 0; i < enumerable.Count; i++) { var bpInfo = new BlockProducer { IsEBP = false }; if (i == selected) { bpInfo.IsEBP = true; } bpInfo.TimeSlot = GetTimestampOfUtcNow(i * ConsensusConfig.Instance.DPoSMiningInterval + addition + GlobalConfig.AElfWaitFirstRoundTime); bpInfo.Order = i + 1; infosOfRound2.BlockProducers.Add(enumerable[i], bpInfo); } infosOfRound1.RoundNumber = 1; infosOfRound2.RoundNumber = 2; var dPoSInfo = new AElfDPoSInformation { Rounds = { infosOfRound1, infosOfRound2 } }; return(dPoSInfo); }
private async Task SetExtraBlockProducerOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info) { await _eBPMap.SetValueAsync(roundNumber, info.GetExtraBlockProducerOfSpecificRound(roundNumber.Value)); }
private async Task SetExtraBlockMiningTimeSlotOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info) { var lastMinerTimeSlot = info.GetLastBlockProducerTimeSlotOfSpecificRound(roundNumber.Value); var timeSlot = GetTimestampWithOffset(lastMinerTimeSlot, Interval); await _timeForProducingExtraBlockField.SetAsync(timeSlot); }
private async Task SetFirstPlaceOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info) { await _firstPlaceMap.SetValueAsync(roundNumber, new StringValue { Value = info.GetRoundInfo(roundNumber.Value).BlockProducers.First().Key }); }