コード例 #1
0
        private async Task ProcessCodeUpdateAsync(Chain chain)
        {
            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            var address = await _smartContractAddressService.GetAddressByContractNameAsync(chainContext,
                                                                                           ConfigurationSmartContractAddressNameProvider.StringName);

            var transaction = new Transaction
            {
                From       = _smartContractAddressService.GetZeroSmartContractAddress(),
                To         = _smartContractAddressService.GetZeroSmartContractAddress(),
                MethodName = nameof(ACS0Container.ACS0Stub.UpdateSmartContract),
                Params     = new ContractUpdateInput
                {
                    Code = ByteString.CopyFrom(
                        _smartContractExecutionHelper.ContractCodes["AElf.Contracts.MultiToken"]),
                    Address = address
                }.ToByteString()
            };
            var blockExecutedSet = await _smartContractExecutionHelper.ExecuteTransactionAsync(transaction, chain);

            var interestedEvent = await _codeUpdatedLogEventProcessor.GetInterestedEventAsync(chainContext);

            foreach (var transactionResult in blockExecutedSet.TransactionResultMap.Values)
            {
                var logEvent = transactionResult.Logs.First(l =>
                                                            l.Address == interestedEvent.LogEvent.Address && l.Name == interestedEvent.LogEvent.Name);
                var codeUpdated = new CodeUpdated();
                codeUpdated.MergeFrom(logEvent);
                var smartContractRegistration = await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                                                           codeUpdated.Address);

                await _codeUpdatedLogEventProcessor.ProcessAsync(blockExecutedSet.Block,
                                                                 new Dictionary <TransactionResult, List <LogEvent> >
                {
                    { transactionResult, new List <LogEvent> {
                          logEvent
                      } }
                });

                chainContext = new ChainContext
                {
                    BlockHash   = blockExecutedSet.Block.GetHash(),
                    BlockHeight = blockExecutedSet.Block.Height
                };
                var updatedSmartContractRegistration = await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                                                                  codeUpdated.Address);

                updatedSmartContractRegistration.ShouldNotBe(smartContractRegistration);
                updatedSmartContractRegistration.Code.ShouldBe(ByteString.CopyFrom(
                                                                   _smartContractExecutionHelper.ContractCodes["AElf.Contracts.MultiToken"]));
            }
        }
        public async Task SmartContractRegistrationSetAndGet_Test()
        {
            var chain = await _smartContractHelper.CreateChainAsync();

            var blockExecutedDataKey = $"BlockExecutedData/SmartContractRegistration/{SampleAddress.AddressList[0]}";

            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };

            var smartContractRegistrationFromProvider =
                await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                           SampleAddress.AddressList[0]);

            smartContractRegistrationFromProvider.ShouldBeNull();

            var smartContractRegistration = new SmartContractRegistration
            {
                CodeHash = HashHelper.ComputeFrom(blockExecutedDataKey),
                Category = KernelConstants.CodeCoverageRunnerCategory,
                Version  = 1
            };
            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext,
                                                                                       SampleAddress.AddressList[0], smartContractRegistration);

            var blockStateSet = await _blockStateSetManger.GetBlockStateSetAsync(chain.BestChainHash);

            blockStateSet.BlockExecutedData.ShouldContainKey(blockExecutedDataKey);

            smartContractRegistrationFromProvider =
                await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                           SampleAddress.AddressList[0]);

            smartContractRegistrationFromProvider.ShouldBe(smartContractRegistration);
        }
コード例 #3
0
        public virtual async Task PutExecutiveAsync(IChainContext chainContext, Address address, IExecutive executive)
        {
            if (_smartContractExecutiveProvider.TryGetValue(address, out var pool))
            {
                var smartContractRegistration =
                    await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext, address);

                if (smartContractRegistration != null && smartContractRegistration.CodeHash == executive.ContractHash ||
                    chainContext.BlockHeight <= AElfConstants.GenesisBlockHeight)
                {
                    executive.LastUsedTime = TimestampHelper.GetUtcNow();
                    pool.Add(executive);
                    return;
                }

                Logger.LogDebug($"Lost an executive (no registration {address})");
            }
            else
            {
                Logger.LogDebug($"Lost an executive (no pool {address})");
            }

            await Task.CompletedTask;
        }
コード例 #4
0
        public async Task SmartContractRegistrationSetAndGet_Test()
        {
            var genesisBlock = _kernelTestHelper.GenerateBlock(0, Hash.Empty, new List <Transaction>());
            var chain        = await _blockchainService.CreateChainAsync(genesisBlock, new List <Transaction>());

            var blockStateSet = new BlockStateSet
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            await _blockStateSetManger.SetBlockStateSetAsync(blockStateSet);

            var blockExecutedDataKey = $"BlockExecutedData/SmartContractRegistration/{SampleAddress.AddressList[0]}";

            blockStateSet.BlockExecutedData.ShouldNotContainKey(blockExecutedDataKey);

            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };

            var smartContractRegistration = new SmartContractRegistration
            {
                CodeHash = Hash.FromString(blockExecutedDataKey),
                Category = KernelConstants.CodeCoverageRunnerCategory,
                Version  = 1
            };
            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext,
                                                                                       SampleAddress.AddressList[0], smartContractRegistration);

            blockStateSet = await _blockStateSetManger.GetBlockStateSetAsync(chain.BestChainHash);

            blockStateSet.BlockExecutedData.ShouldContainKey(blockExecutedDataKey);

            var smartContractRegistrationFromState =
                await _smartContractRegistrationProvider.GetSmartContractRegistrationAsync(chainContext,
                                                                                           SampleAddress.AddressList[0]);

            smartContractRegistrationFromState.ShouldBe(smartContractRegistration);
        }