public async Task SetMaximumMinersCountTest(int targetMinersCount) { await BlockMiningService.MineBlockToNextTermAsync(); InitialAcs3Stubs(); await ParliamentStubs.First().Initialize.SendAsync(new Parliament.InitializeInput()); var defaultOrganizationAddress = await ParliamentStubs.First().GetDefaultOrganizationAddress.CallAsync(new Empty()); await ParliamentReachAnAgreementAsync(new CreateProposalInput { ToAddress = ContractAddresses[ConsensusSmartContractAddressNameProvider.Name], ContractMethodName = nameof(ConsensusStub.SetMaximumMinersCount), Params = new Int32Value { Value = targetMinersCount }.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = defaultOrganizationAddress }); { var currentMinersCount = (await ConsensusStub.GetCurrentMinerList.CallAsync(new Empty())).Pubkeys.Count; currentMinersCount.ShouldBe(5); var currentTermNumber = await BlockMiningService.MineBlockToNextTermAsync(); currentTermNumber.ShouldBe(3); } { var currentMinersCount = (await ConsensusStub.GetCurrentMinerList.CallAsync(new Empty())).Pubkeys.Count; currentMinersCount.ShouldBe(Math.Min(targetMinersCount, 5)); var currentTermNumber = await BlockMiningService.MineBlockToNextTermAsync(); currentTermNumber.ShouldBe(4); } }
private async Task InitialTokenContract(bool issueToken = true) { if (!ParliamentStubs.Any()) { InitialAcs3Stubs(); } await ParliamentStubs.First().Initialize.SendAsync(new Parliament.InitializeInput { }); var defaultOrganizationAddress = await ParliamentStubs.First().GetDefaultOrganizationAddress.CallAsync(new Empty()); await CreateToken( GetRequiredService <IOptionsSnapshot <HostSmartContractBridgeContextOptions> >().Value .ContextVariables[ContextVariableDictionary.NativeSymbolName], ResourceSupply, true); await ParliamentReachAnAgreementAsync(new CreateProposalInput { ToAddress = ContractAddresses[TokenSmartContractAddressNameProvider.Name], ContractMethodName = nameof(TokenContractImplContainer.TokenContractImplStub.InitializeFromParentChain), Params = new InitializeFromParentChainInput() { ResourceAmount = { { "CPU", CpuAmount }, { "RAM", RamAmount }, { "DISK", DiskAmount }, { "NET", NetAmount } }, Creator = Creator }.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = defaultOrganizationAddress }); var updateRentalInput = new UpdateRentalInput { Rental = { { "CPU", Rental }, { "RAM", Rental }, { "DISK", Rental }, { "NET", Rental }, } }; var sideCreator = Address.FromPublicKey(SampleECKeyPairs.KeyPairs[0].PublicKey); var parliamentOrgAddress = defaultOrganizationAddress; var twoProposers = new List <Address> { parliamentOrgAddress, sideCreator }; var createOrganizationInput2 = new CreateOrganizationInput { ProposerWhiteList = new ProposerWhiteList { Proposers = { twoProposers } }, OrganizationMemberList = new OrganizationMemberList { OrganizationMembers = { twoProposers } }, ProposalReleaseThreshold = new ProposalReleaseThreshold { MinimalApprovalThreshold = twoProposers.Count, MinimalVoteThreshold = twoProposers.Count, MaximalRejectionThreshold = 0, MaximalAbstentionThreshold = 0 } }; var associationAddressRet = await AssociationStub.CreateOrganization.SendAsync(createOrganizationInput2); var associationAddress = new Address(); associationAddress.MergeFrom(associationAddressRet.TransactionResult.ReturnValue); var toAssociationProposal = new CreateProposalInput { ToAddress = ContractAddresses[TokenSmartContractAddressNameProvider.Name], ContractMethodName = nameof(TokenContractImplContainer.TokenContractImplStub.UpdateRental), Params = updateRentalInput.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = associationAddress }; var associationProposalRet = (await AssociationStub.CreateProposal.SendAsync(toAssociationProposal)).TransactionResult; var associationProposalId = new Hash(); associationProposalId.MergeFrom(associationProposalRet.ReturnValue); await ParliamentReachAnAgreementAsync(new CreateProposalInput { ToAddress = ContractAddresses[AssociationSmartContractAddressNameProvider.Name], ContractMethodName = nameof(AssociationContractContainer.AssociationContractStub.Approve), Params = associationProposalId.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = parliamentOrgAddress }); await AssociationStub.Approve.SendAsync(associationProposalId); await AssociationStub.Release.SendAsync(associationProposalId); await CreateToken("CPU", ResourceSupply, issueToken); await CreateToken("RAM", ResourceSupply, issueToken); await CreateToken("DISK", ResourceSupply, issueToken); await CreateToken("NET", ResourceSupply, issueToken); }
public async Task Authorization_Transfer_Success() { await InitialTokenContract(); var defaultOrganizationAddress = await ParliamentStubs.First().GetDefaultOrganizationAddress.CallAsync(new Empty()); var newParliament = new Parliament.CreateOrganizationInput { ProposerAuthorityRequired = false, ProposalReleaseThreshold = new ProposalReleaseThreshold { MaximalAbstentionThreshold = 1, MaximalRejectionThreshold = 1, MinimalApprovalThreshold = 1, MinimalVoteThreshold = 1 }, ParliamentMemberProposingAllowed = false }; var parliamentStub = ParliamentStubs.First(); var createNewParliamentRet = await parliamentStub.CreateOrganization.SendAsync(newParliament); var newParliamentAddress = new Address(); newParliamentAddress.MergeFrom(createNewParliamentRet.TransactionResult.ReturnValue); var authority = new Acs1.AuthorityInfo { ContractAddress = ContractAddresses[ParliamentSmartContractAddressNameProvider.Name], OwnerAddress = newParliamentAddress }; var sideCreator = Address.FromPublicKey(SampleECKeyPairs.KeyPairs[0].PublicKey); var parliamentOrgAddress = defaultOrganizationAddress; var twoProposers = new List <Address> { parliamentOrgAddress, sideCreator }; var createOrganizationInput2 = new CreateOrganizationInput { ProposerWhiteList = new ProposerWhiteList { Proposers = { twoProposers } }, OrganizationMemberList = new OrganizationMemberList { OrganizationMembers = { twoProposers } }, ProposalReleaseThreshold = new ProposalReleaseThreshold { MinimalApprovalThreshold = twoProposers.Count, MinimalVoteThreshold = twoProposers.Count, MaximalRejectionThreshold = 0, MaximalAbstentionThreshold = 0 } }; var associationAddressRet = (await AssociationStub.CreateOrganization.SendAsync(createOrganizationInput2)).TransactionResult; var associationAddress = new Address(); associationAddress.MergeFrom(associationAddressRet.ReturnValue); var toAssociationProposal = new CreateProposalInput { ToAddress = ContractAddresses[TokenSmartContractAddressNameProvider.Name], // ContractMethodName = nameof(TokenContractContainer.TokenContractStub.ChangeSideChainParliamentController), ContractMethodName = nameof(TokenContractImplContainer.TokenContractImplStub.ChangeSideChainParliamentController), Params = authority.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = associationAddress }; var associationProposalRet = (await AssociationStub.CreateProposal.SendAsync(toAssociationProposal)).TransactionResult; var associationProposalId = new Hash(); associationProposalId.MergeFrom(associationProposalRet.ReturnValue); await ParliamentReachAnAgreementAsync(new CreateProposalInput { ToAddress = ContractAddresses[AssociationSmartContractAddressNameProvider.Name], ContractMethodName = nameof(AssociationContractContainer.AssociationContractStub.Approve), Params = associationProposalId.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = parliamentOrgAddress }); await AssociationStub.Approve.SendAsync(associationProposalId); await AssociationStub.Release.SendAsync(associationProposalId); twoProposers = new List <Address> { newParliamentAddress, sideCreator }; createOrganizationInput2 = new CreateOrganizationInput { ProposerWhiteList = new ProposerWhiteList { Proposers = { twoProposers } }, OrganizationMemberList = new OrganizationMemberList { OrganizationMembers = { twoProposers } }, ProposalReleaseThreshold = new ProposalReleaseThreshold { MinimalApprovalThreshold = twoProposers.Count, MinimalVoteThreshold = twoProposers.Count, MaximalRejectionThreshold = 0, MaximalAbstentionThreshold = 0 } }; associationAddressRet = (await AssociationStub.CreateOrganization.SendAsync(createOrganizationInput2)).TransactionResult; associationAddress = new Address(); associationAddress.MergeFrom(associationAddressRet.ReturnValue); var updateParam = new UpdateRentedResourcesInput(); var symbolDic = new Dictionary <string, int> { ["CPU"] = 101 }; updateParam.ResourceAmount.Add(symbolDic); toAssociationProposal = new CreateProposalInput { ToAddress = ContractAddresses[TokenSmartContractAddressNameProvider.Name], ContractMethodName = nameof(TokenContractImplContainer.TokenContractImplStub.UpdateRentedResources), Params = updateParam.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = associationAddress }; associationProposalRet = (await AssociationStub.CreateProposal.SendAsync(toAssociationProposal)).TransactionResult; associationProposalId = new Hash(); associationProposalId.MergeFrom(associationProposalRet.ReturnValue); await ParliamentReachAnAgreementAsync(new CreateProposalInput { ToAddress = ContractAddresses[AssociationSmartContractAddressNameProvider.Name], ContractMethodName = nameof(AssociationContractContainer.AssociationContractStub.Approve), Params = associationProposalId.ToByteString(), ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), OrganizationAddress = newParliamentAddress }); await AssociationStub.Approve.SendAsync(associationProposalId); await AssociationStub.Release.SendAsync(associationProposalId); var resourceUsage = await TokenStub.GetResourceUsage.CallAsync(new Empty()); resourceUsage.Value["CPU"].ShouldBe(101); }