コード例 #1
0
ファイル: SpecialTests.cs プロジェクト: sounak98/nethermind
        public void Test(BlockchainTest test)
        {
            if (test.Name.Contains("block504980"))
            {
                return;
            }

            Assert.True(RunTest(test).Pass);
        }
コード例 #2
0
        public void Test(BlockchainTest test)
        {
            if (test.Name.Contains("CALLBlake2f_MaxRound"))
            {
                return;
            }

            Assert.True(RunTest(test).Pass);
        }
コード例 #3
0
ファイル: RevertTests.cs プロジェクト: sounak98/nethermind
        public void Test(BlockchainTest test)
        {
            if (ignored.Any(i => test.Name.Contains(i)))
            {
                return;
            }

            Assert.True(RunTest(test).Pass);
        }
コード例 #4
0
        public async Task Test(BlockchainTest test)
        {
            if (test.Name.Contains("suicideStorage"))
            {
                return;
            }

            await RunTest(test);
        }
コード例 #5
0
ファイル: ForgedTests.cs プロジェクト: zhamppx97/nethermind
        public async Task Test(BlockchainTest test)
        {
            bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                             .IsOSPlatform(OSPlatform.Windows);

            if (isWindows)
            {
                return;
            }

            await RunTest(test);
        }
コード例 #6
0
        private static BlockchainTest Convert(string name, BlockchainTestJson testJson)
        {
            BlockchainTest test = new BlockchainTest();

            test.Name               = name;
            test.Network            = testJson.EthereumNetwork;
            test.LastBlockHash      = new Keccak(testJson.LastBlockHash);
            test.GenesisRlp         = new Rlp(Hex.ToBytes(testJson.GenesisRlp));
            test.GenesisBlockHeader = testJson.GenesisBlockHeader;
            test.Blocks             = testJson.Blocks;
            test.PostState          = testJson.PostState.ToDictionary(p => new Address(p.Key), p => Convert(p.Value));
            test.Pre = testJson.Pre.ToDictionary(p => new Address(p.Key), p => Convert(p.Value));
            return(test);
        }
コード例 #7
0
        private void InitializeTestState(BlockchainTest test)
        {
            _stateProviders[test.Network].EthereumRelease = _protocolSpecificationProvider.GetSpec(EthereumNetwork.Frontier, 0);
            foreach (KeyValuePair <Address, AccountState> accountState in test.Pre)
            {
                foreach (KeyValuePair <BigInteger, byte[]> storageItem in accountState.Value.Storage)
                {
                    _storageProviders[test.Network].Set(accountState.Key, storageItem.Key, storageItem.Value);
                }

                _stateProviders[test.Network].CreateAccount(accountState.Key, accountState.Value.Balance);
                Keccak codeHash = _stateProviders[test.Network].UpdateCode(accountState.Value.Code);
                _stateProviders[test.Network].UpdateCodeHash(accountState.Key, codeHash);
                for (int i = 0; i < accountState.Value.Nonce; i++)
                {
                    _stateProviders[test.Network].IncrementNonce(accountState.Key);
                }
            }

            _storageProviders[test.Network].Commit();
            _stateProviders[test.Network].Commit();
        }
コード例 #8
0
 public async Task Test(BlockchainTest test)
 {
     await RunTest(test);
 }
コード例 #9
0
ファイル: AttackTests.cs プロジェクト: tr002196/nethermind
 public void Test(BlockchainTest test)
 {
     Assert.True(RunTest(test).Pass);
 }
