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); }
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 Get_Organization_Test() { await InitializeParliamentContracts(); var minimalApprovalThreshold = 10000 / MinersCount; var maximalAbstentionThreshold = 2000 / MinersCount; var maximalRejectionThreshold = 3000 / MinersCount; var minimalVoteThreshold = 11000 / MinersCount; var createOrganizationInput = new CreateOrganizationInput { ProposalReleaseThreshold = new ProposalReleaseThreshold { MinimalApprovalThreshold = minimalApprovalThreshold, MaximalAbstentionThreshold = maximalAbstentionThreshold, MaximalRejectionThreshold = maximalRejectionThreshold, MinimalVoteThreshold = minimalVoteThreshold } }; var minerParliamentContractStub = GetParliamentContractTester(InitialMinersKeyPairs.First()); var transactionResult = await minerParliamentContractStub.CreateOrganization.SendAsync(createOrganizationInput); var organizationCalculated = ParliamentContractStub.CalculateOrganizationAddress .CallAsync(createOrganizationInput).Result; var organizationAddress = transactionResult.Output; organizationCalculated.ShouldBe(organizationAddress); var getOrganization = await ParliamentContractStub.GetOrganization.CallAsync(organizationAddress); getOrganization.OrganizationAddress.ShouldBe(organizationAddress); getOrganization.ProposalReleaseThreshold.MinimalApprovalThreshold.ShouldBe(minimalApprovalThreshold); getOrganization.ProposalReleaseThreshold.MinimalVoteThreshold.ShouldBe(minimalVoteThreshold); getOrganization.ProposalReleaseThreshold.MaximalAbstentionThreshold.ShouldBe(maximalAbstentionThreshold); getOrganization.ProposalReleaseThreshold.MaximalRejectionThreshold.ShouldBe(maximalRejectionThreshold); getOrganization.OrganizationHash.ShouldBe(Hash.FromMessage(createOrganizationInput)); }
public async Task Normal_Round_First_Miner_Test() { await BootMinerChangeRoundAsync(); // Check second round information. var secondRound = await BootMiner.GetCurrentRoundInformation.CallAsync(new Empty()); secondRound.RoundNumber.ShouldBe(2); var firstMinerInSecondRound = secondRound.RealTimeMinersInformation.Values.First(m => m.Order == 1).PublicKey; var secondRoundStartTime = BlockchainStartTime.GetRoundExpectedStartTime(secondRound.TotalMilliseconds(MiningInterval), 2); var minerKeyPair = InitialMinersKeyPairs.First(k => k.PublicKey.ToHex() == firstMinerInSecondRound); var miner = GetConsensusContractTester(minerKeyPair); var expectedMiningTime = secondRound.RealTimeMinersInformation[minerKeyPair.PublicKey.ToHex()] .ExpectedMiningTime.ToDateTime(); // Normal block { // Set current time as the start time of 2rd round. BlockTimeProvider.SetBlockTime(secondRoundStartTime); var leftMilliseconds = (int)(expectedMiningTime - secondRoundStartTime).TotalMilliseconds; var command = await miner.GetConsensusCommand.CallAsync(new CommandInput { PublicKey = ByteString.CopyFrom(minerKeyPair.PublicKey) }); command.NextBlockMiningLeftMilliseconds.ShouldBe(leftMilliseconds); command.LimitMillisecondsOfMiningBlock.ShouldBe(MiningInterval); command.Hint.ShouldBe(new DPoSHint { Behaviour = DPoSBehaviour.UpdateValue } .ToByteArray()); } // Extra block { // Pretend the miner passed his time slot. var fakeTime = expectedMiningTime.AddMilliseconds(MiningInterval); BlockTimeProvider.SetBlockTime(fakeTime); var extraBlockMiningTime = secondRound.GetExpectedEndTime().ToDateTime().AddMilliseconds(MiningInterval); var leftMilliseconds = (int)(extraBlockMiningTime - fakeTime).TotalMilliseconds; var command = await miner.GetConsensusCommand.CallAsync(new CommandInput { PublicKey = ByteString.CopyFrom(minerKeyPair.PublicKey) }); if (secondRound.GetExtraBlockProducerInformation().PublicKey == minerKeyPair.PublicKey.ToHex()) { // If this node is EBP command.NextBlockMiningLeftMilliseconds.ShouldBe( (int)(secondRound.GetExtraBlockMiningTime() - fakeTime).TotalMilliseconds); } else { command.NextBlockMiningLeftMilliseconds.ShouldBe(leftMilliseconds); } command.LimitMillisecondsOfMiningBlock.ShouldBe(MiningInterval); command.Hint.ShouldBe(new DPoSHint { Behaviour = DPoSBehaviour.NextRound } .ToByteArray()); } }