Пример #1
0
        private static readonly Ethash Ethash = new Ethash(); // temporarily keep reusing the same one as otherwise it would recreate cache for each test

        protected void Setup(ILogger logger)
        {
            _logger = logger;
            ILogger stateLogger = ShouldLog.State ? _logger : null;

            _multiDb = new MultiDb(stateLogger);
            _chain   = new BlockStore();

            _blockhashProvider = new BlockhashProvider(_chain);
            _virtualMachines   = new Dictionary <EthereumNetwork, IVirtualMachine>();
            _stateProviders    = new Dictionary <EthereumNetwork, StateProvider>();
            _storageProviders  = new Dictionary <EthereumNetwork, IStorageProvider>();
            _blockValidators   = new Dictionary <EthereumNetwork, IBlockValidator>();
            EthereumNetwork[] networks = { EthereumNetwork.Frontier, EthereumNetwork.Homestead, EthereumNetwork.Byzantium, EthereumNetwork.SpuriousDragon, EthereumNetwork.TangerineWhistle };
            foreach (EthereumNetwork ethereumNetwork in networks)
            {
                IEthereumRelease      spec = _protocolSpecificationProvider.GetSpec(ethereumNetwork, 1);
                ISignatureValidator   signatureValidator   = new SignatureValidator(spec, ChainId.MainNet);
                ITransactionValidator transactionValidator = new TransactionValidator(spec, signatureValidator);
                IBlockHeaderValidator headerValidator      = new BlockHeaderValidator(_chain, Ethash);
                IOmmersValidator      ommersValidator      = new OmmersValidator(_chain, headerValidator);
                IBlockValidator       blockValidator       = new BlockValidator(transactionValidator, headerValidator, ommersValidator, stateLogger);

                _blockValidators[ethereumNetwork]  = blockValidator;
                _stateProviders[ethereumNetwork]   = new StateProvider(new StateTree(_multiDb.CreateDb()), spec, stateLogger);
                _storageProviders[ethereumNetwork] = new StorageProvider(_multiDb, _stateProviders[ethereumNetwork], stateLogger);
                _virtualMachines[ethereumNetwork]  = new VirtualMachine(
                    spec,
                    _stateProviders[ethereumNetwork],
                    _storageProviders[ethereumNetwork],
                    _blockhashProvider,
                    ShouldLog.Evm ? logger : null);
            }
        }
Пример #2
0
 public void Setup()
 {
     _dbProvider        = new MemDbProvider(_logManager);
     _blockhashProvider = new TestBlockhashProvider();
     _stateProvider     = new StateProvider(new StateTree(_dbProvider.GetOrCreateStateDb()), _dbProvider.GetOrCreateCodeDb(), _logManager);
     _storageProvider   = new StorageProvider(new MemDbProvider(_logManager), _stateProvider, _logManager);
 }
