コード例 #1
0
        private void StoreTraces(ParityLikeBlockTracer blockTracer)
        {
            if (blockTracer == null)
            {
                throw new ArgumentNullException(nameof(blockTracer));
            }

            IReadOnlyCollection <ParityLikeTxTrace> traces = blockTracer.BuildResult();

            try
            {
                _traceDb.StartBatch();
                List <ParityLikeTxTrace> rewardTraces = new List <ParityLikeTxTrace>();
                foreach (ParityLikeTxTrace parityLikeTxTrace in traces)
                {
                    if (parityLikeTxTrace.TransactionHash != null)
                    {
                        _traceDb.Set(parityLikeTxTrace.TransactionHash, Rlp.Encode(parityLikeTxTrace).Bytes);
                    }
                    else
                    {
                        rewardTraces.Add(parityLikeTxTrace);
                    }
                }

                if (rewardTraces.Any())
                {
                    _traceDb.Set(rewardTraces[0].BlockHash, Rlp.Encode(rewardTraces.ToArray()).Bytes);
                }
            }
            finally
            {
                _traceDb.CommitBatch();
            }
        }
コード例 #2
0
        private void LogDiagnosticTrace(IBlockTracer blockTracer)
        {
            GethLikeBlockTracer   gethTracer   = blockTracer as GethLikeBlockTracer;
            ParityLikeBlockTracer parityTracer = blockTracer as ParityLikeBlockTracer;

            if (gethTracer != null)
            {
                var serializer = new EthereumJsonSerializer();
                var trace      = gethTracer.BuildResult();
                var serialized = serializer.Serialize(trace, true);
                if (_logger.IsInfo)
                {
                    _logger.Info(serialized);
                }
            }

            if (parityTracer != null)
            {
                var serializer = new EthereumJsonSerializer();
                var trace      = parityTracer.BuildResult();
                var serialized = serializer.Serialize(trace, true);
                if (_logger.IsInfo)
                {
                    _logger.Info(serialized);
                }
            }
        }
コード例 #3
0
        private ParityLikeTxTrace ParityTrace(Block block, Keccak txHash, ParityTraceTypes traceTypes)
        {
            ParityLikeBlockTracer listener = new ParityLikeBlockTracer(txHash, traceTypes);

            _processor.Process(block, ProcessingOptions.ForceProcessing | ProcessingOptions.WithRollback | ProcessingOptions.ReadOnlyChain, listener);
            return(listener.BuildResult().SingleOrDefault());
        }
コード例 #4
0
        private void LogDiagnosticTrace(IBlockTracer blockTracer, Block block)
        {
            FileStream GetDiagnosticFile() => new FileStream($"trace_{block}.txt", FileMode.Create, FileAccess.Write);

            GethLikeBlockTracer   gethTracer   = blockTracer as GethLikeBlockTracer;
            ParityLikeBlockTracer parityTracer = blockTracer as ParityLikeBlockTracer;

            if (gethTracer != null)
            {
                using var diagnosticFile = GetDiagnosticFile();
                var serializer = new EthereumJsonSerializer();
                var trace      = gethTracer.BuildResult();
                serializer.Serialize(diagnosticFile, trace, true);
                if (_logger.IsInfo)
                {
                    _logger.Info($"Created trace of block {block} in file {diagnosticFile.Name}");
                }
            }

            if (parityTracer != null)
            {
                using var diagnosticFile = GetDiagnosticFile();
                var serializer = new EthereumJsonSerializer();
                var trace      = parityTracer.BuildResult();
                serializer.Serialize(diagnosticFile, trace, true);
                if (_logger.IsInfo)
                {
                    _logger.Info($"Created trace of block {block} in file {diagnosticFile.Name}");
                }
            }
        }
コード例 #5
0
        private ParityLikeTxTrace[] ParityTraceBlock(Block block, ParityTraceTypes traceTypes)
        {
            if (block == null)
            {
                throw new InvalidOperationException("Only canonical, historical blocks supported");
            }

            if (block.Number != 0)
            {
                Block parent = _blockTree.FindParent(block);
                if (!_blockTree.IsMainChain(parent.Hash))
                {
                    throw new InvalidOperationException("Cannot trace orphaned blocks");
                }
            }

            ParityLikeBlockTracer listener = new ParityLikeBlockTracer(traceTypes);

            _processor.Process(block, ProcessingOptions.ForceProcessing | ProcessingOptions.WithRollback | ProcessingOptions.ReadOnlyChain | ProcessingOptions.NoValidation, listener);
            return(listener.BuildResult().ToArray());
        }