public async Task AEDPoSContract_GenerateConsensusTransaction_NextTerm_Test()
        {
            var usingKeyPair = BootMinerKeyPair;

            KeyPairProvider.SetKeyPair(usingKeyPair);

            //Next term
            {
                var consensusCommand = await AEDPoSContract_GetConsensusCommand_FirstRound_ExtraBlockMiner_Test();

                var nextTermBehavior = new AElfConsensusHint {
                    Behaviour = AElfConsensusBehaviour.NextTerm
                }
                .ToByteString();
                consensusCommand.Hint = nextTermBehavior;
                BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
                {
                    Seconds = AEDPoSContractTestConstants.MiningInterval
                              .Mul(AEDPoSContractTestConstants.InitialMinersCount)
                              .Div(1000)
                });

                var triggerForCommand = TriggerInformationProvider
                                        .GetTriggerInformationForConsensusTransactions(consensusCommand.ToBytesValue());

                var transactionList =
                    await AEDPoSContractStub.GenerateConsensusTransactions.CallAsync(triggerForCommand);

                transactionList.Transactions.Count.ShouldBe(1);
                transactionList.Transactions[0].MethodName.ShouldBe(nameof(AEDPoSContractStub.NextTerm));
            }
        }
        private async Task <Hash> CreateProposalAsync(ECKeyPair proposalKeyPair, Address organizationAddress)
        {
            var createInput = new CreateInput()
            {
                Symbol      = "NEW",
                Decimals    = 2,
                TotalSupply = 10_0000,
                TokenName   = "new token",
                Issuer      = organizationAddress,
                IsBurnable  = true
            };
            var createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Create),
                ToAddress           = TokenContractAddress,
                Params              = createInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                OrganizationAddress = organizationAddress
            };

            ReferendumAuthContractStub = GetReferendumAuthContractTester(proposalKeyPair);
            var proposal = await ReferendumAuthContractStub.CreateProposal.SendAsync(createProposalInput);

            proposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            return(proposal.Output);
        }
        private async Task <ConsensusCommand> AEDPoSContract_GetConsensusCommand_FirstRound_ExtraBlockMiner_Test()
        {
            await AEDPoSContract_FirstRound_SecondMiner_Test();

            var usingKeyPair = BootMinerKeyPair;

            KeyPairProvider.SetKeyPair(usingKeyPair);

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(2).Div(1000)
            });

            var triggerForCommand =
                TriggerInformationProvider.GetTriggerInformationForConsensusCommand(new BytesValue());

            var currentRound = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty());

            var consensusCommand = await AEDPoSContractStub.GetConsensusCommand.CallAsync(triggerForCommand);

            consensusCommand.LimitMillisecondsOfMiningBlock.ShouldBe(AEDPoSContractTestConstants
                                                                     .SmallBlockMiningInterval);
            var hint = new AElfConsensusHint {
                Behaviour = AElfConsensusBehaviour.NextRound
            }
            .ToByteString();

            consensusCommand.Hint.ShouldBe(hint);

            return(consensusCommand);
        }
Example #4
0
        public async Task Election_ChangeVotingOption_With_Expire_Vote_Test()
        {
            var voter      = VoterKeyPairs.First();
            var voteAmount = 100;
            var lockTime   = 120 * 60 * 60 * 24;
            var candidate  = ValidationDataCenterKeyPairs.First();

            await AnnounceElectionAsync(candidate);
            await VoteToCandidate(voter, candidate.PublicKey.ToHex(), lockTime, voteAmount);

            var electionVoteItemId = await ElectionContractStub.GetMinerElectionVotingItemId.CallAsync(new Empty());

            var voteIdOfVoter = await VoteContractStub.GetVotingIds.CallAsync(new GetVotingIdsInput
            {
                Voter        = Address.FromPublicKey(voter.PublicKey),
                VotingItemId = electionVoteItemId
            });

            var voteId = voteIdOfVoter.ActiveVotes[0];

            BlockTimeProvider.SetBlockTime(StartTimestamp.AddSeconds(lockTime + 1));
            var changeOptionRet = await ChangeVoteOption(voter, voteId, candidate.PublicKey.ToHex());

            changeOptionRet.Status.ShouldBe(TransactionResultStatus.Failed);
            changeOptionRet.Error.ShouldContain("This vote already expired");
        }
