public bool TryGetTransaction(UInt256 blockHash, int txIndex, out BlockTx transaction)
{
using (var handle = this.cursorCache.TakeItem())
{
var cursor = handle.Item;
using (var jetTx = cursor.jetSession.BeginTransaction())
{
int blockIndex;
if (!TryGetBlockIndex(cursor, blockHash, out blockIndex))
{
transaction = null;
return false;
}
Api.JetSetCurrentIndex(cursor.jetSession, cursor.blocksTableId, "IX_BlockIndexTxIndex");
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, txIndex, MakeKeyGrbit.None);
if (Api.TrySeek(cursor.jetSession, cursor.blocksTableId, SeekGrbit.SeekEQ))
{
var blockTxHashColumn = new BytesColumnValue { Columnid = cursor.blockTxHashColumnId };
var blockTxBytesColumn = new BytesColumnValue { Columnid = cursor.blockTxBytesColumnId };
Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, blockTxHashColumn, blockTxBytesColumn);
if (blockTxBytesColumn.Value != null)
{
var txHash = DbEncoder.DecodeUInt256(blockTxHashColumn.Value);
transaction = new BlockTx(txIndex, txHash, blockTxBytesColumn.Value.ToImmutableArray());
return true;
}
else
{
transaction = null;
return false;
}
}
else
{
transaction = null;
return false;
}
}
}
}