예제 #1
0
        public async Task <BlockchainNodeContext> StartAsync(BlockchainNodeContextStartDto dto)
        {
            _defaultContractZeroCodeProvider.SetDefaultContractZeroRegistrationByType(dto.ZeroSmartContractType);

            var context = new BlockchainNodeContext
            {
                ChainId = dto.ChainId,
                TxHub   = _txHub,
            };
            var chain = await _blockchainService.GetChainAsync();

            chain = chain == null
                ? await _chainCreationService.CreateNewChainAsync(dto.Transactions)
                : await _blockchainService.ResetChainToLibAsync(chain);

            await _smartContractAddressUpdateService.UpdateSmartContractAddressesAsync(
                await _blockchainService.GetBlockHeaderByHashAsync(chain.BestChainHash));

            await _consensusService.TriggerConsensusAsync(new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            });

            return(context);
        }
        public async Task <Chain> CreateChainAsync()
        {
            _defaultContractZeroCodeProvider.SetDefaultContractZeroRegistrationByType(null);
            var blockHeader = new BlockHeader
            {
                Height            = AElfConstants.GenesisBlockHeight,
                PreviousBlockHash = Hash.Empty,
                Time = new Timestamp {
                    Seconds = 0
                }
            };
            var transactions = new List <Transaction>
            {
                new Transaction
                {
                    From       = _defaultContractZeroCodeProvider.ContractZeroAddress,
                    To         = _defaultContractZeroCodeProvider.ContractZeroAddress,
                    MethodName = nameof(ACS0Container.ACS0Stub.DeploySystemSmartContract),
                    Params     = new SystemContractDeploymentInput
                    {
                        Name     = ZeroSmartContractAddressNameProvider.Name,
                        Category = KernelConstants.DefaultRunnerCategory,
                        Code     = ByteString.CopyFrom(ContractCodes["AElf.Contracts.Genesis"]),
                    }.ToByteString()
                },
                new Transaction
                {
                    From       = _defaultContractZeroCodeProvider.ContractZeroAddress,
                    To         = _defaultContractZeroCodeProvider.ContractZeroAddress,
                    MethodName = nameof(ACS0Container.ACS0Stub.DeploySystemSmartContract),
                    Params     = new SystemContractDeploymentInput
                    {
                        Name     = ConfigurationSmartContractAddressNameProvider.Name,
                        Category = KernelConstants.DefaultRunnerCategory,
                        Code     = ByteString.CopyFrom(ContractCodes["AElf.Contracts.Configuration"])
                    }.ToByteString()
                }
            };

            var block = await _blockExecutingService.ExecuteBlockAsync(blockHeader, transactions);

            var chain = await _blockchainService.CreateChainAsync(block.Block, transactions);

            var blockExecutionResult = await _blockchainExecutingService.ExecuteBlocksAsync(new[] { block.Block });

            await _blockExecutionResultProcessingService.ProcessBlockExecutionResultAsync(chain, blockExecutionResult);

            return(await _blockchainService.GetChainAsync());
        }
예제 #3
0
        internal async Task <Chain> CreateChainWithGenesisContractAsync()
        {
            _defaultContractZeroCodeProvider.SetDefaultContractZeroRegistrationByType(null);
            var chain = await _kernelTestHelper.CreateChain();

            var transaction = BuildDeploySystemSmartContractTransaction(ZeroSmartContractAddressNameProvider.Name,
                                                                        Codes["AElf.Contracts.Genesis"]);
            var block = await _blockchainService.GetBlockByHashAsync(chain.BestChainHash);

            block.Body.TransactionIds.Add(transaction.GetHash());
            await _blockchainService.AddTransactionsAsync(new[] { transaction });

            await MineBlockAsync(block);

            return(chain);
        }