예제 #1
0
        public void CreateOptiNothingPruneable()
        {
            AddValidBlocksWithFork();
            var id = _chain.OpenBlock(_3).Alias;

            _chain.CommitBlock(id, new BlockId(new Hash256(0x11UL, 0x13UL, 0x14UL, 0x15UL)));
            // Prolong pruneable fork
            id = _chain.OpenBlock(_4).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x12UL, 0x13UL, 0x14UL, 0x15UL)));
            // Create new fork
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x13UL, 0x13UL, 0x14UL, 0x15UL)));
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x14UL, 0x13UL, 0x14UL, 0x15UL)));

            var opti = new OptimizedLineage(new BlockchainStrategies().GetQuasiOrphans(_chain), BlockAlias.Genesis);

            // Is on main chain
            Assert.False(opti.IsPruneable(_3));
            Assert.False(opti.IsPruneable(_7));
            // Everything is above limit
            Assert.False(opti.IsPruneable(_4));
            Assert.False(opti.IsPruneable(_6));
            Assert.False(opti.IsPruneable(_8));
        }
예제 #2
0
        public void CreateOptiEverythingPruneable()
        {
            AddValidBlocksWithFork();

            var id = _chain.OpenBlock(_3).Alias;

            _chain.CommitBlock(id, new BlockId(new Hash256(0x11UL, 0x13UL, 0x14UL, 0x15UL)));
            // Prolong pruneable fork
            id = _chain.OpenBlock(_4).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x12UL, 0x13UL, 0x14UL, 0x15UL)));
            // Create new fork
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x13UL, 0x13UL, 0x14UL, 0x15UL)));
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x14UL, 0x13UL, 0x14UL, 0x15UL)));

            var opti = new OptimizedLineage(new BlockchainStrategies().GetQuasiOrphans(_chain), _3);

            // Is on main chain
            Assert.False(opti.IsPruneable(_3));
            Assert.False(opti.IsPruneable(_7));
            Assert.False(opti.IsPruneable(_2));
            // Child of branch which is below limit
            Assert.True(opti.IsPruneable(_4));
            Assert.True(opti.IsPruneable(_6));
            // still above limit
            Assert.False(opti.IsPruneable(_8));

            id = _chain.OpenBlock(_7).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x15UL, 0x13UL, 0x14UL, 0x15UL)));
            opti = new OptimizedLineage(new BlockchainStrategies().GetQuasiOrphans(_chain), _7);

            // passed below limit
            Assert.True(opti.IsPruneable(_8));
        }
예제 #3
0
 public ControllerThread(SimpleBlockchain chain, OptimizedLineage opti, BoundedInbox inbox, BoundedInbox outbox)
 {
     _chain  = chain;
     _opti   = opti;
     _inbox  = inbox;
     _outbox = outbox;
 }
예제 #4
0
        public void OptimizedLineageIsAncestor()
        {
            AddValidBlocksWithFork();

            var opti = new OptimizedLineage(new BlockchainStrategies().GetQuasiOrphans(_chain), _5);

            // 2 is the empty block
            Assert.False(opti.IsAncestor(_2, _3));
            Assert.False(opti.IsAncestor(_1, _3));
            Assert.True(opti.IsAncestor(_3, _1));
            Assert.True(opti.IsAncestor(_3, _3));
            // _4 is a fork to 3
            Assert.False(opti.IsAncestor(_3, _4));
            Assert.True(opti.IsAncestor(_4, _1));
            Assert.True(opti.IsAncestor(_4, BlockAlias.GenesisParent));
        }
예제 #5
0
        public void Setup()
        {
            var id = _chain.OpenFirstBlock().Alias;

            _chain.CommitBlock(id, BlockId.Genesis);

            id = _chain.OpenBlock(_1).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0x11111111UL, 0x22222222UL, 0x33333333UL, 0x44444444UL)));
            id = _chain.OpenBlock(_2).Alias;
            _chain.CommitBlock(id, new BlockId(new Hash256(0xFFFFFFFFUL, 0xEEEEEEEEUL, 0xDDDDDDDDUL, 0xCCCCCCCCUL)));
            // Second child for block 2
            id = _chain.OpenBlock(_2).Alias;
            _chain.CommitBlock(id,
                               new BlockId(new Hash256(0x1111111122UL, 0x2222222233UL, 0x3333333344UL, 0x4444444455UL)));
            // main chain prolonged
            id = _chain.OpenBlock(_3).Alias;
            _chain.CommitBlock(id,
                               new BlockId(new Hash256(0x1111111122UL, 0x2222222233UL, 0x3333333344UL, 0x4444444455UL)));
            // side chain prolonged
            id = _chain.OpenBlock(_4).Alias;
            _chain.CommitBlock(id,
                               new BlockId(new Hash256(0x1111111122UL, 0x2222222233UL, 0x3333333344UL, 0x4444444455UL)));
            // fork on end of main chain
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id,
                               new BlockId(new Hash256(0x1111111122UL, 0x2222222233UL, 0x3333333344UL, 0x4444444455UL)));
            id = _chain.OpenBlock(_5).Alias;
            _chain.CommitBlock(id,
                               new BlockId(new Hash256(0x1111111122UL, 0x2222222233UL, 0x3333333344UL, 0x4444444455UL)));

            var chainStrategy = new BlockchainStrategies();
            var opti          = new OptimizedLineage(chainStrategy.GetQuasiOrphans(_chain), _2);

            _controller = new ControllerThread(_chain, opti, _inbox = BoundedInbox.Create(),
                                               _outbox = BoundedInbox.Create());
        }