Пример #3
0
        public void GlobalSetup()
        {
            ISnapshotableDb codeDb      = new StateDb();
            ISnapshotableDb stateDb     = new StateDb();
            IDb             blockInfoDb = new MemDb(10, 5);

            ISpecProvider specProvider = MainNetSpecProvider.Instance;
            IReleaseSpec  spec         = MainNetSpecProvider.Instance.GenesisSpec;

            StateProvider stateProvider = new StateProvider(stateDb, codeDb, LimboLogs.Instance);

            stateProvider.CreateAccount(Address.Zero, 1000.Ether());
            stateProvider.Commit(spec);

            StorageProvider storageProvider = new StorageProvider(stateDb, stateProvider, LimboLogs.Instance);
            StateReader     stateReader     = new StateReader(stateDb, codeDb, LimboLogs.Instance);

            ChainLevelInfoRepository chainLevelInfoRepository = new ChainLevelInfoRepository(blockInfoDb);
            BlockTree blockTree = new BlockTree(new MemDb(), new MemDb(), blockInfoDb, chainLevelInfoRepository, specProvider, NullTxPool.Instance, LimboLogs.Instance);

            _blockhashProvider = new BlockhashProvider(blockTree, LimboLogs.Instance);
            _virtualMachine    = new VirtualMachine(stateProvider, storageProvider, _blockhashProvider, specProvider, LimboLogs.Instance);

            Block genesisBlock = Build.A.Block.Genesis.TestObject;

            blockTree.SuggestBlock(genesisBlock);

            Block block1 = Build.A.Block.WithParent(genesisBlock).WithNumber(1).TestObject;

            blockTree.SuggestBlock(block1);

            TransactionProcessor transactionProcessor
                = new TransactionProcessor(MainNetSpecProvider.Instance, stateProvider, storageProvider, _virtualMachine, LimboLogs.Instance);

            BlockProcessor blockProcessor = new BlockProcessor(specProvider, AlwaysValidBlockValidator.Instance, new RewardCalculator(specProvider), transactionProcessor,
                                                               stateDb, codeDb, new MemDb(), stateProvider, storageProvider, NullTxPool.Instance, NullReceiptStorage.Instance, LimboLogs.Instance);

            BlockchainProcessor blockchainProcessor = new BlockchainProcessor(
                blockTree,
                blockProcessor,
                new TxSignaturesRecoveryStep(new EthereumEcdsa(specProvider, LimboLogs.Instance), NullTxPool.Instance, LimboLogs.Instance),
                LimboLogs.Instance,
                false,
                false);

            blockchainProcessor.Process(genesisBlock, ProcessingOptions.None, NullBlockTracer.Instance);
            blockchainProcessor.Process(block1, ProcessingOptions.None, NullBlockTracer.Instance);

            BlockchainBridge bridge = new BlockchainBridge(
                stateReader,
                stateProvider,
                storageProvider,
                blockTree,
                NullTxPool.Instance,
                NullReceiptStorage.Instance,
                NullFilterStore.Instance,
                NullFilterManager.Instance, new DevWallet(new WalletConfig(), LimboLogs.Instance), transactionProcessor, new EthereumEcdsa(MainNetSpecProvider.Instance, LimboLogs.Instance));

            _ethModule = new EthModule(LimboLogs.Instance, bridge);
        }
Пример #4
0
 public void Setup()
 {
     _stateDb           = new StateDb();
     _codeDb            = new StateDb();
     _blockhashProvider = new TestBlockhashProvider();
     _stateProvider     = new StateProvider(_stateDb, _codeDb, _logManager);
     _storageProvider   = new StorageProvider(_stateDb, _stateProvider, _logManager);
 }
Пример #5
0
 public void Setup()
 {
     _stateDb           = new StateDb();
     _codeDb            = new StateDb();
     _blockhashProvider = new TestBlockhashProvider();
     _specProvider      = OlympicSpecProvider.Instance;;
     _stateProvider     = new StateProvider(_stateDb, _codeDb, _logManager);
     _storageProvider   = new StorageProvider(_stateDb, _stateProvider, _logManager);
 }
Пример #6
0
            public RpcState(IBlockTree blockTree, ISpecProvider specProvider, IReadOnlyDbProvider readOnlyDbProvider,
                            ILogManager logManager)
            {
                var stateDb = readOnlyDbProvider.StateDb;
                var codeDb  = readOnlyDbProvider.CodeDb;

                StateReader          = new StateReader(readOnlyDbProvider.StateDb, codeDb, logManager);
                StateProvider        = new StateProvider(stateDb, codeDb, logManager);
                StorageProvider      = new StorageProvider(stateDb, StateProvider, logManager);
                BlockTree            = new ReadOnlyBlockTree(blockTree);
                BlockhashProvider    = new BlockhashProvider(BlockTree, logManager);
                VirtualMachine       = new VirtualMachine(StateProvider, StorageProvider, BlockhashProvider, logManager);
                TransactionProcessor = new TransactionProcessor(specProvider, StateProvider, StorageProvider,
                                                                VirtualMachine, logManager);
            }
