public override Task ProcessAsync(Block block, Dictionary <TransactionResult, List <LogEvent> > logEventsMap) { foreach (var events in logEventsMap) { var transactionResult = events.Key; foreach (var logEvent in events.Value) { // a new task for time-consuming code check job Task.Run(async() => { var eventData = new CodeCheckRequired(); eventData.MergeFrom(logEvent); var codeCheckResult = await _codeCheckService.PerformCodeCheckAsync( eventData.Code.ToByteArray(), transactionResult.BlockHash, transactionResult.BlockNumber, eventData.Category, eventData.IsSystemContract); if (!codeCheckResult) { return; } var proposalId = ProposalCreated.Parser .ParseFrom(transactionResult.Logs.First(l => l.Name == nameof(ProposalCreated)).NonIndexed) .ProposalId; // Cache proposal id to generate system approval transaction later _proposalService.AddNotApprovedProposal(proposalId, transactionResult.BlockNumber); }); } } return(Task.CompletedTask); }
public Task HandleAsync(Block block, TransactionResult transactionResult, LogEvent logEvent) { // a new task for time-consuming code check job Task.Run(async() => { var eventData = new CodeCheckRequired(); eventData.MergeFrom(logEvent); var codeCheckResult = await _codeCheckService.PerformCodeCheckAsync(eventData.Code.ToByteArray(), transactionResult.BlockHash, transactionResult.BlockNumber); if (!codeCheckResult) { return; } var proposalId = ProposalCreated.Parser .ParseFrom(transactionResult.Logs.First(l => l.Name == nameof(ProposalCreated)).NonIndexed) .ProposalId; // Cache proposal id to generate system approval transaction later _proposalService.AddNotApprovedProposal(proposalId, transactionResult.BlockNumber); }); return(Task.CompletedTask); }
public Task PerformCodeCheckAsync(TransactionResult transactionResult, LogEvent logEvent) { if (!_isEnabled) { return(Task.CompletedTask); } Logger.LogTrace("Start code check."); var eventData = new CodeCheckRequired(); eventData.MergeFrom(logEvent); try { // Check contract code _contractAuditor.Audit(eventData.Code.ToByteArray(), true); // Approve proposal related to CodeCheckRequired event var proposalId = ProposalCreated.Parser .ParseFrom(transactionResult.Logs.First(l => l.Name == nameof(ProposalCreated)).NonIndexed) .ProposalId; // Cache proposal id to generate system approval transaction later _proposalService.AddNotApprovedProposal(proposalId, transactionResult.BlockNumber); } catch (InvalidCodeException e) { // May do something else to indicate that the contract has an issue Logger.LogWarning(e.Message); } Logger.LogTrace("Finish code check."); return(Task.CompletedTask); }