private void QuickFail(Transaction tx, BlockHeader block, ITxTracer txTracer, string reason) { block.GasUsed += tx.GasLimit; Address recipient = tx.To ?? ContractAddress.From(tx.SenderAddress, _stateProvider.GetNonce(tx.SenderAddress)); _stateProvider.RecalculateStateRoot(); Keccak stateRoot = _specProvider.GetSpec(block.Number).IsEip658Enabled ? null : _stateProvider.StateRoot; if (txTracer.IsTracingReceipt) { txTracer.MarkAsFailed(recipient, tx.GasLimit, Array.Empty <byte>(), reason ?? "invalid", stateRoot); } }
/// <summary> /// Resets state provider to state. /// </summary> /// <param name="stateProvider"></param> /// <param name="state"></param> /// <returns>Current state provider state before reset.</returns> public static Keccak ResetStateTo(this IStateProvider stateProvider, Keccak state) { Keccak currentState = stateProvider.StateRoot; stateProvider.Reset(); stateProvider.StateRoot = state; stateProvider.RecalculateStateRoot(); return(currentState); }
private void QuickFail(Transaction tx, BlockHeader block, ITxTracer txTracer, bool eip658NotEnabled, string?reason) { block.GasUsed += tx.GasLimit; Address recipient = tx.To ?? ContractAddress.From( tx.SenderAddress ?? Address.Zero, _stateProvider.GetNonce(tx.SenderAddress ?? Address.Zero)); if (txTracer.IsTracingReceipt) { Keccak?stateRoot = null; if (eip658NotEnabled) { _stateProvider.RecalculateStateRoot(); stateRoot = _stateProvider.StateRoot; } txTracer.MarkAsFailed(recipient, tx.GasLimit, Array.Empty <byte>(), reason ?? "invalid", stateRoot); } }
protected virtual TxReceipt[] ProcessBlock(Block block, IBlockTracer blockTracer, ProcessingOptions options) { TxReceipt[] receipts = ProcessTransactions(block, options, blockTracer); SetReceiptsRoot(block, receipts); ApplyMinerRewards(block, blockTracer); _stateProvider.Commit(_specProvider.GetSpec(block.Number)); _stateProvider.RecalculateStateRoot(); block.Header.StateRoot = _stateProvider.StateRoot; block.Header.Hash = block.Header.CalculateHash(); return(receipts); }
private void QuickFail(Transaction tx, BlockHeader block, ITxTracer txTracer, string reason) { if (tx.IsEip1559) { block.GasUsedEip1559 += tx.GasLimit; } else { block.GasUsedLegacy += tx.GasLimit; } Address recipient = tx.To ?? ContractAddress.From(tx.SenderAddress, _stateProvider.GetNonce(tx.SenderAddress)); // TODO: this is possibly an unnecessary calculation inside EIP-658 _stateProvider.RecalculateStateRoot(); Keccak stateRoot = _specProvider.GetSpec(block.Number).IsEip658Enabled ? null : _stateProvider.StateRoot; if (txTracer.IsTracingReceipt) { txTracer.MarkAsFailed(recipient, tx.GasLimit, Array.Empty <byte>(), reason ?? "invalid", stateRoot); } }
private void Execute(Delta delta, ITxTracer txTracer, bool readOnly) { var stateUpdate = ToStateUpdate(delta); // revert state if any fails (take snapshot) foreach (var publicEntry in delta.PublicEntries) { Execute(publicEntry, stateUpdate, txTracer); } var spec = _specProvider.GetSpec(stateUpdate.Number); _storageProvider.Commit(txTracer.IsTracingState ? txTracer : null); _stateProvider.Commit(spec, txTracer.IsTracingState ? txTracer : null); _stateProvider.RecalculateStateRoot(); if (!readOnly) { if (new Keccak(delta.StateRoot.ToByteArray()) != _stateProvider.StateRoot) { if (_logger.IsEnabled(LogEventLevel.Error)) { _logger.Error("Invalid delta state root - found {found} and should be {shouldBe}", _stateProvider.StateRoot, new Keccak(delta.StateRoot.ToByteArray())); } } // compare state roots _storageProvider.CommitTrees(); _stateProvider.CommitTree(); } else { delta.StateRoot = _stateProvider.StateRoot.ToByteString(); if (_logger.IsEnabled(LogEventLevel.Debug)) { _logger.Debug($"Setting candidate delta {delta.DeltaNumber} root to {delta.StateRoot.ToKeccak()}"); } _stateProvider.Reset(); _storageProvider.Reset(); } }
protected virtual TxReceipt[] ProcessBlock(Block block, IBlockTracer blockTracer, ProcessingOptions options) { if (!block.IsGenesis) { var receipts = ProcessTransactions(block, options, blockTracer); SetReceiptsRoot(block, receipts); ApplyMinerRewards(block, blockTracer); _stateProvider.Commit(_specProvider.GetSpec(block.Number)); _stateProvider.RecalculateStateRoot(); block.Header.StateRoot = _stateProvider.StateRoot; block.Header.Hash = block.Header.CalculateHash(); return(receipts); } if (_logger.IsTrace) { _logger.Trace($"Processed block {block.ToString(Block.Format.Short)}"); } return(Array.Empty <TxReceipt>()); }
// TODO: block processor pipeline protected virtual TxReceipt[] ProcessBlock( Block block, IBlockTracer blockTracer, ProcessingOptions options) { IReleaseSpec spec = _specProvider.GetSpec(block.Number); _receiptsTracer.SetOtherTracer(blockTracer); _receiptsTracer.StartNewBlockTrace(block); TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, _receiptsTracer, spec); _receiptsTracer.EndBlockTrace(); block.Header.ReceiptsRoot = receipts.GetReceiptsRoot(spec, block.ReceiptsRoot); ApplyMinerRewards(block, blockTracer, spec); _stateProvider.Commit(spec); _stateProvider.RecalculateStateRoot(); block.Header.StateRoot = _stateProvider.StateRoot; block.Header.Hash = block.Header.CalculateHash(); return(receipts); }