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