Example #5
0
        private async Task <TransactionList> AEDPoSContract_GenerateConsensusTransactions_FirstRound_ExtraBlockMiner_Test()
        {
            var usingKeyPair = BootMinerKeyPair;

            KeyPairProvider.SetKeyPair(usingKeyPair);

            var consensusCommand = await AEDPoSContract_GetConsensusCommand_FirstRound_ExtraBlockMiner_Test();

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(AEDPoSContractTestConstants.InitialMinersCount)
                          .Div(1000)
            });

            var triggerForCommand =
                await TriggerInformationProvider
                .GetTriggerInformationForConsensusTransactionsAsync(consensusCommand.ToBytesValue());

            var transactionList = await AEDPoSContractStub.GenerateConsensusTransactions.CallAsync(triggerForCommand);

            transactionList.Transactions.Count.ShouldBe(1);
            transactionList.Transactions[0].MethodName.ShouldBe(nameof(AEDPoSContractStub.NextRound));

            return(transactionList);
        }
        private async Task AEDPoSContract_FirstRound_SecondMiner_Test()
        {
            var transaction =
                (await AEDPoSContract_GenerateConsensusTransactions_FirstRound_SecondMiner_Test()).Transactions.First();

            var usingKeyPair = InitialCoreDataCenterKeyPairs[1];

            KeyPairProvider.SetKeyPair(usingKeyPair);

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(2).Div(1000)
            });

            var updateValueInput = new UpdateValueInput();

            updateValueInput.MergeFrom(transaction.Params);

            var stub = GetAEDPoSContractStub(usingKeyPair);
            await stub.UpdateValue.SendAsync(updateValueInput);

            var currentRound = await stub.GetCurrentRoundInformation.CallAsync(new Empty());

            currentRound.RoundNumber.ShouldBe(1);
            currentRound.RealTimeMinersInformation[usingKeyPair.PublicKey.ToHex()].OutValue.ShouldNotBeNull();
        }
        private async Task <Hash> CreateProposalAsync(ECKeyPair proposalKeyPair, Address organizationAddress)
        {
            var transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Tester,
                Memo   = "Transfer"
            };
            var createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContractStub.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                OrganizationAddress = organizationAddress
            };

            ParliamentAuthContractStub = GetParliamentAuthContractTester(proposalKeyPair);
            var proposal = await ParliamentAuthContractStub.CreateProposal.SendAsync(createProposalInput);

            proposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var proposalCreated = ProposalCreated.Parser.ParseFrom(proposal.TransactionResult.Logs[0].NonIndexed).ProposalId;

            proposal.Output.ShouldBe(proposalCreated);

            return(proposal.Output);
        }
Example #8
0
        public async Task AEDPoSContract_GetInformationToUpdateConsensus_FirstRound_SecondMiner_Test()
        {
            var usingKeyPair = InitialCoreDataCenterKeyPairs[1];

            KeyPairProvider.SetKeyPair(usingKeyPair);

            var consensusCommand = await AEDPoSContract_GetConsensusCommand_FirstRound_SecondMiner_Test();

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(2).Div(1000)
            });

            var triggerForCommand =
                await TriggerInformationProvider
                .GetTriggerInformationForBlockHeaderExtraDataAsync(consensusCommand.ToBytesValue());

            var extraDataBytes = await AEDPoSContractStub.GetConsensusExtraData.CallAsync(triggerForCommand);

            var extraData = extraDataBytes.ToConsensusHeaderInformation();

            extraData.Round.RoundId.ShouldNotBe(0);
            extraData.Round.RoundNumber.ShouldBe(1);
            extraData.Round.RealTimeMinersInformation[usingKeyPair.PublicKey.ToHex()].OutValue
            .ShouldNotBeNull();
        }
