diff --git a/src/AElf.Kernel.CodeCheck/Application/CodeCheckValidationProvider.cs b/src/AElf.Kernel.CodeCheck/Application/CodeCheckValidationProvider.cs index 0d772880e4..7cbdf2d6e6 100644 --- a/src/AElf.Kernel.CodeCheck/Application/CodeCheckValidationProvider.cs +++ b/src/AElf.Kernel.CodeCheck/Application/CodeCheckValidationProvider.cs @@ -10,17 +10,20 @@ namespace AElf.Kernel.CodeCheck.Application; internal class CodeCheckValidationProvider : IBlockValidationProvider { private readonly ICheckedCodeHashProvider _checkedCodeHashProvider; + private readonly ICodeCheckService _codeCheckService; private readonly IContractReaderFactory _contractReaderFactory; private readonly ISmartContractAddressService _smartContractAddressService; public CodeCheckValidationProvider(ISmartContractAddressService smartContractAddressService, IContractReaderFactory contractReaderFactory, ICheckedCodeHashProvider checkedCodeHashProvider, + ICodeCheckService codeCheckService, IOptionsSnapshot codeCheckOptions) { _smartContractAddressService = smartContractAddressService; _contractReaderFactory = contractReaderFactory; _checkedCodeHashProvider = checkedCodeHashProvider; + _codeCheckService = codeCheckService; Logger = NullLogger.Instance; } @@ -60,10 +63,29 @@ public async Task ValidateBlockAfterExecuteAsync(IBlock block) } Logger.LogInformation("block hash: {Block}", block); - return codeHashList.Value.All(codeHash => _checkedCodeHashProvider.IsCodeHashExists(new BlockIndex + var contractsFailedCodeCheck = codeHashList.Value.Where(codeHash => !_checkedCodeHashProvider.IsCodeHashExists( + new BlockIndex + { + BlockHash = blockHash, + BlockHeight = block.Header.Height + }, codeHash)).ToList(); + if (!contractsFailedCodeCheck.Any()) return true; + foreach (var eventData in contractsFailedCodeCheck.Select(contractFailedCodeCheck => + { + // TODO: Get contract deploy info. + return new CodeCheckRequired(); + })) { - BlockHash = blockHash, - BlockHeight = block.Header.Height - }, codeHash)); + var codeCheckResult = await _codeCheckService.PerformCodeCheckAsync( + eventData.Code.ToByteArray(), + blockHash, block.Header.Height, eventData.Category, + eventData.IsSystemContract); + if (codeCheckResult == false) + { + return false; + } + } + + return true; } } \ No newline at end of file