コード例 #1
0
        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);
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
ファイル: BlockProcessor.cs プロジェクト: AlexSSD7/nethermind
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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();
            }
        }
コード例 #7
0
ファイル: BlockProcessor.cs プロジェクト: sounak98/nethermind
        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>());
        }
コード例 #8
0
        // 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);
        }