public async Task AEDPoSContract_ChangeMinersCount_Test() { const int termIntervalMin = 31536000 / 60; var maxCount = ValidationDataCenterKeyPairs.Count; await InitializeCandidates(maxCount); var firstRound = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty()); var randomHashes = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount) .Select(_ => Hash.FromString("randomHashes")).ToList(); var triggers = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount).Select(i => new AElfConsensusTriggerInformation { Pubkey = ByteString.CopyFrom(InitialCoreDataCenterKeyPairs[i].PublicKey), InValue = randomHashes[i] }).ToDictionary(t => t.Pubkey.ToHex(), t => t); var voter = GetElectionContractTester(VoterKeyPairs[0]); foreach (var candidateKeyPair in ValidationDataCenterKeyPairs) { var voteResult = await voter.Vote.SendAsync(new VoteMinerInput { CandidatePubkey = candidateKeyPair.PublicKey.ToHex(), Amount = 10 + new Random().Next(1, 10), EndTimestamp = TimestampHelper.GetUtcNow().AddDays(100) }); voteResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined); } foreach (var minerInRound in firstRound.RealTimeMinersInformation.Values.OrderBy(m => m.Order)) { var currentKeyPair = InitialCoreDataCenterKeyPairs.First(p => p.PublicKey.ToHex() == minerInRound.Pubkey); KeyPairProvider.SetKeyPair(currentKeyPair); BlockTimeProvider.SetBlockTime(minerInRound.ExpectedMiningTime); var tester = GetAEDPoSContractStub(currentKeyPair); var headerInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync(triggers[minerInRound.Pubkey] .ToBytesValue())).ToConsensusHeaderInformation(); // Update consensus information. var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.Pubkey); await tester.UpdateValue.SendAsync(toUpdate); } var changeTermTime = BlockchainStartTimestamp.ToDateTime(); BlockTimeProvider.SetBlockTime(changeTermTime.ToTimestamp()); var nextTermInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.NextRound, Pubkey = ByteString.CopyFrom(BootMinerKeyPair.PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation(); await AEDPoSContractStub.NextRound.SendAsync(nextTermInformation.Round); changeTermTime = BlockchainStartTimestamp.ToDateTime().AddMinutes(termIntervalMin).AddSeconds(10); BlockTimeProvider.SetBlockTime(changeTermTime.ToTimestamp()); nextTermInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.NextTerm, Pubkey = ByteString.CopyFrom(BootMinerKeyPair.PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation(); var transactionResult = await AEDPoSContractStub.NextTerm.SendAsync(nextTermInformation.Round); transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined); var newMinerStub = GetAEDPoSContractStub(ValidationDataCenterKeyPairs[0]); var termCount = 0; var minerCount = 0; while (minerCount < maxCount) { var currentRound = await newMinerStub.GetCurrentRoundInformation.CallAsync(new Empty()); var firstPubKey = currentRound.RealTimeMinersInformation.Keys.First(); newMinerStub = GetAEDPoSContractStub(ValidationDataCenterKeyPairs.First(o => o.PublicKey.ToHex() == firstPubKey)); minerCount = currentRound.RealTimeMinersInformation.Count; Assert.Equal(AEDPoSContractTestConstants.SupposedMinersCount.Add(termCount.Mul(2)), minerCount); changeTermTime = BlockchainStartTimestamp.ToDateTime() .AddMinutes((termCount + 2).Mul(termIntervalMin)).AddSeconds(10); BlockTimeProvider.SetBlockTime(changeTermTime.ToTimestamp()); var nextRoundInformation = (await newMinerStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.NextTerm, Pubkey = currentRound.RealTimeMinersInformation.ElementAt(0).Value.Pubkey.ToByteString() }.ToBytesValue())).ToConsensusHeaderInformation(); await newMinerStub.NextTerm.SendAsync(nextRoundInformation.Round); termCount++; } }
public async Task Candidates_NotEnough_Test() { //await ElectionContractStub.RegisterElectionVotingEvent.SendAsync(new Empty()); //await InitializeVoters(); await InitializeCandidates(EconomicContractsTestConstants.InitialCoreDataCenterCount); var firstRound = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty()); var randomHashes = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount) .Select(_ => Hash.FromString("hash3")).ToList(); var triggers = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount).Select(i => new AElfConsensusTriggerInformation { Pubkey = ByteString.CopyFrom(InitialCoreDataCenterKeyPairs[i].PublicKey), InValue = randomHashes[i] }).ToDictionary(t => t.Pubkey.ToHex(), t => t); var voter = GetElectionContractTester(VoterKeyPairs[0]); foreach (var candidateKeyPair in ValidationDataCenterKeyPairs.Take(EconomicContractsTestConstants .InitialCoreDataCenterCount)) { await voter.Vote.SendAsync(new VoteMinerInput { CandidatePubkey = candidateKeyPair.PublicKey.ToHex(), Amount = 100 + new Random().Next(1, 200), EndTimestamp = TimestampHelper.GetUtcNow().AddDays(100) }); } foreach (var minerInRound in firstRound.RealTimeMinersInformation.Values.OrderBy(m => m.Order)) { var currentKeyPair = InitialCoreDataCenterKeyPairs.First(p => p.PublicKey.ToHex() == minerInRound.Pubkey); KeyPairProvider.SetKeyPair(currentKeyPair); BlockTimeProvider.SetBlockTime(minerInRound.ExpectedMiningTime); var tester = GetAEDPoSContractStub(currentKeyPair); var headerInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync(triggers[minerInRound.Pubkey] .ToBytesValue())).ToConsensusHeaderInformation(); // Update consensus information. var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.Pubkey); await tester.UpdateValue.SendAsync(toUpdate); } var changeTermTime = BlockchainStartTimestamp.ToDateTime() .AddMinutes(AEDPoSContractTestConstants.TimeEachTerm + 1); BlockTimeProvider.SetBlockTime(changeTermTime.ToTimestamp()); var nextTermInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.NextTerm, Pubkey = ByteString.CopyFrom(BootMinerKeyPair.PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation(); await AEDPoSContractStub.NextTerm.SendAsync(nextTermInformation.Round); // First candidate cheat others with in value. var oneCandidate = GetAEDPoSContractStub(ValidationDataCenterKeyPairs[0]); var anotherCandidate = GetAEDPoSContractStub(ValidationDataCenterKeyPairs[1]); var randomHash = Hash.FromString("hash5"); var informationOfSecondRound = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.UpdateValue, PreviousInValue = Hash.Empty, InValue = randomHash, Pubkey = ByteString.CopyFrom(ValidationDataCenterKeyPairs[0].PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation(); var updateResult = await oneCandidate.UpdateValue.SendAsync( informationOfSecondRound.Round.ExtractInformationToUpdateConsensus(ValidationDataCenterKeyPairs[0] .PublicKey.ToHex())); var thirdRoundStartTime = changeTermTime.AddMinutes(AEDPoSContractTestConstants.TimeEachTerm + 2); BlockTimeProvider.SetBlockTime(thirdRoundStartTime.ToTimestamp()); var thirdRound = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.NextRound, Pubkey = ByteString.CopyFrom(ValidationDataCenterKeyPairs[0].PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation().Round; await oneCandidate.NextRound.SendAsync(thirdRound); var cheatInformation = (await AEDPoSContractStub.GetConsensusExtraData.CallAsync( new AElfConsensusTriggerInformation { Behaviour = AElfConsensusBehaviour.UpdateValue, PreviousInValue = Hash.FromMessage(randomHash), // Not same as before. InValue = Hash.FromString("InValue"), // Don't care this value in current test case. Pubkey = ByteString.CopyFrom(ValidationDataCenterKeyPairs[0].PublicKey) }.ToBytesValue())).ToConsensusHeaderInformation(); await oneCandidate.UpdateValue.SendAsync( cheatInformation.Round.ExtractInformationToUpdateConsensus(ValidationDataCenterKeyPairs[0].PublicKey .ToHex())); }