Esempio n. 1
0
        public override ChainInitializationData GetChainInitializationData(SInt32Value chainId)
        {
            var sideChainInfo = State.SideChainInfo[chainId.Value];

            Assert(sideChainInfo != null, "Side chain not found.");
            var res = new ChainInitializationData
            {
                CreationHeightOnParentChain = sideChainInfo.CreationHeightOnParentChain,
                ChainId           = chainId.Value,
                Creator           = sideChainInfo.Proposer,
                CreationTimestamp = sideChainInfo.CreationTimestamp,
                ChainCreatorPrivilegePreserved = sideChainInfo.SideChainCreationRequest.IsPrivilegePreserved
            };
            ByteString consensusInformation = State.SideChainInitialConsensusInfo[chainId.Value].Value;

            res.ExtraInformation.Add(consensusInformation);

            ByteString nativeTokenInformation = GetNativeTokenInfo().ToByteString();

            res.ExtraInformation.Add(nativeTokenInformation);

            ByteString resourceTokenInformation = GetResourceTokenInfo().ToByteString();

            res.ExtraInformation.Add(resourceTokenInformation);

            ByteString sideChainTokenInformation = GetTokenInfo(sideChainInfo.SideChainCreationRequest.SideChainTokenInfo.Symbol)
                                                   .ToByteString();

            res.ExtraInformation.Add(sideChainTokenInformation);
            return(res);
        }
Esempio n. 2
0
        public override Address GetSideChainCreator(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            return(info.Proposer);
        }
        public override Address LockedAddress(SInt32Value input)
        {
            var info = State.SideChainInfos[input.Value];

            Assert(info != null, "Not existed side chain.");
            Assert(info.SideChainStatus != (SideChainStatus)3, "Disposed side chain.");
            return(info.Proposer);
        }
Esempio n. 4
0
        public override Address LockedAddress(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            Assert(info.SideChainStatus != SideChainStatus.Terminated, "Disposed side chain.");
            return(info.Proposer);
        }
Esempio n. 5
0
        public override GetChainStatusOutput GetChainStatus(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            return(new GetChainStatusOutput {
                Status = info.SideChainStatus
            });
        }
        public override SInt64Value GetSideChainHeight(SInt32Value input)
        {
            var height = State.CurrentSideChainHeight[input.Value];

            Assert(height != 0);
            return(new SInt64Value()
            {
                Value = height
            });
        }
        public override SInt32Value GetChainStatus(SInt32Value input)
        {
            var info = State.SideChainInfos[input.Value];

            Assert(info != null, "Not existed side chain.");
            return(new SInt32Value()
            {
                Value = (int)info.SideChainStatus
            });
        }
Esempio n. 8
0
        public override SInt64Value GetSideChainIndexingFeePrice(SInt32Value input)
        {
            var sideChainInfo = State.SideChainInfo[input.Value];

            Assert(sideChainInfo != null, "Side chain not found.");
            return(new SInt64Value
            {
                Value = sideChainInfo.IndexingPrice
            });
        }
Esempio n. 9
0
        public override SInt32Value GetChainStatus(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            return(new SInt32Value()
            {
                Value = (int)info.SideChainStatus
            });
        }
Esempio n. 10
0
        public override SInt64Value GetSideChainBalance(SInt32Value input)
        {
            var chainId       = input.Value;
            var sideChainInfo = State.SideChainInfo[chainId];

            Assert(sideChainInfo != null, "Side chain not found.");
            return(new SInt64Value {
                Value = State.IndexingBalance[chainId]
            });
        }
Esempio n. 11
0
        public override SInt64Value GetSideChainBalance(SInt32Value input)
        {
            var chainId       = input.Value;
            var sideChainInfo = State.SideChainInfo[chainId];

            Assert(sideChainInfo != null, "Side chain not found.");
            Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Unable to check balance.");
            return(new SInt64Value {
                Value = State.IndexingBalance[chainId]
            });
        }
Esempio n. 12
0
        public override SInt64Value LockedToken(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            Assert(info.SideChainStatus != SideChainStatus.Terminated, "Disposed side chain.");
            return(new SInt64Value()
            {
                Value = info.SideChainCreationRequest.LockedTokenAmount
            });
        }
