private void Execute(BlockReceiptsTracer tracer, Transaction tx, Block block)
 {
     tracer.StartNewBlockTrace(block);
     tracer.StartNewTxTrace(tx.Hash);
     _transactionProcessor.Execute(tx, block.Header, tracer);
     tracer.EndTxTrace();
 }
Example #2
0
 public BlockchainBridge(TransactionProcessor processor, IReleaseSpec spec)
 {
     _spec           = spec;
     _receiptsTracer = new BlockReceiptsTracer(new SingleReleaseSpecProvider(_spec, 99), Substitute.For <IStateProvider>());
     _processor      = processor;
     _receiptsTracer.SetOtherTracer(GethTracer);
     _receiptsTracer.StartNewBlockTrace(_headBlock);
 }
Example #3
0
 public BlockchainBridge(TransactionProcessor processor, IReleaseSpec spec)
 {
     _spec           = spec;
     _receiptsTracer = new BlockReceiptsTracer();
     _processor      = processor;
     _receiptsTracer.SetOtherTracer(GethTracer);
     _receiptsTracer.StartNewBlockTrace(_headBlock);
 }
Example #4
0
            public BlockchainBridge(TransactionProcessor processor)
            {
                _receiptsTracer = new BlockReceiptsTracer();
                _processor      = processor;
                _tx             = Build.A.Transaction.SignedAndResolved(new EthereumEcdsa(ChainId.Mainnet, LimboLogs.Instance), TestItem.PrivateKeyA).TestObject;
                _headBlock      = Build.A.Block.WithNumber(1).WithTransactions(Enumerable.Repeat(_tx, 100).ToArray()).TestObject;

                _receiptsTracer.SetOtherTracer(GethTracer);
                _receiptsTracer.StartNewBlockTrace(_headBlock);
            }
Example #5
0
        public void Sets_state_root_if_provided_on_failure()
        {
            Block block = Build.A.Block.WithTransactions(MuirGlacier.Instance, Build.A.Transaction.TestObject).TestObject;

            BlockReceiptsTracer tracer = new BlockReceiptsTracer();

            tracer.SetOtherTracer(NullBlockTracer.Instance);
            tracer.StartNewBlockTrace(block);
            tracer.StartNewTxTrace(block.Transactions[0].Hash);
            tracer.MarkAsFailed(TestItem.AddressA, 100, new byte[0], "error", TestItem.KeccakF);

            Assert.AreEqual(TestItem.KeccakF, tracer.TxReceipts[0].PostTransactionState);
        }
Example #6
0
        public void Sets_state_root_if_provided_on_success()
        {
            Block block = Build.A.Block.WithTransactions(Build.A.Transaction.TestObject).TestObject;

            BlockReceiptsTracer tracer = new BlockReceiptsTracer();

            tracer.SetOtherTracer(NullBlockTracer.Instance);
            tracer.StartNewBlockTrace(block);
            tracer.StartNewTxTrace(block.Transactions[0].Hash);
            tracer.MarkAsSuccess(TestItem.AddressA, 100, new byte[0], new LogEntry[0], TestItem.KeccakF);

            Assert.AreEqual(TestItem.KeccakF, tracer.TxReceipts[0].PostTransactionState);
        }
Example #7
0
        public void Invokes_other_tracer_mark_as_failed_if_other_block_tracer_is_tx_tracer_too()
        {
            Block block = Build.A.Block.WithTransactions(MuirGlacier.Instance, Build.A.Transaction.TestObject).TestObject;

            IBlockTracer        otherTracer = Substitute.For <IBlockTracer, ITxTracer>();
            BlockReceiptsTracer tracer      = new BlockReceiptsTracer();

            tracer.SetOtherTracer(otherTracer);
            tracer.StartNewBlockTrace(block);
            tracer.StartNewTxTrace(block.Transactions[0].Hash);
            tracer.MarkAsFailed(TestItem.AddressA, 100, Array.Empty <byte>(), "error", TestItem.KeccakF);

            (otherTracer as ITxTracer).Received().MarkAsFailed(TestItem.AddressA, 100, Array.Empty <byte>(), "error", TestItem.KeccakF);
        }
Example #8
0
        public void Invokes_other_tracer_mark_as_success_if_other_block_tracer_is_tx_tracer_too()
        {
            Block block = Build.A.Block.WithTransactions(Build.A.Transaction.TestObject).TestObject;

            IBlockTracer        otherTracer = Substitute.For <IBlockTracer, ITxTracer>();
            BlockReceiptsTracer tracer      = new BlockReceiptsTracer();

            tracer.SetOtherTracer(otherTracer);
            tracer.StartNewBlockTrace(block);
            tracer.StartNewTxTrace(block.Transactions[0].Hash);
            var logEntries = new LogEntry[0];

            tracer.MarkAsSuccess(TestItem.AddressA, 100, Array.Empty <byte>(), logEntries, TestItem.KeccakF);

            (otherTracer as ITxTracer).Received().MarkAsSuccess(TestItem.AddressA, 100, Array.Empty <byte>(), logEntries, TestItem.KeccakF);
        }
Example #9
0
        private TxReceipt[] ProcessTransactions(Block block, ProcessingOptions processingOptions, IBlockTracer blockTracer)
        {
            _receiptsTracer.SetOtherTracer(blockTracer);
            _receiptsTracer.StartNewBlockTrace(block);

            for (int i = 0; i < block.Transactions.Length; i++)
            {
                Transaction currentTx = block.Transactions[i];
                if ((processingOptions & ProcessingOptions.DoNotVerifyNonce) != 0)
                {
                    currentTx.Nonce = _stateProvider.GetNonce(currentTx.SenderAddress);
                }

                _receiptsTracer.StartNewTxTrace(currentTx.Hash);
                _transactionProcessor.Execute(currentTx, block.Header, _receiptsTracer);
                _receiptsTracer.EndTxTrace();

                TransactionProcessed?.Invoke(this, new TxProcessedEventArgs(i, currentTx, _receiptsTracer.TxReceipts[i]));
            }

            return(_receiptsTracer.TxReceipts);
        }
Example #10
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);
        }
Example #11
0
        private TransactionReceipt[] ProcessTransactions(Block block, ProcessingOptions processingOptions, IBlockTracer blockTracer)
        {
            _receiptsTracer.SetOtherTracer(blockTracer);
            _receiptsTracer.StartNewBlockTrace(block);

            for (int i = 0; i < block.Transactions.Length; i++)
            {
                if (_logger.IsTrace)
                {
                    _logger.Trace($"Processing transaction {i}");
                }
                Transaction currentTx = block.Transactions[i];
                _receiptsTracer.StartNewTxTrace(currentTx.Hash);
                _transactionProcessor.Execute(currentTx, block.Header, _receiptsTracer);
                _receiptsTracer.EndTxTrace();

                if ((processingOptions & ProcessingOptions.ReadOnlyChain) == 0)
                {
                    TransactionProcessed?.Invoke(this, new TransactionProcessedEventArgs(_receiptsTracer.TransactionReceipts[i]));
                }
            }

            return(_receiptsTracer.TransactionReceipts);
        }