Example #9
0
        public async Task AEDPoSContract_GetInformationToUpdateConsensus_FirstRound_ExtraBlockMiner_Test()
        {
            var usingKeyPair = BootMinerKeyPair;

            KeyPairProvider.SetKeyPair(usingKeyPair);

            var consensusCommand = await AEDPoSContract_GetConsensusCommand_FirstRound_ExtraBlockMiner_Test();

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(AEDPoSContractTestConstants.InitialMinersCount)
                          .Div(1000)
            });

            var triggerForCommand =
                await TriggerInformationProvider
                .GetTriggerInformationForBlockHeaderExtraDataAsync(consensusCommand.ToBytesValue());

            var extraDataBytes = await AEDPoSContractStub.GetConsensusExtraData.CallAsync(triggerForCommand);

            var extraData = extraDataBytes.ToConsensusHeaderInformation();

            extraData.Round.RoundId.ShouldNotBe(0);
            extraData.Round.RoundNumber.ShouldBe(2);
        }
Example #10
0
        /// <summary>
        /// Generate encrypted messages and put them to round information.
        /// </summary>
        /// <returns></returns>
        private async Task <Dictionary <string, AElfConsensusTriggerInformation> > GenerateEncryptedMessagesAsync()
        {
            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);

            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 = new AElfConsensusHeaderInformation();
                headerInformation.MergeFrom(
                    (await AEDPoSContractStub.GetConsensusExtraData.CallAsync(triggers[minerInRound.Pubkey]
                                                                              .ToBytesValue())).Value);

                // Update consensus information.
                var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.Pubkey);
                await tester.UpdateValue.SendAsync(toUpdate);
            }

            return(triggers);
        }
Example #11
0
        public async Task GetElectorVoteWithAllRecords_Test()
        {
            var voters = await UserVotesCandidate(2, 500, 100);

            var voterKeyPair = voters[0];
            //without withdraw
            var allRecords = await ElectionContractStub.GetElectorVoteWithAllRecords.CallAsync(new StringValue
            {
                Value = voterKeyPair.PublicKey.ToHex()
            });

            allRecords.ActiveVotingRecords.Count.ShouldBeGreaterThanOrEqualTo(1);
            allRecords.WithdrawnVotingRecordIds.Count.ShouldBe(0);

            //withdraw
            await NextTerm(InitialCoreDataCenterKeyPairs[0]);

            BlockTimeProvider.SetBlockTime(StartTimestamp.AddSeconds(100 * 60 * 60 * 24 + 1));
            var voteId =
                (await ElectionContractStub.GetElectorVote.CallAsync(new StringValue
            {
                Value = voterKeyPair.PublicKey.ToHex()
            })).ActiveVotingRecordIds.First();
            var executionResult = await WithdrawVotes(voterKeyPair, voteId);

            executionResult.Status.ShouldBe(TransactionResultStatus.Mined);

            allRecords = await ElectionContractStub.GetElectorVoteWithAllRecords.CallAsync(new StringValue
            {
                Value = voterKeyPair.PublicKey.ToHex()
            });

            allRecords.WithdrawnVotingRecordIds.Count.ShouldBe(1);
        }
        public async Task <Hash> Create_Proposal()
        {
            _organizationAddress = await Create_Organization();

            _createInput = new CreateInput()
            {
                Symbol      = "NEW",
                Decimals    = 2,
                TotalSupply = 10_0000,
                TokenName   = "new token",
                Issuer      = _organizationAddress,
                IsBurnable  = true
            };
            _createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Create),
                ToAddress           = TokenContractAddress,
                Params              = _createInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2).ToTimestamp(),
                OrganizationAddress = _organizationAddress
            };
            var proposal = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

            proposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            return(proposal.Output);
        }
Example #13
0
        private async Task RunMiningProcess(int roundsCount)
        {
            for (var count = 0; count < roundsCount; count++)
            {
                var currentRound = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty());

                var randomHashes = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount)
                                   .Select(_ => Hash.FromString($"random{count}")).ToList();
                var triggers = Enumerable.Range(0, EconomicContractsTestConstants.InitialCoreDataCenterCount).Select(
                    i =>
                    new AElfConsensusTriggerInformation
                {
                    Pubkey     = ByteString.CopyFrom(InitialCoreDataCenterKeyPairs[i].PublicKey),
                    RandomHash = randomHashes[i]
                }).ToDictionary(t => t.Pubkey.ToHex(), t => t);

                // Exactly one round except extra block time slot.
                foreach (var minerInRound in currentRound.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 tester.GetConsensusExtraData.CallAsync(triggers[minerInRound.Pubkey]
                                                                      .ToBytesValue())).ToConsensusHeaderInformation();

                    // Update consensus information.
                    var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.Pubkey);
                    await tester.UpdateValue.SendAsync(toUpdate);

                    for (var i = 0; i < 8; i++)
                    {
                        await tester.UpdateTinyBlockInformation.SendAsync(new TinyBlockInput
                        {
                            ActualMiningTime = TimestampHelper.GetUtcNow(),
                            RoundId          = currentRound.RoundId
                        });
                    }
                }

                currentRound.GenerateNextRoundInformation(TimestampHelper.GetUtcNow(), BlockchainStartTimestamp,
                                                          out var nextRound);
                await AEDPoSContractStub.NextRound.SendAsync(nextRound);

                for (var i = 0; i < 8; i++)
                {
                    await AEDPoSContractStub.UpdateTinyBlockInformation.SendAsync(new TinyBlockInput
                    {
                        ActualMiningTime = TimestampHelper.GetUtcNow(),
                        RoundId          = currentRound.RoundId
                    });
                }
            }
        }
