Exemple #1
0
        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());
        }
Exemple #3
0
        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);
        }