public void AddValidBlocksWithForkAllUncommitted() { _store = new ChainStore( new MemoryMappedFileSlim(MemoryMappedFile.CreateNew(null, 10000))); _store.TryOpenBlock(CommittedBlockId.GenesisParent, out var tmpBlock); // U(0) _tmpId1 = tmpBlock.BlockId; _store.TryCommitBlock(tmpBlock.Alias, CommittedBlockId.Genesis, out _); // C(0) _store.TryOpenBlock(CommittedBlockId.Genesis, out var tmp2Block); // C(0) -> U(1) Assert.Equal(tmp2Block.Alias, _1); _tmpId2 = tmp2Block.BlockId; _store.TryCommitBlock(tmp2Block.Alias, _hash1, out _); // C(0) -> C(1) _store.TryOpenBlock(_hash1, out var b1); Assert.Equal(_2, b1.Alias); _tmpId3 = b1.BlockId; // C(0) -> C(1) -> U(2) // Second child for second block _store.TryOpenBlock(_hash1, out b1); Assert.Equal(_2_1, b1.Alias); _tmpId4 = b1.BlockId; // C(0) -> C(1) -> U(2) // \-> U(2-1) }
public CommitBlockResponse CommitBlock(CommitBlockRequest request) { var status = _store.TryCommitBlock(request.BlockAlias, request.BlockId, out _); var requestId = request.MessageHeader.RequestId; var clientId = request.MessageHeader.ClientId; switch (status) { case CommitBlockStatus.Success: RefreshAndPropagateLineage(); return(new CommitBlockResponse(requestId, clientId, Messaging.CommitBlockStatus.Success, _pool)); case CommitBlockStatus.BlockNotFound: return(new CommitBlockResponse(requestId, clientId, Messaging.CommitBlockStatus.BlockNotFound, _pool)); case CommitBlockStatus.BlockIdMismatch: return(new CommitBlockResponse(requestId, clientId, Messaging.CommitBlockStatus.BlockIdMismatch, _pool)); default: throw new NotSupportedException(); } }
public void AddValidBlocksWithFork() { _store = new ChainStore( new MemoryMappedFileSlim(MemoryMappedFile.CreateNew(null, 10000))); _store.TryOpenBlock(CommittedBlockId.GenesisParent, out var b0); var id0 = b0.Alias; // U(0) _store.TryCommitBlock(id0, CommittedBlockId.Genesis, out _); // C(0) _store.TryOpenBlock(CommittedBlockId.Genesis, out var b1); var id1 = b1.Alias; // C(0) -> U(1) _store.TryCommitBlock(id1, _hash1, out _); // C(0) -> C(1) Assert.Equal(_1, id1); _store.TryOpenBlock(_hash1, out var b2); var id2 = b2.Alias; // C(0) -> C(1) -> U(2) Assert.Equal(_2, id2); _store.TryCommitBlock(id2, _hash2, out _); // C(0) -> C(1) -> C(2) // Second child for second block _store.TryOpenBlock(_hash1, out var b21); var id21 = b21.Alias; // C(0) -> C(1) -> C(2) // \-> U(2-1) Assert.Equal(_2_1, id21); _store.TryCommitBlock(id21, _hash3, out _); // C(0) -> C(1) -> C(2) // \-> C(2-1) }
public void RetrieveBlock() { AddValidBlocksWithForkAllUncommitted(); Assert.True(_store.TryGetCommittedBlock(BlockAlias.Genesis, out var genesisBlock)); Assert.True(_store.TryGetCommittedBlock(_1, out var height1Block)); Assert.True(_store.TryGetUncommittedBlock(_2, out var firstBlockU)); Assert.True(_store.TryGetUncommittedBlock(_2_1, out var secondBlockU)); Assert.Equal(CommittedBlockId.Genesis, genesisBlock.BlockId); Assert.Equal(_hash1, height1Block.BlockId); Assert.Equal(_tmpId3, firstBlockU.BlockId); Assert.Equal(_tmpId4, secondBlockU.BlockId); Assert.Equal(_1, firstBlockU.Parent); Assert.Equal(_1, secondBlockU.Parent); Assert.Equal(0, genesisBlock.BlockHeight); Assert.Equal(2, firstBlockU.BlockHeight); Assert.Equal(2, secondBlockU.BlockHeight); var status1 = _store.TryCommitBlock(_2, _hash1, out _); var status2 = _store.TryCommitBlock(_2_1, _hash2, out _); Assert.Equal(CommitBlockStatus.Success, status1); Assert.Equal(CommitBlockStatus.Success, status2); Assert.True(_store.TryGetCommittedBlock(_2, out var firstBlock)); Assert.True(_store.TryGetCommittedBlock(_2_1, out var secondBlock)); Assert.Equal(_hash1, firstBlock.BlockId); Assert.Equal(_hash2, secondBlock.BlockId); Assert.Equal(_1, firstBlock.Parent); Assert.Equal(_1, secondBlock.Parent); Assert.Equal(0, genesisBlock.BlockHeight); Assert.Equal(2, firstBlock.BlockHeight); Assert.Equal(2, secondBlock.BlockHeight); }
public void AddBlockToCommittedParent() { _store = new ChainStore( new MemoryMappedFileSlim(MemoryMappedFile.CreateNew(null, 10000))); var status1 = _store.TryOpenBlock(CommittedBlockId.GenesisParent, out var block1); Assert.True(OpenBlockStatus.Success.Equals(status1)); var id = block1.Alias; var status2 = _store.TryCommitBlock(id, CommittedBlockId.Genesis, out _); Assert.Equal(CommitBlockStatus.Success, status2); Assert.Equal(BlockAlias.Genesis, id); var status3 = _store.TryOpenBlock(CommittedBlockId.Genesis, out _); Assert.Equal(OpenBlockStatus.Success, status3); }