/// <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 }); }
/// <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 }); }