Example #14
0
        public async Task ElectionContract_Withdraw_Test()
        {
            const int amount   = 1000;
            const int lockTime = 120 * 60 * 60 * 24;

            var candidateKeyPair = ValidationDataCenterKeyPairs[0];

            await AnnounceElectionAsync(candidateKeyPair);

            var voterKeyPair  = VoterKeyPairs[0];
            var beforeBalance = await GetNativeTokenBalance(voterKeyPair.PublicKey);

            // Vote
            {
                var transactionResult =
                    await VoteToCandidate(voterKeyPair, candidateKeyPair.PublicKey.ToHex(), lockTime, amount);

                transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }

            var voteId =
                (await ElectionContractStub.GetElectorVote.CallAsync(new StringInput
            {
                Value = voterKeyPair.PublicKey.ToHex()
            })).ActiveVotingRecordIds.First();

            await NextTerm(InitialCoreDataCenterKeyPairs[0]);

            BlockTimeProvider.SetBlockTime(StartTimestamp.AddSeconds(lockTime + 1));

            // Withdraw
            {
                var executionResult = await WithdrawVotes(voterKeyPair, voteId);

                executionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }

            // Profit
            var voter = GetProfitContractTester(voterKeyPair);
            await voter.ClaimProfits.SendAsync(new ClaimProfitsInput { SchemeId = ProfitItemsIds[ProfitType.CitizenWelfare] });

            // Check ELF token balance
            {
                var balance = await GetNativeTokenBalance(voterKeyPair.PublicKey);

                balance.ShouldBe(beforeBalance);
            }

            // Check VOTE token balance.
            {
                var balance = await GetVoteTokenBalance(voterKeyPair.PublicKey);

                balance.ShouldBe(0);
            }
        }
Example #15
0
        public async Task Approve_Proposal_Failed_Test()
        {
            //not found
            {
                var transactionResult = await AssociationAuthContractStub.Approve.SendWithExceptionAsync(new ApproveInput
                {
                    ProposalId = Hash.FromString("Test")
                });

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            }

            var organizationAddress = await CreateOrganizationAsync();

            var proposalId = await CreateProposalAsync(Reviewer2KeyPair, organizationAddress);

            //not authorize
            {
                AssociationAuthContractStub = GetAssociationAuthContractTester(DefaultSenderKeyPair);
                var transactionResult = await AssociationAuthContractStub.Approve.SendWithExceptionAsync(new ApproveInput
                {
                    ProposalId = proposalId
                });

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            }

            //expired time
            {
                AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer1KeyPair);
                BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
                var error = await AssociationAuthContractStub.Approve.CallWithExceptionAsync(new ApproveInput
                {
                    ProposalId = proposalId
                });

                error.Value.ShouldContain("Invalid proposal.");
            }

            //already exist
            {
                AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer1KeyPair);
                BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(-5));
                var transactionResult1 =
                    await AssociationAuthContractStub.Approve.SendAsync(new ApproveInput { ProposalId = proposalId });

                transactionResult1.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
                transactionResult1.Output.Value.ShouldBe(true);

                var transactionResult2 =
                    await AssociationAuthContractStub.Approve.SendWithExceptionAsync(new ApproveInput { ProposalId = proposalId });

                transactionResult2.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            }
        }