コード例 #10
0
        private void RunAssertions(BlockchainTest test, Block headBlock)
        {
            TestBlockHeaderJson testHeaderJson = test.Blocks
                                                 .Where(b => b.BlockHeader != null)
                                                 .SingleOrDefault(b => new Keccak(b.BlockHeader.Hash) == headBlock.Hash)?.BlockHeader ?? test.GenesisBlockHeader;
            BlockHeader   testHeader  = Convert(testHeaderJson);
            List <string> differences = new List <string>();

            foreach (KeyValuePair <Address, AccountState> accountState in test.PostState)
            {
                if (differences.Count > 8)
                {
                    Console.WriteLine("More than 8 differences...");
                    break;
                }

                bool       accountExists = _stateProviders[test.Network].AccountExists(accountState.Key);
                BigInteger?balance       = accountExists ? _stateProviders[test.Network].GetBalance(accountState.Key) : (BigInteger?)null;
                BigInteger?nonce         = accountExists ? _stateProviders[test.Network].GetNonce(accountState.Key) : (BigInteger?)null;

                if (accountState.Value.Balance != balance)
                {
                    differences.Add($"{accountState.Key} balance exp: {accountState.Value.Balance}, actual: {balance}, diff: {balance - accountState.Value.Balance}");
                }

                if (accountState.Value.Nonce != nonce)
                {
                    differences.Add($"{accountState.Key} nonce exp: {accountState.Value.Nonce}, actual: {nonce}");
                }

                byte[] code = accountExists ? _stateProviders[test.Network].GetCode(accountState.Key) : new byte[0];
                if (!Bytes.UnsafeCompare(accountState.Value.Code, code))
                {
                    differences.Add($"{accountState.Key} code exp: {accountState.Value.Code?.Length}, actual: {code?.Length}");
                }

                foreach (KeyValuePair <BigInteger, byte[]> storageItem in accountState.Value.Storage)
                {
                    byte[] value = _storageProviders[test.Network].Get(accountState.Key, storageItem.Key) ?? new byte[0];
                    if (!Bytes.UnsafeCompare(storageItem.Value, value))
                    {
                        differences.Add($"{accountState.Key} storage[{storageItem.Key}] exp: {Hex.FromBytes(storageItem.Value, true)}, actual: {Hex.FromBytes(value, true)}");
                    }
                }
            }


            BigInteger gasUsed = headBlock.Header.GasUsed;

            if ((testHeader?.GasUsed ?? 0) != gasUsed)
            {
                differences.Add($"GAS USED exp: {testHeader?.GasUsed ?? 0}, actual: {gasUsed}");
            }

            if (headBlock.Transactions.Any() && testHeader.Bloom.ToString() != headBlock.Receipts.Last().Bloom.ToString())
            {
                differences.Add($"BLOOM exp: {testHeader.Bloom}, actual: {headBlock.Receipts.Last().Bloom}");
            }

            if (testHeader.StateRoot != _stateProviders[test.Network].StateRoot)
            {
                differences.Add($"STATE ROOT exp: {testHeader.StateRoot}, actual: {_stateProviders[test.Network].StateRoot}");
            }

            if (testHeader.TransactionsRoot != headBlock.Header.TransactionsRoot)
            {
                differences.Add($"TRANSACTIONS ROOT exp: {testHeader.TransactionsRoot}, actual: {headBlock.Header.TransactionsRoot}");
            }

            if (testHeader.ReceiptsRoot != headBlock.Header.ReceiptsRoot)
            {
                differences.Add($"RECEIPT ROOT exp: {testHeader.ReceiptsRoot}, actual: {headBlock.Header.ReceiptsRoot}");
            }

            foreach (string difference in differences)
            {
                _logger?.Log(difference);
            }

            Assert.Zero(differences.Count, "differences");
        }
コード例 #11
0
        protected void RunTest(BlockchainTest test, Stopwatch stopwatch = null)
        {
            LoggingTraceListener traceListener = new LoggingTraceListener(_logger);

            // TODO: not supported in .NET Core, need to replace?
//            Debug.Listeners.Clear();
//            Debug.Listeners.Add(traceListener);

            InitializeTestState(test);

            // TODO: transition...
            _stateProviders[test.Network].EthereumRelease = _protocolSpecificationProvider.GetSpec(test.Network, 0);

            IEthereumRelease spec           = _protocolSpecificationProvider.GetSpec(test.Network, 1);
            IEthereumSigner  signer         = new EthereumSigner(spec, ChainId.MainNet);
            IBlockProcessor  blockProcessor = new BlockProcessor(
                spec,
                _chain,
                _blockValidators[test.Network],
                new ProtocolBasedDifficultyCalculator(spec),
                new RewardCalculator(spec),
                new TransactionProcessor(
                    spec,
                    _stateProviders[test.Network],
                    _storageProviders[test.Network],
                    _virtualMachines[test.Network],
                    signer,
                    ShouldLog.Processing ? _logger : null),
                _multiDb,
                _stateProviders[test.Network],
                _storageProviders[test.Network],
                new TransactionStore(),
                ShouldLog.Processing ? _logger : null);

            IBlockchainProcessor blockchainProcessor = new BlockchainProcessor(
                test.GenesisRlp,
                blockProcessor,
                _chain,
                ShouldLog.Processing ? _logger : null);

            var rlps = test.Blocks.Select(tb => new Rlp(Hex.ToBytes(tb.Rlp))).ToArray();

            for (int i = 0; i < rlps.Length; i++)
            {
                stopwatch?.Start();
                try
                {
                    blockchainProcessor.Process(rlps[i]);
                }
                catch (InvalidBlockException ex)
                {
                }
                catch (Exception ex)
                {
                    _logger?.Log(ex.ToString());
                }

                stopwatch?.Stop();
            }

            RunAssertions(test, blockchainProcessor.HeadBlock);
        }