diff --git a/chia/_tests/core/data_layer/test_merkle_blob.py b/chia/_tests/core/data_layer/test_merkle_blob.py index 26c62a42e15f..20a56db8c558 100644 --- a/chia/_tests/core/data_layer/test_merkle_blob.py +++ b/chia/_tests/core/data_layer/test_merkle_blob.py @@ -15,7 +15,7 @@ from chia_rs.datalayer import KeyId, TreeIndex, ValueId from chia._tests.util.misc import DataCase, Marks, datacases -from chia.data_layer.data_layer_util import InternalNode, Side, internal_hash +from chia.data_layer.data_layer_util import Side, internal_hash from chia.data_layer.util.merkle_blob import ( InvalidIndexError, KeyOrValueId, @@ -216,13 +216,6 @@ def test_merkle_blob_two_leafs_loads() -> None: ] assert merkle_blob.get_lineage_with_indexes(root.left) == expected - merkle_blob.calculate_lazy_hashes() - son_hash = bytes32(range(32)) - root_hash = internal_hash(son_hash, son_hash) - expected_node = InternalNode(root_hash, son_hash, son_hash) - assert merkle_blob.get_lineage_by_key_id(KeyId(KeyOrValueId(int64(0x0405060708090A0B)))) == [expected_node] - assert merkle_blob.get_lineage_by_key_id(KeyId(KeyOrValueId(int64(0x1415161718191A1B)))) == [expected_node] - def generate_kvid(seed: int) -> tuple[KeyId, ValueId]: kv_ids: list[KeyOrValueId] = [] diff --git a/chia/data_layer/data_store.py b/chia/data_layer/data_store.py index 22d2d99b88ca..2c8debe51c30 100644 --- a/chia/data_layer/data_store.py +++ b/chia/data_layer/data_store.py @@ -2,6 +2,7 @@ import contextlib import copy +import itertools import logging from collections import defaultdict from collections.abc import AsyncIterator, Awaitable @@ -860,7 +861,19 @@ async def get_ancestors( merkle_blob = await self.get_merkle_blob(root_hash=root_hash) reference_kid, _ = await self.get_node_by_hash(node_hash, store_id) - return merkle_blob.get_lineage_by_key_id(reference_kid) + reference_index = merkle_blob.key_to_index[reference_kid] + lineage = merkle_blob.get_lineage_with_indexes(reference_index) + result: list[InternalNode] = [] + for index, node in itertools.islice(lineage, 1, None): + assert isinstance(node, RawInternalMerkleNode) + result.append( + InternalNode( + hash=node.hash, + left_hash=merkle_blob.get_hash_at_index(node.left), + right_hash=merkle_blob.get_hash_at_index(node.right), + ) + ) + return result async def get_internal_nodes(self, store_id: bytes32, root_hash: Optional[bytes32] = None) -> list[InternalNode]: async with self.db_wrapper.reader() as reader: diff --git a/chia/data_layer/util/merkle_blob.py b/chia/data_layer/util/merkle_blob.py index 9cc7017bfaac..1a8a01424ca1 100644 --- a/chia/data_layer/util/merkle_blob.py +++ b/chia/data_layer/util/merkle_blob.py @@ -7,7 +7,7 @@ from chia_rs.datalayer import KeyId, TreeIndex, ValueId -from chia.data_layer.data_layer_util import InternalNode, ProofOfInclusion, ProofOfInclusionLayer, Side, internal_hash +from chia.data_layer.data_layer_util import ProofOfInclusion, ProofOfInclusionLayer, Side, internal_hash from chia.types.blockchain_format.sized_bytes import bytes32 from chia.util.hash import std_hash from chia.util.ints import int64, uint8, uint32 @@ -232,18 +232,6 @@ def get_lineage_with_indexes(self, index: TreeIndex) -> list[tuple[TreeIndex, Ra lineage.append((index, node)) return lineage - def get_lineage_by_key_id(self, key_id: KeyId) -> list[InternalNode]: - index = self.key_to_index[key_id] - lineage = self.get_lineage_with_indexes(index) - internal_nodes: list[InternalNode] = [] - for _, node in lineage[1:]: - assert isinstance(node, RawInternalMerkleNode) - left_node = self.get_raw_node(node.left) - right_node = self.get_raw_node(node.right) - internal_nodes.append(InternalNode(bytes32(node.hash), bytes32(left_node.hash), bytes32(right_node.hash))) - - return internal_nodes - def update_entry( self, index: TreeIndex,