Пример #7
0
        public ReadOnlyTxProcessingEnv(IReadOnlyDbProvider readOnlyDbProvider, ReadOnlyBlockTree readOnlyBlockTree, ISpecProvider specProvider, ILogManager logManager)
        {
            ISnapshotableDb stateDb = readOnlyDbProvider.StateDb;
            IDb             codeDb  = readOnlyDbProvider.CodeDb;

            StateReader     = new StateReader(stateDb, codeDb, logManager);
            StateProvider   = new StateProvider(stateDb, codeDb, logManager);
            StorageProvider = new StorageProvider(stateDb, StateProvider, logManager);

            BlockTree         = readOnlyBlockTree;
            BlockhashProvider = new BlockhashProvider(BlockTree, logManager);

            VirtualMachine       = new VirtualMachine(StateProvider, StorageProvider, BlockhashProvider, specProvider, logManager);
            TransactionProcessor = new TransactionProcessor(specProvider, StateProvider, StorageProvider, VirtualMachine, logManager);
        }
Пример #8
0
        public virtual void Setup()
        {
            ILogManager logger = LimboLogs.Instance;

            ISnapshotableDb beamSyncDb     = new StateDb(new BeamSyncDb(new MemDb(), LimboLogs.Instance));
            IDb             beamSyncCodeDb = new BeamSyncDb(new MemDb(), LimboLogs.Instance);
            IDb             codeDb         = UseBeamSync ? beamSyncCodeDb : new StateDb();

            _stateDb       = UseBeamSync ? beamSyncDb : new StateDb();
            TestState      = new StateProvider(_stateDb, codeDb, logger);
            Storage        = new StorageProvider(_stateDb, TestState, logger);
            _ethereumEcdsa = new EthereumEcdsa(SpecProvider, logger);
            IBlockhashProvider blockhashProvider = TestBlockhashProvider.Instance;

            Machine    = new VirtualMachine(TestState, Storage, blockhashProvider, SpecProvider, logger);
            _processor = new TransactionProcessor(SpecProvider, TestState, Storage, Machine, logger);
        }
        public virtual void Setup()
        {
            ILogManager logManager = GetLogManager();

            MemDb beamStateDb    = new MemDb();
            IDb   beamSyncDb     = new BeamSyncDb(new MemDb(), beamStateDb, StaticSelector.Full, logManager);
            IDb   beamSyncCodeDb = new BeamSyncDb(new MemDb(), beamStateDb, StaticSelector.Full, logManager);
            IDb   codeDb         = UseBeamSync ? beamSyncCodeDb : new MemDb();

            _stateDb = UseBeamSync ? beamSyncDb : new MemDb();
            var trieStore = new TrieStore(_stateDb, logManager);

            TestState      = new StateProvider(trieStore, codeDb, logManager);
            Storage        = new StorageProvider(trieStore, TestState, logManager);
            _ethereumEcdsa = new EthereumEcdsa(SpecProvider.ChainId, logManager);
            IBlockhashProvider blockhashProvider = TestBlockhashProvider.Instance;

            Machine    = new VirtualMachine(TestState, Storage, blockhashProvider, SpecProvider, logManager);
            _processor = new TransactionProcessor(SpecProvider, TestState, Storage, Machine, logManager);
        }
