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)); }
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)); }
public ControllerThread(SimpleBlockchain chain, OptimizedLineage opti, BoundedInbox inbox, BoundedInbox outbox) { _chain = chain; _opti = opti; _inbox = inbox; _outbox = outbox; }
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)); }
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()); }