private BlockRewardType GetBlockRewardType(Address address, Address[] beneficiaries, ushort[] kinds, int index)
        {
            bool TryGetKind(int indexIn, ref ushort kindOut)
            {
                if (beneficiaries[indexIn] == address)
                {
                    kindOut = kinds[indexIn];
                    return(true);
                }

                return(false);
            }

            bool   indexInBounds = index < beneficiaries.Length;
            ushort kind          = BenefactorKind.External;

            if (!indexInBounds || !TryGetKind(index, ref kind))
            {
                for (int i = 0; i < beneficiaries.Length; i++)
                {
                    if (TryGetKind(i, ref kind))
                    {
                        break;
                    }
                }
            }

            return(BenefactorKind.ToBlockRewardType(kind));
        }
예제 #2
0
        private BlockReward[] CalculateRewardsWithContract(Block block, IRewardContract contract)
        {
            (Address[] beneficieries, ushort[] kinds) GetBeneficiaries()
            {
                var length = block.Uncles.Length + 1;

                Address[] beneficiariesList = new Address[length];
                ushort[]  kindsList         = new ushort[length];
                beneficiariesList[0] = block.Beneficiary;
                kindsList[0]         = BenefactorKind.Author;

                for (int i = 0; i < block.Uncles.Length; i++)
                {
                    var uncle = block.Uncles[i];
                    if (BenefactorKind.TryGetUncle(block.Number - uncle.Number, out var kind))
                    {
                        beneficiariesList[i + 1] = uncle.Beneficiary;
                        kindsList[i + 1]         = kind;
                    }
                }

                return(beneficiariesList, kindsList);
            }

            var(beneficiaries, kinds) = GetBeneficiaries();
            var(addresses, rewards)   = contract.Reward(block.Header, beneficiaries, kinds);

            var blockRewards = new BlockReward[addresses.Length];

            for (int index = 0; index < addresses.Length; index++)
            {
                var address = addresses[index];
                blockRewards[index] = new BlockReward(address, rewards[index], BlockRewardType.External);
            }

            return(blockRewards);
        }