예제 #1
0
        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);
        }
예제 #2
0
 private async Task SetExtraBlockProducerOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info)
 {
     await _eBPMap.SetValueAsync(roundNumber,
                                 info.GetExtraBlockProducerOfSpecificRound(roundNumber.Value));
 }
예제 #3
0
 private async Task SetExtraBlockMiningTimeSlotOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info)
 {
     var lastMinerTimeSlot = info.GetLastBlockProducerTimeSlotOfSpecificRound(roundNumber.Value);
     var timeSlot          = GetTimestampWithOffset(lastMinerTimeSlot, Interval);
     await _timeForProducingExtraBlockField.SetAsync(timeSlot);
 }
예제 #4
0
 private async Task SetFirstPlaceOfSpecificRound(UInt64Value roundNumber, AElfDPoSInformation info)
 {
     await _firstPlaceMap.SetValueAsync(roundNumber,
                                        new StringValue { Value = info.GetRoundInfo(roundNumber.Value).BlockProducers.First().Key });
 }