Esempio n. 13
0
        public override SInt64Value GetSideChainHeight(SInt32Value input)
        {
            var info = State.SideChainInfo[input.Value];

            Assert(info != null, "Side chain not found.");
            var height = State.CurrentSideChainHeight[input.Value];

            return(new SInt64Value()
            {
                Value = height
            });
        }
Esempio n. 14
0
        public override SInt64Value LockedBalance(SInt32Value input)
        {
            var chainId       = input.Value;
            var sideChainInfo = State.SideChainInfos[chainId];

            Assert(sideChainInfo != null, "Not existed side chain.");
            Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Unable to check balance.");
            return(new SInt64Value()
            {
                Value = State.IndexingBalance[chainId]
            });
        }
Esempio n. 15
0
        public override Empty SetMaximumMinersCount(SInt32Value input)
        {
            if (State.ParliamentAuthContract.Value == null)
            {
                State.ParliamentAuthContract.Value =
                    Context.GetContractAddressByName(SmartContractConstants.ParliamentAuthContractSystemName);
            }

            var genesisOwnerAddress = State.ParliamentAuthContract.GetGenesisOwnerAddress.Call(new Empty());

            Assert(Context.Sender == genesisOwnerAddress, "No permission to set max miners count.");
            State.MaximumMinersCount.Value = input.Value;
            return(new Empty());
        }
Esempio n. 16
0
        public override Empty WithdrawRequest(SInt32Value input)
        {
            var chainId = input.Value;
            // no need to check authority since invoked in transaction from normal address
            var sideChainInfo = State.SideChainInfos[chainId];

            Assert(sideChainInfo != null &&
                   sideChainInfo.SideChainStatus == SideChainStatus.Review,
                   "Side chain creation request not found.");

            Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Authentication failed.");
            UnlockTokenAndResource(sideChainInfo);
            sideChainInfo.SideChainStatus = SideChainStatus.Terminated;
            State.SideChainInfos[chainId] = sideChainInfo;
            return(new Empty());
        }
Esempio n. 17
0
        /// <summary>
        /// Request form normal address to dispose side chain
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override Hash RequestChainDisposal(SInt32Value input)
        {
            // no need to check authority since invoked in transaction from normal address
            var request = State.SideChainInfos[input.Value];

            Assert(
                request != null && (request.SideChainStatus == SideChainStatus.Active || request.SideChainStatus == SideChainStatus.InsufficientBalance), "Side chain not found");

            Assert(Context.Sender.Equals(request.Proposer), "Not authorized to dispose.");

            // side chain disposal
            Hash proposalHash = Propose(RequestChainCreationWaitingPeriod, Context.Self, nameof(DisposeSideChain),
                                        input);

            return(proposalHash);
        }
Esempio n. 18
0
        public override ChainInitializationContext GetChainInitializationContext(SInt32Value chainId)
        {
            var sideChainInfo = State.SideChainInfos[chainId.Value];

            Assert(sideChainInfo != null, "Side chain Not Found.");
            Assert(sideChainInfo.SideChainStatus > SideChainStatus.Review, "Incorrect side chain status.");
            var res = new ChainInitializationContext
            {
                ParentChainHeightOfCreation = sideChainInfo.ParentChainHeightOfCreation,
                ChainId     = chainId.Value,
                Creator     = sideChainInfo.Proposer,
                CreatedTime = sideChainInfo.CreatedTime
            };
            ByteString consensusInformation = State.SideChainInitialConsensusInfo[chainId.Value].Value;

            res.ExtraInformation.Add(consensusInformation);
            return(res);
        }
        public async Task Disposal_SideChain_NotAuthorized()
        {
            long lockedTokenAmount = 10;

            await InitializeCrossChainContractAsync();
            await ApproveBalanceAsync(lockedTokenAmount);

            var chainId = await InitAndCreateSideChainAsync();

            var disposalInput = new SInt32Value
            {
                Value = chainId
            };

            var ecKeyPair           = CryptoHelper.GenerateKeyPair();
            var other               = Tester.CreateNewContractTester(ecKeyPair);
            var organizationAddress = Address.Parser.ParseFrom((await Tester.ExecuteContractWithMiningAsync(
                                                                    ParliamentAddress,
                                                                    nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.GetGenesisOwnerAddress),
                                                                    new Empty()))
                                                               .ReturnValue);
            var proposal = await other.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                      nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.CreateProposal),
                                                                      new CreateProposalInput
            {
                ContractMethodName  = "DisposeSideChain",
                ExpiredTime         = TimestampHelper.GetUtcNow().AddDays(1),
                Params              = disposalInput.ToByteString(),
                ToAddress           = CrossChainContractAddress,
                OrganizationAddress = organizationAddress
            });

            var proposalId = Hash.Parser.ParseFrom(proposal.ReturnValue);

            await ApproveWithMinersAsync(proposalId);

            var transactionResult = await other.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                               nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.Release), proposalId);

            var status = transactionResult.Status;

            Assert.True(status == TransactionResultStatus.Failed);
            Assert.Contains("Not authorized to dispose.", transactionResult.Error);
        }
