public BlockTxNode ReadNode() { UInt256 recordBlockHash; int txIndex; DbEncoder.DecodeBlockHashTxIndex(iterator.Key().ToArray(), out recordBlockHash, out txIndex); if (this.blockHash != recordBlockHash) { throw new InvalidOperationException(); } BlockTxNode blockTxNode; if (updates.TryGetValue(txIndex, out blockTxNode)) { if (blockTxNode == null) { throw new InvalidOperationException(); } return(blockTxNode); } else { return(DataDecoder.DecodeBlockTxNode(iterator.Value().ToArray(), skipTxBytes: true)); } }
private IEnumerator <BlockTxNode> ReadBlockTransactions(UInt256 blockHash, bool requireTx) { 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) { yield break; } var value = iterator.Value().ToArray(); var blockTxNode = DataDecoder.DecodeBlockTxNode(value); if (blockTxNode.Pruned && requireTx) { throw new MissingDataException(blockHash); } yield return(blockTxNode); iterator.Next(); } } } }
public bool TryGetTransaction(UInt256 blockHash, int txIndex, out BlockTx transaction) { Slice value; if (db.TryGet(new ReadOptions(), DbEncoder.EncodeBlockHashTxIndex(blockHash, txIndex), out value)) { var blockTxNode = DataDecoder.DecodeBlockTxNode(value.ToArray()); if (!blockTxNode.Pruned) { transaction = blockTxNode.ToBlockTx(); return(true); } else { transaction = default(BlockTx); return(false); } } else { transaction = default(BlockTx); return(false); } }