Example #16
0
        public async Task Approve_Proposal_ExpiredTime()
        {
            var proposalId = await Create_Proposal();

            AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer1KeyPair);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var transactionResult = await AssociationAuthContractStub.Approve.CallAsync(new ApproveInput
            {
                ProposalId = proposalId
            });

            transactionResult.Value.ShouldBe(false);
        }
Example #17
0
        public async Task Approve_Proposal_ExpiredTime_Test()
        {
            var organizationAddress = await CreateOrganizationAsync();

            var proposalId = await CreateProposalAsync(Reviewer2KeyPair, organizationAddress);

            AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer1KeyPair);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var error = await AssociationAuthContractStub.Approve.CallWithExceptionAsync(new ApproveInput
            {
                ProposalId = proposalId
            });

            error.Value.ShouldContain("Invalid proposal.");
        }
        public async Task Approve_Proposal_ExpiredTime_Test()
        {
            var organizationAddress = await CreateOrganizationAsync();

            var proposalId = await CreateProposalAsync(DefaultSenderKeyPair, organizationAddress);

            ParliamentAuthContractStub = GetParliamentAuthContractTester(InitialMinersKeyPairs[0]);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var transactionResult = await ParliamentAuthContractStub.Approve.CallAsync(new ApproveInput
            {
                ProposalId = proposalId
            });

            transactionResult.Value.ShouldBe(false);
        }
        public async Task Approve_Proposal_ExpiredTime_Test()
        {
            var organizationAddress = await CreateOrganizationAsync();

            var proposalId = await CreateProposalAsync(DefaultSenderKeyPair, organizationAddress);

            ParliamentAuthContractStub = GetParliamentAuthContractTester(InitialMinersKeyPairs[0]);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var error = await ParliamentAuthContractStub.Approve.CallWithExceptionAsync(new ApproveInput
            {
                ProposalId = proposalId
            });

            error.Value.ShouldContain("Invalid proposal.");
        }
        public async Task Approve_Proposal_ExpiredTime()
        {
            _organizationAddress = await Create_Organization();

            var proposalId = await Create_Proposal();

            ReferendumAuthContractStub = GetReferendumAuthContractTester(SampleECKeyPairs.KeyPairs[1]);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));

            var transactionResult = await ReferendumAuthContractStub.Approve.CallAsync(new ApproveInput
            {
                ProposalId = proposalId
            });

            transactionResult.Value.ShouldBe(false);
        }
Example #21
0
        internal async Task <Dictionary <string, DPoSTriggerInformation> > GenerateEncryptedMessagesTest()
        {
            var firstRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty());

            var randomHashes = Enumerable.Range(0, MinersCount).Select(_ => Hash.Generate()).ToList();
            var triggers     = Enumerable.Range(0, MinersCount).Select(i => new DPoSTriggerInformation
            {
                PublicKey  = ByteString.CopyFrom(InitialMinersKeyPairs[i].PublicKey),
                RandomHash = randomHashes[i]
            }).ToDictionary(t => t.PublicKey.ToHex(), t => t);

            foreach (var minerInRound in firstRound.RealTimeMinersInformation.Values.OrderBy(m => m.Order))
            {
                var currentKeyPair = InitialMinersKeyPairs.First(p => p.PublicKey.ToHex() == minerInRound.PublicKey);

                ECKeyPairProvider.SetECKeyPair(currentKeyPair);

                BlockTimeProvider.SetBlockTime(minerInRound.ExpectedMiningTime.ToDateTime());

                var tester            = GetConsensusContractTester(currentKeyPair);
                var headerInformation =
                    await tester.GetInformationToUpdateConsensus.CallAsync(triggers[minerInRound.PublicKey]);

                var encryptedInValues = headerInformation.Round.RealTimeMinersInformation[minerInRound.PublicKey]
                                        .EncryptedInValues;

                encryptedInValues.Count.ShouldBe(MinersCount - 1);
                foreach (var(key, value) in encryptedInValues)
                {
                    InitialMinersKeyPairs.Select(p => p.PublicKey.ToHex()).ShouldContain(key);
                    value.ShouldNotBeEmpty();
                }

                // Update consensus information.
                var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.PublicKey);
                await tester.UpdateValue.SendAsync(toUpdate);
            }

            var updatedRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty());

            foreach (var minerInRound in updatedRound.RealTimeMinersInformation.Values)
            {
                minerInRound.EncryptedInValues.Count.ShouldBe(MinersCount - 1);
            }

            return(triggers);
        }
