コード例 #1
0
        /// <summary>
        /// Create side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override Int32Value CreateSideChain(CreateSideChainInput input)
        {
            // side chain creation should be triggered by organization address.
            AssertSideChainLifetimeControllerAuthority(Context.Sender);

            var proposedSideChainCreationRequestState = State.ProposedSideChainCreationRequestState[input.Proposer];

            State.ProposedSideChainCreationRequestState.Remove(input.Proposer);
            var sideChainCreationRequest = input.SideChainCreationRequest;

            Assert(
                proposedSideChainCreationRequestState != null &&
                proposedSideChainCreationRequestState.SideChainCreationRequest.Equals(sideChainCreationRequest),
                "Side chain creation failed without proposed data.");
            AssertValidSideChainCreationRequest(sideChainCreationRequest, input.Proposer);

            State.SideChainSerialNumber.Value = State.SideChainSerialNumber.Value.Add(1);
            var serialNumber = State.SideChainSerialNumber.Value;
            var chainId      = GetChainId(serialNumber);

            State.AcceptedSideChainCreationRequest[chainId] = sideChainCreationRequest;

            // lock token
            ChargeSideChainIndexingFee(input.Proposer, sideChainCreationRequest.LockedTokenAmount, chainId);
            CreateSideChainToken(sideChainCreationRequest, chainId, input.Proposer);

            var sideChainInfo = new SideChainInfo
            {
                Proposer                    = input.Proposer,
                SideChainId                 = chainId,
                SideChainStatus             = SideChainStatus.Active,
                IndexingPrice               = sideChainCreationRequest.IndexingPrice,
                IsPrivilegePreserved        = sideChainCreationRequest.IsPrivilegePreserved,
                CreationTimestamp           = Context.CurrentBlockTime,
                CreationHeightOnParentChain = Context.CurrentHeight
            };

            State.SideChainInfo[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.Pubkeys));

            CreateOrganizationForIndexingFeePriceAdjustment(input.Proposer);
            Context.Fire(new SideChainCreatedEvent
            {
                ChainId = chainId,
                Creator = input.Proposer
            });
            return(new Int32Value {
                Value = chainId
            });
        }
コード例 #2
0
        /// <summary>
        /// Create side chain. It is a proposal result from system address.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override Int32Value CreateSideChain(CreateSideChainInput input)
        {
            // side chain creation should be triggered by organization address.
            AssertSideChainLifetimeControllerAuthority(Context.Sender);

            var proposedSideChainCreationRequestState = State.ProposedSideChainCreationRequestState[input.Proposer];

            State.ProposedSideChainCreationRequestState.Remove(input.Proposer);
            var sideChainCreationRequest = input.SideChainCreationRequest;

            Assert(
                proposedSideChainCreationRequestState != null &&
                proposedSideChainCreationRequestState.SideChainCreationRequest.Equals(sideChainCreationRequest),
                "Side chain creation failed without proposed data.");
            AssertValidSideChainCreationRequest(sideChainCreationRequest, input.Proposer);

            State.SideChainSerialNumber.Value = State.SideChainSerialNumber.Value.Add(1);
            var serialNumber = State.SideChainSerialNumber.Value;
            var chainId      = GetChainId(serialNumber);

            State.AcceptedSideChainCreationRequest[chainId] = sideChainCreationRequest;

            // lock token
            ChargeSideChainIndexingFee(input.Proposer, sideChainCreationRequest.LockedTokenAmount, chainId);

            var sideChainInfo = new SideChainInfo
            {
                Proposer                    = input.Proposer,
                SideChainId                 = chainId,
                SideChainStatus             = SideChainStatus.Active,
                IndexingPrice               = sideChainCreationRequest.IndexingPrice,
                IsPrivilegePreserved        = sideChainCreationRequest.IsPrivilegePreserved,
                CreationTimestamp           = Context.CurrentBlockTime,
                CreationHeightOnParentChain = Context.CurrentHeight,
                IndexingFeeController       = CreateDefaultOrganizationForIndexingFeePriceManagement(input.Proposer)
            };

            State.SideChainInfo[chainId]          = sideChainInfo;
            State.CurrentSideChainHeight[chainId] = 0;

            var chainInitializationData =
                GetChainInitializationData(sideChainInfo, sideChainCreationRequest);

            State.SideChainInitializationData[sideChainInfo.SideChainId] = chainInitializationData;

            Context.Fire(new SideChainCreatedEvent
            {
                ChainId = chainId,
                Creator = input.Proposer
            });
            return(new Int32Value {
                Value = chainId
            });
        }