Esempio n. 20
0
        /// <summary>
        /// Dispose side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override SInt64Value DisposeSideChain(SInt32Value input)
        {
            AssertSideChainLifetimeControllerAuthority(Context.Sender);

            var chainId = input.Value;
            var info    = State.SideChainInfo[chainId];

            Assert(info != null, "Side chain not found.");
            Assert(info.SideChainStatus != SideChainStatus.Terminated, "Incorrect chain status.");

            UnlockTokenAndResource(info);
            info.SideChainStatus         = SideChainStatus.Terminated;
            State.SideChainInfo[chainId] = info;
            Context.Fire(new Disposed
            {
                ChainId = chainId
            });
            return(new SInt64Value {
                Value = chainId
            });
        }
Esempio n. 21
0
        /// <summary>
        /// Dispose side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override SInt64Value DisposeSideChain(SInt32Value input)
        {
            CheckOwnerAuthority();

            var chainId = input.Value;
            var info    = State.SideChainInfo[chainId];

            Assert(info != null, "Side chain not found.");
            Assert(Context.Origin.Equals(info.Proposer), "No permission.");
            Assert(info.SideChainStatus == SideChainStatus.Active, "Incorrect chain status.");

            UnlockTokenAndResource(info);
            info.SideChainStatus         = SideChainStatus.Terminated;
            State.SideChainInfo[chainId] = info;
            Context.Fire(new Disposed
            {
                ChainId = chainId
            });
            return(new SInt64Value {
                Value = chainId
            });
        }
        protected async Task <Hash> CreateProposal(int chainId, string methodName)
        {
            var createProposalInput = new SInt32Value
            {
                Value = chainId
            };
            var organizationAddress = Address.Parser.ParseFrom((await Tester.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                                                            nameof(ParliamentAuthContract.GetDefaultOrganizationAddress), new Empty())).ReturnValue);
            var proposal = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                       nameof(ParliamentAuthContract.CreateProposal), new CreateProposalInput
            {
                ContractMethodName  = methodName,
                ExpiredTime         = DateTime.UtcNow.AddDays(1).ToTimestamp(),
                Params              = createProposalInput.ToByteString(),
                ToAddress           = CrossChainContractAddress,
                OrganizationAddress = organizationAddress
            });

            var proposalId = Hash.Parser.ParseFrom(proposal.ReturnValue);

            return(proposalId);
        }
Esempio n. 23
0
        /// <summary>
        /// Create side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override SInt32Value CreateSideChain(SInt32Value input)
        {
            var chainId = input.Value;

            // side chain creation should be triggered by organization address from parliament.
            CheckOwnerAuthority();
            var sideChainInfo = State.SideChainInfos[chainId];

            Assert(
                sideChainInfo != null &&
                sideChainInfo.SideChainStatus == SideChainStatus.Review, "Side chain creation request not found.");

            sideChainInfo.SideChainStatus         = SideChainStatus.Active;
            sideChainInfo.CreatedTime             = Timestamp.FromDateTime(Context.CurrentBlockTime);
            State.SideChainInfos[chainId]         = sideChainInfo;
            State.CurrentSideChainHeight[chainId] = 0;

            var initialConsensusInfo = GetCurrentMiners();

            State.SideChainInitialConsensusInfo[chainId] = new BytesValue {
                Value = initialConsensusInfo.ToByteString()
            };
            Context.LogDebug(() => $"Initial miner list for side chain {chainId} :" +
                             string.Join(",",
                                         initialConsensusInfo.MinerList.PublicKeys.Select(p =>
                                                                                          Address.FromPublicKey(ByteArrayHelpers.FromHexString(p)).ToString())));
            Context.LogDebug(() => $"RoundNumber {initialConsensusInfo.RoundNumber}");
            // Event is not used for now.
            Context.Fire(new CreationRequested()
            {
                ChainId = chainId,
                Creator = Context.Sender
            });
            return(new SInt32Value()
            {
                Value = chainId
            });
        }