Example #22
0
        public async Task DecryptMessage_Test()
        {
            var previousTriggers = await GenerateEncryptedMessagesAsync();

            await BootMinerChangeRoundAsync();

            var currentRound = 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),
                RandomHash         = randomHashes[i],
                PreviousRandomHash = previousTriggers[InitialCoreDataCenterKeyPairs[i].PublicKey.ToHex()].RandomHash
            }).ToDictionary(t => t.Pubkey.ToHex(), t => t);

            // Just `MinimumCount + 1` miners produce blocks.
            foreach (var minerInRound in currentRound.RealTimeMinersInformation.Values.OrderBy(m => m.Order)
                     .Take(MinimumCount + 1))
            {
                var currentKeyPair = InitialCoreDataCenterKeyPairs.First(p => p.PublicKey.ToHex() == minerInRound.Pubkey);

                KeyPairProvider.SetKeyPair(currentKeyPair);

                BlockTimeProvider.SetBlockTime(minerInRound.ExpectedMiningTime);

                var tester            = GetAEDPoSContractStub(currentKeyPair);
                var headerInformation = new AElfConsensusHeaderInformation();
                headerInformation.MergeFrom(
                    (await AEDPoSContractStub.GetInformationToUpdateConsensus.CallAsync(triggers[minerInRound.Pubkey]
                                                                                        .ToBytesValue())).Value);
                // Update consensus information.
                var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.Pubkey);
                await tester.UpdateValue.SendAsync(toUpdate);
            }

            // Won't pass because currently we postpone the revealing of in values to extra block time slot.
            // But in values all filled.
//            var secondRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty());
//            secondRound.RealTimeMinersInformation.Values.Count(v => v.PreviousInValue != null)
//                .ShouldBe(AEDPoSContractTestConstants.InitialMinersCount);
        }
Example #23
0
        internal async Task <TransactionList> AEDPoSContract_GenerateConsensusTransactions_FirstRound_BootMiner()
        {
            var consensusCommand = await AEDPoSContract_GetConsensusCommand_FirstRound_BootMiner_Test();

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Div(1000)
            });

            var triggerForCommand =
                await TriggerInformationProvider
                .GetTriggerInformationForConsensusTransactionsAsync(consensusCommand.ToBytesValue());

            var transactionList = await AEDPoSContractStub.GenerateConsensusTransactions.CallAsync(triggerForCommand);

            transactionList.Transactions.Count.ShouldBe(1);
            transactionList.Transactions[0].MethodName.ShouldBe(nameof(AEDPoSContractStub.UpdateValue));

            return(transactionList);
        }
Example #24
0
        public async Task Update_TinyBlockInformation_Test()
        {
            await AEDPoSContract_FirstRound_BootMiner_Test();

            var roundInfo = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty());

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Div(1000)
            });
            var input = new TinyBlockInput
            {
                RoundId          = roundInfo.RoundId,
                ProducedBlocks   = 4,
                ActualMiningTime = BlockTimeProvider.GetBlockTime()
            };
            var transactionResult = await AEDPoSContractStub.UpdateTinyBlockInformation.SendAsync(input);

            transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
        }
        public async Task Approve_Proposal_ExpiredTime_Test()
        {
            await InitializeParliamentContracts();

            var minimalApprovalThreshold   = 6667;
            var maximalAbstentionThreshold = 2000;
            var maximalRejectionThreshold  = 3000;
            var minimalVoteThreshold       = 8000;
            var organizationAddress        = await CreateOrganizationAsync(minimalApprovalThreshold,
                                                                           maximalAbstentionThreshold, maximalRejectionThreshold, minimalVoteThreshold);

            var proposalId = await CreateProposalAsync(DefaultSenderKeyPair, organizationAddress);

            var parliamentContractStub = GetParliamentContractTester(InitialMinersKeyPairs[0]);

            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var error = await parliamentContractStub.Approve.CallWithExceptionAsync(proposalId);

            error.Value.ShouldContain("Invalid proposal.");
        }
