Ejemplo n.º 1
0
        public void New_terminal_block_when_ttd_reached()
        {
            TestSpecProvider specProvider = new(London.Instance);

            specProvider.TerminalTotalDifficulty = 5000000;
            Block     genesisBlock = Build.A.Block.WithNumber(0).TestObject;
            BlockTree blockTree    = Build.A.BlockTree(genesisBlock, specProvider).OfChainLength(4).TestObject;

            PoSSwitcher poSSwitcher = CreatePosSwitcher(blockTree, new MemDb(), specProvider);

            Assert.AreEqual(false, poSSwitcher.HasEverReachedTerminalBlock());
            Block block = Build.A.Block.WithTotalDifficulty(5000000L).WithNumber(4).WithParent(blockTree.Head !).WithDifficulty(1000000L).TestObject;
            Block alternativeTerminalBlock = Build.A.Block.WithTotalDifficulty(5000000L).WithNumber(4).WithParent(blockTree.Head !).WithGasLimit(20000000).WithDifficulty(1000000L).TestObject;

            blockTree.SuggestBlock(block);
            blockTree.UpdateMainChain(block);
            Assert.AreEqual(true, poSSwitcher.HasEverReachedTerminalBlock());
            Assert.AreEqual((true, false), poSSwitcher.GetBlockConsensusInfo(alternativeTerminalBlock.Header));
        }
Ejemplo n.º 2
0
        public void GetBlockSwitchInfo_returning_expected_results(long terminalTotalDifficulty)
        {
            TestSpecProvider specProvider = new(London.Instance);

            specProvider.TerminalTotalDifficulty = (UInt256)terminalTotalDifficulty;
            Block       genesisBlock = Build.A.Block.WithNumber(0).TestObject;
            BlockTree   blockTree    = Build.A.BlockTree(genesisBlock, specProvider).OfChainLength(6).TestObject;
            PoSSwitcher poSSwitcher  = CreatePosSwitcher(blockTree, new MemDb(), specProvider);

            BlockHeader?block3 = blockTree.FindHeader(3, BlockTreeLookupOptions.All);
            BlockHeader?block4 = blockTree.FindHeader(4, BlockTreeLookupOptions.All);
            BlockHeader?block5 = blockTree.FindHeader(5, BlockTreeLookupOptions.All);
            Block       blockWithPostMergeFlag = Build.A.Block.WithNumber(4).WithDifficulty(0).WithPostMergeFlag(true)
                                                 .WithParent(block3 !).TestObject;

            Assert.AreEqual((false, false), poSSwitcher.GetBlockConsensusInfo(block3 !));                     // PoWBlock
            Assert.AreEqual((true, false), poSSwitcher.GetBlockConsensusInfo(block4 !));                      // terminal block
            Assert.AreEqual((false, true), poSSwitcher.GetBlockConsensusInfo(block5 !));                      // incorrect PoW, TTD > TD and it is not terminal, so we should process it in the same way like post merge blocks
            Assert.AreEqual((false, true), poSSwitcher.GetBlockConsensusInfo(blockWithPostMergeFlag.Header)); // block with post merge flag
        }
Ejemplo n.º 3
0
        public void GetBlockSwitchInfo_returning_expected_results_when_td_null_or_zero(long terminalTotalDifficulty, bool nullTdValue)
        {
            TestSpecProvider specProvider = new(London.Instance);

            specProvider.TerminalTotalDifficulty = (UInt256)terminalTotalDifficulty;
            Block       genesisBlock = Build.A.Block.WithNumber(0).TestObject;
            BlockTree   blockTree    = Build.A.BlockTree(genesisBlock, specProvider).OfChainLength(6).TestObject;
            PoSSwitcher poSSwitcher  = CreatePosSwitcher(blockTree, new MemDb(), specProvider);

            BlockHeader?block3 = blockTree.FindHeader(3, BlockTreeLookupOptions.All);
            BlockHeader?block4 = blockTree.FindHeader(4, BlockTreeLookupOptions.All);
            BlockHeader?block5 = blockTree.FindHeader(5, BlockTreeLookupOptions.All);
            Block       blockWithPostMergeFlag = Build.A.Block.WithNumber(4).WithDifficulty(0).WithPostMergeFlag(true)
                                                 .WithParent(block3 !).TestObject;

            block3 !.TotalDifficulty = nullTdValue ? null : UInt256.Zero;
            block4 !.TotalDifficulty = nullTdValue ? null : UInt256.Zero;
            block5 !.TotalDifficulty = nullTdValue ? null : UInt256.Zero;
            Assert.AreEqual((false, false), poSSwitcher.GetBlockConsensusInfo(block3 !));                     // PoWBlock
            Assert.AreEqual((false, false), poSSwitcher.GetBlockConsensusInfo(block4 !));                     // terminal block
            Assert.AreEqual((false, false), poSSwitcher.GetBlockConsensusInfo(block5 !));
            Assert.AreEqual((false, true), poSSwitcher.GetBlockConsensusInfo(blockWithPostMergeFlag.Header)); // block with post merge flag
        }