private BytesValue GetConsensusBlockExtraData(BytesValue input, bool isGeneratingTransactions = false)
        {
            var triggerInformation = new AElfConsensusTriggerInformation();

            triggerInformation.MergeFrom(input.Value);

            Assert(triggerInformation.Pubkey.Any(), "Invalid pubkey.");

            if (!TryToGetCurrentRoundInformation(out var currentRound))
            {
                Assert(false, "Failed to get current round information.");
            }

            var publicKeyBytes = triggerInformation.Pubkey;
            var pubkey         = publicKeyBytes.ToHex();

            LogIfPreviousMinerHasNotProduceEnoughTinyBlocks(currentRound, pubkey);

            var information = new AElfConsensusHeaderInformation();

            switch (triggerInformation.Behaviour)
            {
            case AElfConsensusBehaviour.UpdateValue:
                information = GetConsensusExtraDataToPublishOutValue(currentRound, pubkey,
                                                                     triggerInformation);
                if (!isGeneratingTransactions)
                {
                    information.Round = information.Round.GetUpdateValueRound(pubkey);
                }

                break;

            case AElfConsensusBehaviour.TinyBlock:
                information = GetConsensusExtraDataForTinyBlock(currentRound, pubkey,
                                                                triggerInformation);
                break;

            case AElfConsensusBehaviour.NextRound:
                information = GetConsensusExtraDataForNextRound(currentRound, pubkey,
                                                                triggerInformation);
                break;

            case AElfConsensusBehaviour.NextTerm:
                information = GetConsensusExtraDataForNextTerm(pubkey, triggerInformation);
                break;
            }

            if (!isGeneratingTransactions)
            {
                information.Round.DeleteSecretSharingInformation();
            }

            return(information.ToBytesValue());
        }
Esempio n. 2
0
        public override TransactionList GenerateConsensusTransactions(BytesValue input)
        {
            var triggerInformation = new AElfConsensusTriggerInformation();

            triggerInformation.MergeFrom(input.Value);
            // Some basic checks.
            Assert(triggerInformation.Pubkey.Any(),
                   "Data to request consensus information should contain pubkey.");

            var pubkey = triggerInformation.Pubkey;
            var consensusInformation = new AElfConsensusHeaderInformation();

            consensusInformation.MergeFrom(GetConsensusBlockExtraData(input, true).Value);
            var transactionList = GenerateTransactionListByExtraData(consensusInformation, pubkey);

            return(transactionList);
        }
        public override TransactionList GenerateConsensusTransactions(BytesValue input)
        {
            var triggerInformation = new AElfConsensusTriggerInformation();

            triggerInformation.MergeFrom(input.Value);
            // Some basic checks.
            Assert(triggerInformation.Pubkey.Any(),
                   "Data to request consensus information should contain public key.");

            var publicKey            = triggerInformation.Pubkey;
            var consensusInformation = new AElfConsensusHeaderInformation();

            consensusInformation.MergeFrom(GetConsensusBlockExtraData(input, true).Value);
            var round     = consensusInformation.Round;
            var behaviour = consensusInformation.Behaviour;

            switch (behaviour)
            {
            case AElfConsensusBehaviour.UpdateValueWithoutPreviousInValue:
            case AElfConsensusBehaviour.UpdateValue:
                return(new TransactionList
                {
                    Transactions =
                    {
                        GenerateTransaction(nameof(UpdateValue),
                                            round.ExtractInformationToUpdateConsensus(publicKey.ToHex()))
                    }
                });

            case AElfConsensusBehaviour.TinyBlock:
                var minerInRound = round.RealTimeMinersInformation[publicKey.ToHex()];
                return(new TransactionList
                {
                    Transactions =
                    {
                        GenerateTransaction(nameof(UpdateTinyBlockInformation),
                                            new TinyBlockInput
                        {
                            ActualMiningTime = minerInRound.ActualMiningTimes.Last(),
                            ProducedBlocks = minerInRound.ProducedBlocks,
                            RoundId = round.RoundId
                        })
                    }
                });

            case AElfConsensusBehaviour.NextRound:
                return(new TransactionList
                {
                    Transactions =
                    {
                        GenerateTransaction(nameof(NextRound), round)
                    }
                });

            case AElfConsensusBehaviour.NextTerm:
                return(new TransactionList
                {
                    Transactions =
                    {
                        GenerateTransaction(nameof(NextTerm), round)
                    }
                });

            default:
                throw new ArgumentOutOfRangeException();
            }
        }