forked from LBRYCommunity/lbry-sdk
add block_txs index
This commit is contained in:
parent
dfe855c0c9
commit
09e0d5c55e
4 changed files with 42 additions and 6 deletions
|
@ -1440,6 +1440,7 @@ class BlockProcessor:
|
||||||
|
|
||||||
self.db.prefix_db.block_hash.stage_put(key_args=(height,), value_args=(self.coin.header_hash(block.header),))
|
self.db.prefix_db.block_hash.stage_put(key_args=(height,), value_args=(self.coin.header_hash(block.header),))
|
||||||
self.db.prefix_db.header.stage_put(key_args=(height,), value_args=(block.header,))
|
self.db.prefix_db.header.stage_put(key_args=(height,), value_args=(block.header,))
|
||||||
|
self.db.prefix_db.block_txs.stage_put(key_args=(height,), value_args=([tx_hash for tx, tx_hash in txs],))
|
||||||
|
|
||||||
for tx, tx_hash in txs:
|
for tx, tx_hash in txs:
|
||||||
spent_claims = {}
|
spent_claims = {}
|
||||||
|
|
|
@ -39,3 +39,4 @@ class DB_PREFIXES(enum.Enum):
|
||||||
db_state = b's'
|
db_state = b's'
|
||||||
channel_count = b'Z'
|
channel_count = b'Z'
|
||||||
support_amount = b'a'
|
support_amount = b'a'
|
||||||
|
block_txs = b'b'
|
||||||
|
|
|
@ -169,6 +169,14 @@ class BlockHashValue(NamedTuple):
|
||||||
return f"{self.__class__.__name__}(block_hash={self.block_hash.hex()})"
|
return f"{self.__class__.__name__}(block_hash={self.block_hash.hex()})"
|
||||||
|
|
||||||
|
|
||||||
|
class BlockTxsKey(NamedTuple):
|
||||||
|
height: int
|
||||||
|
|
||||||
|
|
||||||
|
class BlockTxsValue(NamedTuple):
|
||||||
|
tx_hashes: typing.List[bytes]
|
||||||
|
|
||||||
|
|
||||||
class TxCountKey(NamedTuple):
|
class TxCountKey(NamedTuple):
|
||||||
height: int
|
height: int
|
||||||
|
|
||||||
|
@ -1540,6 +1548,36 @@ class DBStatePrefixRow(PrefixRow):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BlockTxsPrefixRow(PrefixRow):
|
||||||
|
prefix = DB_PREFIXES.block_txs.value
|
||||||
|
key_struct = struct.Struct(b'>L')
|
||||||
|
key_part_lambdas = [
|
||||||
|
lambda: b'',
|
||||||
|
struct.Struct(b'>L').pack
|
||||||
|
]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pack_key(cls, height: int):
|
||||||
|
return super().pack_key(height)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def unpack_key(cls, key: bytes) -> BlockTxsKey:
|
||||||
|
return BlockTxsKey(*super().unpack_key(key))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pack_value(cls, tx_hashes: typing.List[bytes]) -> bytes:
|
||||||
|
assert all(len(tx_hash) == 32 for tx_hash in tx_hashes)
|
||||||
|
return b''.join(tx_hashes)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def unpack_value(cls, data: bytes) -> BlockTxsValue:
|
||||||
|
return BlockTxsValue([data[i*32:(i+1)*32] for i in range(len(data) // 32)])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pack_item(cls, height, tx_hashes):
|
||||||
|
return cls.pack_key(height), cls.pack_value(tx_hashes)
|
||||||
|
|
||||||
|
|
||||||
class LevelDBStore(KeyValueStorage):
|
class LevelDBStore(KeyValueStorage):
|
||||||
def __init__(self, path: str, cache_mb: int, max_open_files: int):
|
def __init__(self, path: str, cache_mb: int, max_open_files: int):
|
||||||
import plyvel
|
import plyvel
|
||||||
|
@ -1604,6 +1642,7 @@ class HubDB(PrefixDB):
|
||||||
self.channel_count = ChannelCountPrefixRow(db, self._op_stack)
|
self.channel_count = ChannelCountPrefixRow(db, self._op_stack)
|
||||||
self.db_state = DBStatePrefixRow(db, self._op_stack)
|
self.db_state = DBStatePrefixRow(db, self._op_stack)
|
||||||
self.support_amount = SupportAmountPrefixRow(db, self._op_stack)
|
self.support_amount = SupportAmountPrefixRow(db, self._op_stack)
|
||||||
|
self.block_txs = BlockTxsPrefixRow(db, self._op_stack)
|
||||||
|
|
||||||
|
|
||||||
def auto_decode_item(key: bytes, value: bytes) -> Union[Tuple[NamedTuple, NamedTuple], Tuple[bytes, bytes]]:
|
def auto_decode_item(key: bytes, value: bytes) -> Union[Tuple[NamedTuple, NamedTuple], Tuple[bytes, bytes]]:
|
||||||
|
|
|
@ -923,12 +923,7 @@ class LevelDB:
|
||||||
return None, tx_height
|
return None, tx_height
|
||||||
|
|
||||||
def get_block_txs(self, height: int) -> List[bytes]:
|
def get_block_txs(self, height: int) -> List[bytes]:
|
||||||
return [
|
return self.prefix_db.block_txs.get(height).tx_hashes
|
||||||
tx_hash for tx_hash in self.prefix_db.tx_hash.iterate(
|
|
||||||
start=(self.tx_counts[height-1],), stop=(self.tx_counts[height],),
|
|
||||||
deserialize_value=False, include_key=False
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
def _fs_transactions(self, txids: Iterable[str]):
|
def _fs_transactions(self, txids: Iterable[str]):
|
||||||
tx_counts = self.tx_counts
|
tx_counts = self.tx_counts
|
||||||
|
|
Loading…
Reference in a new issue