Пример #10
0
        public void GlobalSetup()
        {
            var dbProvider  = TestMemDbProvider.Init();
            IDb codeDb      = dbProvider.CodeDb;
            IDb stateDb     = dbProvider.StateDb;
            IDb blockInfoDb = new MemDb(10, 5);

            ISpecProvider specProvider = MainnetSpecProvider.Instance;
            IReleaseSpec  spec         = MainnetSpecProvider.Instance.GenesisSpec;
            var           trieStore    = new TrieStore(stateDb, LimboLogs.Instance);

            StateProvider stateProvider = new(trieStore, codeDb, LimboLogs.Instance);

            stateProvider.CreateAccount(Address.Zero, 1000.Ether());
            stateProvider.Commit(spec);

            StorageProvider storageProvider = new(trieStore, stateProvider, LimboLogs.Instance);
            StateReader     stateReader     = new(trieStore, codeDb, LimboLogs.Instance);

            ChainLevelInfoRepository chainLevelInfoRepository = new (blockInfoDb);
            BlockTree blockTree = new(dbProvider, chainLevelInfoRepository, specProvider, NullBloomStorage.Instance, LimboLogs.Instance);

            _blockhashProvider = new BlockhashProvider(blockTree, LimboLogs.Instance);
            _virtualMachine    = new VirtualMachine(_blockhashProvider, specProvider, LimboLogs.Instance);

            Block genesisBlock = Build.A.Block.Genesis.TestObject;

            blockTree.SuggestBlock(genesisBlock);

            Block block1 = Build.A.Block.WithParent(genesisBlock).WithNumber(1).TestObject;

            blockTree.SuggestBlock(block1);

            TransactionProcessor transactionProcessor
                = new(MainnetSpecProvider.Instance, stateProvider, storageProvider, _virtualMachine, LimboLogs.Instance);

            IBlockProcessor.IBlockTransactionsExecutor transactionsExecutor = new BlockProcessor.BlockValidationTransactionsExecutor(transactionProcessor, stateProvider);
            BlockProcessor blockProcessor = new(specProvider, Always.Valid, new RewardCalculator(specProvider), transactionsExecutor,
                                                stateProvider, storageProvider, NullReceiptStorage.Instance, NullWitnessCollector.Instance, LimboLogs.Instance);

            EthereumEcdsa       ecdsa = new(specProvider.ChainId, LimboLogs.Instance);
            BlockchainProcessor blockchainProcessor = new(
                blockTree,
                blockProcessor,
                new RecoverSignatures(
                    ecdsa,
                    NullTxPool.Instance,
                    specProvider,
                    LimboLogs.Instance),
                LimboLogs.Instance,
                BlockchainProcessor.Options.NoReceipts);

            blockchainProcessor.Process(genesisBlock, ProcessingOptions.None, NullBlockTracer.Instance);
            blockchainProcessor.Process(block1, ProcessingOptions.None, NullBlockTracer.Instance);

            IBloomStorage bloomStorage = new BloomStorage(new BloomConfig(), new MemDb(), new InMemoryDictionaryFileStoreFactory());

            LogFinder logFinder = new(
                blockTree,
                new InMemoryReceiptStorage(),
                bloomStorage,
                LimboLogs.Instance,
                new ReceiptsRecovery(ecdsa, specProvider));

            BlockchainBridge bridge = new(
                new ReadOnlyTxProcessingEnv(
                    new ReadOnlyDbProvider(dbProvider, false),
                    trieStore.AsReadOnly(),
                    new ReadOnlyBlockTree(blockTree),
                    specProvider,
                    LimboLogs.Instance),
                NullTxPool.Instance,
                NullReceiptStorage.Instance,
                NullFilterStore.Instance,
                NullFilterManager.Instance,
                ecdsa,
                Timestamper.Default,
                logFinder,
                specProvider,
                false);

            GasPriceOracle   gasPriceOracle   = new(blockTree, specProvider);
            FeeHistoryOracle feeHistoryOracle = new(blockTree, NullReceiptStorage.Instance, specProvider);
            EthSyncingInfo   ethSyncingInfo   = new(blockTree);

            _ethModule = new EthRpcModule(
                new JsonRpcConfig(),
                bridge,
                blockTree,
                stateReader,
                NullTxPool.Instance,
                NullTxSender.Instance,
                NullWallet.Instance,
                Substitute.For <IReceiptFinder>(),
                LimboLogs.Instance,
                specProvider,
                gasPriceOracle,
                ethSyncingInfo,
                feeHistoryOracle);
        }