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));
            }
        }
Пример #2
0
        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();
                    }
                }
            }
        }
Пример #3
0
        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);
            }
        }