Example #26
0
        protected async Task NextTerm(ECKeyPair keyPair)
        {
            var miner = GetConsensusContractTester(keyPair);
            var round = await miner.GetCurrentRoundInformation.CallAsync(new Empty());

            var victories = await ElectionContractStub.GetVictories.CallAsync(new Empty());

            var miners = new MinerList
            {
                Pubkeys =
                {
                    victories.Value
                }
            };
            var firstRoundOfNextTerm =
                miners.GenerateFirstRoundOfNewTerm(EconomicContractsTestConstants.MiningInterval,
                                                   BlockTimeProvider.GetBlockTime(), round.RoundNumber, round.TermNumber);
            var executionResult = (await miner.NextTerm.SendAsync(firstRoundOfNextTerm)).TransactionResult;

            executionResult.Status.ShouldBe(TransactionResultStatus.Mined);
        }
Example #27
0
        public async Task AEDPoSContract_FirstRound_Terminate_Test()
        {
            var transaction =
                (await AEDPoSContract_GenerateConsensusTransactions_FirstRound_ExtraBlockMiner_Test()).Transactions.First();

            BlockTimeProvider.SetBlockTime(BlockchainStartTimestamp + new Duration
            {
                Seconds = AEDPoSContractTestConstants.MiningInterval.Mul(AEDPoSContractTestConstants.InitialMinersCount)
                          .Div(1000)
            });

            var nextRound = new Round();

            nextRound.MergeFrom(transaction.Params);

            await AEDPoSContractStub.NextRound.SendAsync(nextRound);

            var currentRound = await AEDPoSContractStub.GetCurrentRoundInformation.CallAsync(new Empty());

            currentRound.RoundNumber.ShouldBe(2);
        }
Example #28
0
        public async Task DecryptMessageTest()
        {
            var previousTriggers = await GenerateEncryptedMessagesTest();

            await BootMinerChangeRoundAsync();

            var currentRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty());

            var randomHashes = Enumerable.Range(0, MinersCount).Select(_ => Hash.Generate()).ToList();
            var triggers     = Enumerable.Range(0, MinersCount).Select(i => new DPoSTriggerInformation
            {
                PublicKey          = ByteString.CopyFrom(InitialMinersKeyPairs[i].PublicKey),
                RandomHash         = randomHashes[i],
                PreviousRandomHash = previousTriggers[InitialMinersKeyPairs[i].PublicKey.ToHex()].RandomHash
            }).ToDictionary(t => t.PublicKey.ToHex(), t => t);

            // Just `MinimumCount + 1` miners produce blocks.
            foreach (var minerInRound in currentRound.RealTimeMinersInformation.Values.OrderBy(m => m.Order)
                     .Take(MinimumCount + 1))
            {
                var currentKeyPair = InitialMinersKeyPairs.First(p => p.PublicKey.ToHex() == minerInRound.PublicKey);

                ECKeyPairProvider.SetECKeyPair(currentKeyPair);

                BlockTimeProvider.SetBlockTime(minerInRound.ExpectedMiningTime.ToDateTime());

                var tester            = GetConsensusContractTester(currentKeyPair);
                var headerInformation =
                    await tester.GetInformationToUpdateConsensus.CallAsync(triggers[minerInRound.PublicKey]);

                // Update consensus information.
                var toUpdate = headerInformation.Round.ExtractInformationToUpdateConsensus(minerInRound.PublicKey);
                await tester.UpdateValue.SendAsync(toUpdate);
            }

            // But in values all filled.
            var secondRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty());

            secondRound.RealTimeMinersInformation.Values.Count(v => v.PreviousInValue != null).ShouldBe(MinersCount);
        }
        public async Task <Hash> Create_Proposal(Address organizationAddress)
        {
            _transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Tester,
                Memo   = "Transfer"
            };
            _createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = _transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2).ToTimestamp(),
                OrganizationAddress = organizationAddress
            };
            var proposal = await ParliamentAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

            proposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            return(proposal.Output);
        }
Example #30
0
        private async Task <Hash> CreateProposalAsync(ECKeyPair proposalKeyPair, Address organizationAddress)
        {
            var transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Reviewer1,
                Memo   = "Transfer"
            };

            AssociationAuthContractStub = GetAssociationAuthContractTester(proposalKeyPair);
            var createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                OrganizationAddress = organizationAddress
            };
            var proposal = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

            return(proposal.Output);
        }