@Test public void createSmallChain() { final BlockDataGenerator gen = new BlockDataGenerator(); final List<Block> chain = gen.blockSequence(3); final List<List<TransactionReceipt>> blockReceipts = chain.stream().map(gen::receipts).collect(Collectors.toList()); final KeyValueStorage kvStore = new InMemoryKeyValueStorage(); final DefaultMutableBlockchain blockchain = createBlockchain(kvStore, chain.get(0)); for (int i = 1; i < chain.size(); i++) { blockchain.appendBlock(chain.get(i), blockReceipts.get(i)); } for (int i = 1; i < chain.size(); i++) { assertBlockDataIsStored(blockchain, chain.get(i), blockReceipts.get(i)); } final Block head = chain.get(chain.size() - 1); assertBlockIsHead(blockchain, head); assertTotalDifficultiesAreConsistent(blockchain, head); assertThat(blockchain.getForks()).isEmpty(); }
@Test public void initializeNew() { final BlockDataGenerator gen = new BlockDataGenerator(); final KeyValueStorage kvStore = new InMemoryKeyValueStorage(); final Block genesisBlock = gen.genesisBlock(); final DefaultMutableBlockchain blockchain = createBlockchain(kvStore, genesisBlock); assertBlockDataIsStored(blockchain, genesisBlock, Collections.emptyList()); assertBlockIsHead(blockchain, genesisBlock); assertTotalDifficultiesAreConsistent(blockchain, genesisBlock); assertThat(blockchain.getForks()).isEmpty(); }
blockchain.appendBlock(chain.get(i), blockReceipts.get(i)); assertThat(blockchain.getForks()).isEmpty(); final Block originalHead = chain.get(chainLength - 1); assertTotalDifficultiesAreConsistent(blockchain, fork); final Set<Hash> forks = blockchain.getForks(); assertThat(forks.size()).isEqualTo(1); assertThat(forks.stream().anyMatch(f -> f.equals(originalHead.getHash()))).isTrue();
Set<Hash> forks = blockchain.getForks(); assertThat(forks.size()).isEqualTo(1); assertThat(forks.stream().anyMatch(f -> f.equals(forkBlocks.get(0).getHash()))).isTrue(); forks = blockchain.getForks(); assertThat(forks.size()).isEqualTo(1); assertThat(forks.stream().anyMatch(f -> f.equals(originalHead.getHash()))).isTrue();
Set<Hash> forks = blockchain.getForks(); assertThat(forks.size()).isEqualTo(1); assertThat(forks.stream().anyMatch(f -> f.equals(forkBlocks.get(0).getHash()))).isTrue(); forks = blockchain.getForks(); assertThat(forks.size()).isEqualTo(1); assertThat(forks.stream().anyMatch(f -> f.equals(originalHead.getHash()))).isTrue();
@Test public void initializeExisting() { final BlockDataGenerator gen = new BlockDataGenerator(); // Write to kv store final KeyValueStorage kvStore = new InMemoryKeyValueStorage(); final Block genesisBlock = gen.genesisBlock(); createBlockchain(kvStore, genesisBlock); // Initialize a new blockchain store with kvStore that already contains data final DefaultMutableBlockchain blockchain = createBlockchain(kvStore, genesisBlock); assertBlockDataIsStored(blockchain, genesisBlock, Collections.emptyList()); assertBlockIsHead(blockchain, genesisBlock); assertTotalDifficultiesAreConsistent(blockchain, genesisBlock); assertThat(blockchain.getForks()).isEmpty(); }
@Test public void appendBlock() { final BlockDataGenerator gen = new BlockDataGenerator(); final KeyValueStorage kvStore = new InMemoryKeyValueStorage(); final Block genesisBlock = gen.genesisBlock(); final DefaultMutableBlockchain blockchain = createBlockchain(kvStore, genesisBlock); final BlockOptions options = new BlockOptions().setBlockNumber(1L).setParentHash(genesisBlock.getHash()); final Block newBlock = gen.block(options); final List<TransactionReceipt> receipts = gen.receipts(newBlock); blockchain.appendBlock(newBlock, receipts); assertBlockIsHead(blockchain, newBlock); assertTotalDifficultiesAreConsistent(blockchain, newBlock); assertThat(blockchain.getForks()).isEmpty(); }