コード例 #1
0
        /// <summary>
        /// Remove current total shares of Basic Reward,
        /// Add new shares for miners of next term.
        /// 1 share for each miner.
        /// </summary>
        /// <param name="endPeriod"></param>
        /// <param name="victories"></param>
        /// <param name="previousMinerAddresses"></param>
        private void UpdateBasicMinerRewardWeights(long endPeriod, IEnumerable <string> victories,
                                                   IEnumerable <Address> previousMinerAddresses)
        {
            var basicRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput
            {
                SchemeId      = State.BasicRewardHash.Value,
                Beneficiaries = { previousMinerAddresses }
            };

            State.ProfitContract.RemoveBeneficiaries.Send(basicRewardProfitSubBeneficiaries);

            var basicRewardProfitAddBeneficiaries = new AddBeneficiariesInput
            {
                SchemeId          = State.BasicRewardHash.Value,
                EndPeriod         = endPeriod,
                BeneficiaryShares =
                {
                    victories.Select(k => Address.FromPublicKey(k.ToByteString().ToByteArray()))
                    .Select(a => new BeneficiaryShare {
                        Beneficiary = a, Shares = 1
                    })
                }
            };

            // Manage weights of `MinerBasicReward`
            State.ProfitContract.AddBeneficiaries.Send(basicRewardProfitAddBeneficiaries);
        }
コード例 #2
0
        private void AddBeneficiariesForReElectionScheme(long endPeriod, IEnumerable <string> victories,
                                                         MinerReElectionInformation minerReElectionInformation)
        {
            var reElectionProfitAddBeneficiaries = new AddBeneficiariesInput
            {
                SchemeId  = State.ReElectionRewardHash.Value,
                EndPeriod = endPeriod
            };

            foreach (var victory in victories)
            {
                if (minerReElectionInformation.ContinualAppointmentTimes.ContainsKey(victory))
                {
                    var minerAddress = Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(victory));
                    var continualAppointmentCount =
                        minerReElectionInformation.ContinualAppointmentTimes[victory].Add(1);
                    minerReElectionInformation.ContinualAppointmentTimes[victory] = continualAppointmentCount;
                    reElectionProfitAddBeneficiaries.BeneficiaryShares.Add(new BeneficiaryShare
                    {
                        Beneficiary = minerAddress,
                        Shares      = Math.Min(continualAppointmentCount,
                                               TreasuryContractConstants.MaximumReElectionRewardShare)
                    });
                }
                else
                {
                    minerReElectionInformation.ContinualAppointmentTimes.Add(victory, 0);
                }
            }

            if (reElectionProfitAddBeneficiaries.BeneficiaryShares.Any())
            {
                State.ProfitContract.AddBeneficiaries.Send(reElectionProfitAddBeneficiaries);
            }
        }
コード例 #3
0
ファイル: ProfitContract.cs プロジェクト: wymoon2690/AElf
        public override Empty AddBeneficiaries(AddBeneficiariesInput input)
        {
            foreach (var beneficiaryShare in input.BeneficiaryShares)
            {
                AddBeneficiary(new AddBeneficiaryInput
                {
                    SchemeId         = input.SchemeId,
                    BeneficiaryShare = beneficiaryShare,
                    EndPeriod        = input.EndPeriod
                });
            }

            return(new Empty());
        }
コード例 #4
0
        /// <summary>
        /// Remove current total shares of Votes Weight Reward,
        /// Add shares to current miners based on votes they obtained.
        /// </summary>
        /// <param name="previousTermInformation"></param>
        /// <param name="victories"></param>
        private void UpdateVotesWeightRewardWeights(Round previousTermInformation, IEnumerable <string> victories)
        {
            var previousMinerAddresses = previousTermInformation.RealTimeMinersInformation.Keys
                                         .Select(k => Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(k))).ToList();
            var votesWeightRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput
            {
                SchemeId      = State.VotesWeightRewardHash.Value,
                Beneficiaries = { previousMinerAddresses }
            };

            State.ProfitContract.RemoveBeneficiaries.Send(votesWeightRewardProfitSubBeneficiaries);

            var votesWeightRewardProfitAddBeneficiaries = new AddBeneficiariesInput
            {
                SchemeId  = State.VotesWeightRewardHash.Value,
                EndPeriod = previousTermInformation.TermNumber.Add(1)
            };

            var dataCenterRankingList = State.ElectionContract.GetDataCenterRankingList.Call(new Empty());

            foreach (var victory in victories)
            {
                var obtainedVotes = 0L;
                if (dataCenterRankingList.DataCenters.ContainsKey(victory))
                {
                    obtainedVotes = dataCenterRankingList.DataCenters[victory];
                }

                var minerAddress = Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(victory));
                if (obtainedVotes > 0)
                {
                    votesWeightRewardProfitAddBeneficiaries.BeneficiaryShares.Add(new BeneficiaryShare
                    {
                        Beneficiary = minerAddress,
                        Shares      = obtainedVotes
                    });
                }
            }

            if (votesWeightRewardProfitAddBeneficiaries.BeneficiaryShares.Any())
            {
                State.ProfitContract.AddBeneficiaries.Send(votesWeightRewardProfitAddBeneficiaries);
            }
        }