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