public bool TryAddChainedHeader(ChainedHeader chainedHeader) { var key = MakeHeaderKey(chainedHeader.Hash); Slice existingValue; if (db.TryGet(ReadOptions.Default, key, out existingValue)) return false; var writeBatch = new WriteBatch(); try { writeBatch.Put(key, DataEncoder.EncodeChainedHeader(chainedHeader)); writeBatch.Put(MakeTotalWorkKey(chainedHeader.Hash, chainedHeader.TotalWork), new byte[1]); db.Write(WriteOptions.Default, writeBatch); } finally { writeBatch.Dispose(); } return true; }
public void DeleteElements(IEnumerable<KeyValuePair<UInt256, IEnumerable<int>>> blockTxIndices) { var writeBatch = new WriteBatch(); try { foreach (var keyPair in blockTxIndices) { var blockHash = keyPair.Key; var txIndices = keyPair.Value; // prune the transactions foreach (var index in txIndices) { writeBatch.Delete(DbEncoder.EncodeBlockHashTxIndex(blockHash, index)); } } db.Write(new WriteOptions(), writeBatch); } finally { writeBatch.Dispose(); } }
public bool TryRemoveBlockTransactions(UInt256 blockHash) { if (!ContainsBlock(blockHash)) return false; var writeBatch = new WriteBatch(); try { using (var snapshot = db.GetSnapshot()) { var readOptions = new ReadOptions { Snapshot = snapshot }; using (var iterator = db.NewIterator(readOptions)) { iterator.Seek(DbEncoder.EncodeBlockHashTxIndex(blockHash, 0)); while (iterator.Valid()) { var key = iterator.Key().ToArray(); UInt256 iteratorBlockHash; int txIndex; DbEncoder.DecodeBlockHashTxIndex(key, out iteratorBlockHash, out txIndex); if (iteratorBlockHash != blockHash) break; writeBatch.Delete(key); iterator.Next(); } } } return TryRemoveBlockInner(blockHash, writeBatch); } finally { writeBatch.Dispose(); } }
public bool TryAddBlockTransactions(UInt256 blockHash, IEnumerable<EncodedTx> blockTxes) { if (ContainsBlock(blockHash)) return false; var writeBatch = new WriteBatch(); try { int txCount; using (var snapshot = db.GetSnapshot()) { var readOptions = new ReadOptions { Snapshot = snapshot }; var txIndex = 0; foreach (var tx in blockTxes) { var key = DbEncoder.EncodeBlockHashTxIndex(blockHash, txIndex); Slice existingValue; if (db.TryGet(readOptions, key, out existingValue)) return false; var blockTx = new BlockTx(txIndex, tx); var value = DataEncoder.EncodeBlockTxNode(blockTx); writeBatch.Put(key, value); txIndex++; } txCount = txIndex; } return TryAddBlockInner(blockHash, txCount, writeBatch); } finally { writeBatch.Dispose(); } }
public bool TryRemoveChainedHeader(UInt256 blockHash) { var key = MakeHeaderKey(blockHash); Slice existingValue; if (!db.TryGet(ReadOptions.Default, key, out existingValue)) return false; var chainedHeader = DataDecoder.DecodeChainedHeader(existingValue.ToArray()); var writeBatch = new WriteBatch(); try { writeBatch.Delete(key); writeBatch.Delete(MakeTotalWorkKey(blockHash, chainedHeader.TotalWork)); db.Write(WriteOptions.Default, writeBatch); } finally { writeBatch.Dispose(); } return true; }