Esempio n. 24
0
        /// <summary>
        /// Dispose side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override SInt64Value DisposeSideChain(SInt32Value input)
        {
            CheckOwnerAuthority();

            var chainId = input.Value;
            // side chain disposal should be triggered by multi sig txn from system address.
            //CheckAuthority(Context.Genesis);
            var info = State.SideChainInfos[chainId];

            Assert(info != null, "Not existed side chain.");
            Assert(info.SideChainStatus == SideChainStatus.Active || info.SideChainStatus == SideChainStatus.InsufficientBalance, "Unable to dispose this side chain.");

            UnlockTokenAndResource(info);
            info.SideChainStatus          = SideChainStatus.Terminated;
            State.SideChainInfos[chainId] = info;
            Context.Fire(new Disposed()
            {
                ChainId = chainId
            });
            return(new SInt64Value {
                Value = chainId
            });
        }
        public async Task Disposal_SideChain_NotAuthorized()
        {
            long lockedTokenAmount = 10;

            await ApproveBalanceAsync(lockedTokenAmount);

            var chainId = await InitAndCreateSideChainAsync();

            var disposalInput = new SInt32Value
            {
                Value = chainId
            };

            var ecKeyPair = SampleECKeyPairs.KeyPairs[1];
            var parliamentAuthContractStub2 = GetParliamentAuthContractTester(ecKeyPair);
            var organizationAddress         = await ParliamentAuthContractStub.GetDefaultOrganizationAddress.CallAsync(new Empty());

            var proposal = await parliamentAuthContractStub2.CreateProposal.SendAsync(new CreateProposalInput
            {
                ContractMethodName  = "DisposeSideChain",
                ExpiredTime         = TimestampHelper.GetUtcNow().AddDays(1),
                Params              = disposalInput.ToByteString(),
                ToAddress           = CrossChainContractAddress,
                OrganizationAddress = organizationAddress
            });

            var proposalId = Hash.Parser.ParseFrom(proposal.TransactionResult.ReturnValue);

            await ApproveWithMinersAsync(proposalId);

            var res = await parliamentAuthContractStub2.Release.SendWithExceptionAsync(proposalId);

            var status = res.TransactionResult.Status;

            Assert.True(status == TransactionResultStatus.Failed);
            Assert.Contains("No permission.", res.TransactionResult.Error);
        }
Esempio n. 26
0
 private async Task SetMiningInterval(SInt32Value interval)
 {
     await _miningIntervalField.SetAsync(interval.Value);
 }
Esempio n. 27
0
        public override GetSideChainIndexingFeeControllerOutput GetSideChainIndexingFeeController(SInt32Value input)
        {
            var sideChainInfo = State.SideChainInfo[input.Value];
            var proposer      = sideChainInfo.Proposer;

            SetContractStateRequired(State.AssociationContract, SmartContractConstants.AssociationContractSystemName);
            var organizationCreationInput             = GenerateOrganizationInputForIndexingFeePrice(proposer);
            var sideChainIndexingFeeControllerAddress =
                CalculateSideChainIndexingFeeControllerOrganizationAddress(organizationCreationInput);

            return(new GetSideChainIndexingFeeControllerOutput
            {
                AuthorityInfo = new AuthorityInfo
                {
                    OwnerAddress = sideChainIndexingFeeControllerAddress,
                    ContractAddress = State.AssociationContract.Value
                },
                OrganizationCreationInputBytes = organizationCreationInput.ToByteString()
            });
        }
Esempio n. 28
0
 public override CalculateFeeCoefficientsOfType GetCalculateFeeCoefficientOfContract(SInt32Value input)
 {
     return(State.CalculateCoefficientOfContract[(FeeTypeEnum)input.Value]);
 }