private Transaction GetTransactionForGenesisOwnerInitialization(OsBlockchainNodeContextStartDto dto)
        {
            var zeroAddress = _smartContractAddressService.GetZeroSmartContractAddress();

            return(new Transaction
            {
                From = zeroAddress,
                To = zeroAddress,
                MethodName = nameof(BasicContractZero.Initialize),
                Params = new InitializeInput
                {
                    ContractDeploymentAuthorityRequired = dto.ContractDeploymentAuthorityRequired
                }.ToByteString()
            });
        }
        public async Task <OsBlockchainNodeContext> StartAsync(OsBlockchainNodeContextStartDto dto)
        {
            var transactions = new List <Transaction>();

            transactions.Add(GetTransactionForDeployment(dto.ZeroSmartContract,
                                                         ZeroSmartContractAddressNameProvider.Name,
                                                         dto.SmartContractRunnerCategory));

            transactions.AddRange(dto.InitializationSmartContracts
                                  .Select(p => GetTransactionForDeployment(p.Code, p.SystemSmartContractName,
                                                                           dto.SmartContractRunnerCategory,
                                                                           p.ContractInitializationMethodCallList)));

            if (dto.InitializationTransactions != null)
            {
                transactions.AddRange(dto.InitializationTransactions);
            }

            // Add transaction for initialization
            transactions.Add(GetTransactionForGenesisOwnerInitialization(dto));

            var blockchainNodeContextStartDto = new BlockchainNodeContextStartDto()
            {
                ChainId = dto.ChainId,
                ZeroSmartContractType = dto.ZeroSmartContract,
                Transactions          = transactions.ToArray()
            };

            var context = new OsBlockchainNodeContext
            {
                BlockchainNodeContext =
                    await _blockchainNodeContextService.StartAsync(blockchainNodeContextStartDto),
                AElfNetworkServer = _networkServer
            };

            await _networkServer.StartAsync();

            foreach (var nodePlugin in _nodePlugins)
            {
                await nodePlugin.StartAsync(dto.ChainId);
            }

            return(context);
        }