public override Empty UpdateConsensusInformation(ConsensusInformation input) { if (Context.Sender != Context.GetContractAddressByName(SmartContractConstants.CrossChainContractSystemName)) { return(new Empty()); } Assert(!State.IsMainChain.Value, "Only side chain can update consensus information."); // For now we just extract the miner list from main chain consensus information, then update miners list. if (input == null || input.Value.IsEmpty) { return(new Empty()); } var consensusInformation = AElfConsensusHeaderInformation.Parser.ParseFrom(input.Value); // check round number of shared consensus, not term number if (consensusInformation.Round.RoundNumber <= State.MainChainRoundNumber.Value) { return(new Empty()); } Context.LogDebug(() => $"Shared miner list of round {consensusInformation.Round.RoundNumber}"); var minersKeys = consensusInformation.Round.RealTimeMinersInformation.Keys; State.MainChainRoundNumber.Value = consensusInformation.Round.RoundNumber; State.MainChainCurrentMinerList.Value = new MinerList { Pubkeys = { minersKeys.Select(k => k.ToByteString()) } }; return(new Empty()); }
public async Task Update_ConsensusInformation_Test() { await AEDPoSContract_FirstRound_BootMiner_Test(); //just verify method, will add other logic { var input = new ConsensusInformation { Value = ByteString.CopyFromUtf8("test") }; var transactionResult = await AEDPoSContractStub.UpdateConsensusInformation.SendAsync(input); transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined); } }
public override Empty UpdateMainChainConsensus(ConsensusInformation input) { // TODO: Only cross chain contract can call UpdateMainChainConsensus method of consensus contract. // For now we just extract the miner list from main chain consensus information, then update miners list. if (input == null || input.Bytes.IsEmpty) { return(new Empty()); } var consensusInformation = DPoSHeaderInformation.Parser.ParseFrom(input.Bytes); // check round number of shared consensus, not term number if (consensusInformation.Round.RoundNumber <= State.RoundNumberFromMainChainField.Value) { return(new Empty()); } Context.LogDebug(() => $"Shared BP of round {consensusInformation.Round.RoundNumber.ToInt64Value()}"); var minersKeys = consensusInformation.Round.RealTimeMinersInformation.Keys; State.RoundNumberFromMainChainField.Value = consensusInformation.Round.RoundNumber; State.CurrentMiners.Value = minersKeys.ToList().ToMiners(); return(new Empty()); }