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()); }
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(); } }