예제 #1
0
        public async Task <bool> PerformCodeCheckAsync(byte[] code, Hash blockHash, long blockHeight)
        {
            if (!_isEnabled)
            {
                return(false);
            }

            var requiredAcs = await _requiredAcsInContractsProvider.GetRequiredAcsInContractsAsync(blockHash, blockHeight);

            try
            {
                // Check contract code
                Logger.LogTrace("Start code check.");
                _contractAuditor.Audit(code, requiredAcs, true);
                Logger.LogTrace("Finish code check.");
                return(true);
            }
            catch (InvalidCodeException e)
            {
                // May do something else to indicate that the contract has an issue
                Logger.LogWarning(e.Message);
            }

            return(false);
        }
예제 #2
0
        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);
        }
예제 #3
0
 public void Audit(byte[] code)
 {
     _auditor.Audit(code, false);
 }