private async Task Vote() { _lockTimes = new List <int> { 90, 180, 730 }; _votingRecordList = new List <VotingRecord>(); _candidateLists = await Starter.GenerateCandidatesAsync(3); _voterList = await Starter.GenerateVotersAsync(3); for (int i = 0; i < _voterList.Count; i++) { await Starter.TransferTokenAsync(_voterList[i].GetCallOwnerAddress(), 100000); for (int j = 0; j < _candidateLists.Count; j++) { var txResult = await _voterList[i].Vote(_candidateLists[i].PublicKey, Amount, _lockTimes[j]); txResult.Status.ShouldBe(TransactionResultStatus.Mined); var votingRecord = await _voterList[i].GetVotingRecord(txResult.TransactionId); _votingRecordList.Add(votingRecord); } } await MinerList.RunConsensusAsync(1, true); }
public async Task NextTerm_GetNewConsensusInformation_NewMiners() { const int minersCount = 3; var starter = new ContractTester <DPoSContractTestAElfModule>(); var minersKeyPairs = Enumerable.Range(0, minersCount).Select(_ => CryptoHelpers.GenerateKeyPair()).ToList(); await starter.InitialChainAndTokenAsync(minersKeyPairs); var initialMiners = Enumerable.Range(0, minersCount) .Select(i => starter.CreateNewContractTester(minersKeyPairs[i])).ToList(); var voter = (await starter.GenerateVotersAsync()).AnyOne(); var candidates = await starter.GenerateCandidatesAsync(minersCount); // Vote to candidates. var voteTxs = new List <Transaction>(); foreach (var candidate in candidates) { voteTxs.Add(await voter.GenerateTransactionAsync( starter.GetConsensusContractAddress(), nameof(ConsensusContract.Vote), new VoteInput { CandidatePublicKey = candidate.PublicKey, Amount = 1, LockTime = 100 })); } await initialMiners.MineAsync(voteTxs); await initialMiners.RunConsensusAsync(1, true); // Check term number. { var round = await starter.GetCurrentRoundInformationAsync(); Assert.Equal(2L, round.TermNumber); } // Current term number is 2. So only if the blockchain age is in range (`DaysEachTerm` * 2, `DaysEachTerm` * 3], // can one miner change term to 3rd term. await initialMiners.ProduceNormalBlocks(minersCount, DateTime.UtcNow.AddMinutes(ConsensusDPoSConsts.DaysEachTerm * 2 + 1).ToTimestamp()); var extraBlockMiner = initialMiners.AnyOne(); var timestamp = DateTime.UtcNow.AddMinutes(ConsensusDPoSConsts.DaysEachTerm * 2 + 2); var triggerInformation = GetTriggerInformationForNextTerm(extraBlockMiner.PublicKey); var consensusInformation = await extraBlockMiner.GetInformationToUpdateConsensusAsync(triggerInformation, timestamp); // Term changed. Assert.Equal(3L, consensusInformation.Round.TermNumber); // Miners changed to candidates. var miners = consensusInformation.Round.RealTimeMinersInformation.Keys.ToList().ToMiners(); Assert.Equal(candidates.Select(m => m.PublicKey).ToList().ToMiners().GetMinersHash(), miners.GetMinersHash()); }
public async Task Quit_Election_WithoutAnnounce() { var candidateInfo = TestUserHelper.GenerateNewUser(); await Starter.TransferTokenAsync(candidateInfo, DPoSContractConsts.LockTokenForElection); var balance = await Starter.GetBalanceAsync(candidateInfo); balance.ShouldBe(DPoSContractConsts.LockTokenForElection); await Starter.GenerateCandidatesAsync(1); // Didn't announce election, but call quit announce. candidateInfo = TestUserHelper.GenerateNewUser(); var notCandidate = Starter.CreateNewContractTester(candidateInfo); var result = await notCandidate.QuitElectionAsync(); result.Status.ShouldBe(TransactionResultStatus.Failed); result.Error.Contains(ContractErrorCode.Message[ContractErrorCode.InvalidOperation]).ShouldBeTrue(); balance = await Starter.GetBalanceAsync(candidateInfo); balance.ShouldBe(0L); }