def hash_tree_root(self, value: Sequence[TSerializableElement]) -> bytes: if isinstance(self.element_sedes, BasicSedes): serialized_elements = tuple( self.element_sedes.serialize(element) for element in value) return merkleize(pack(serialized_elements)) else: element_tree_hashes = tuple( self.element_sedes.hash_tree_root(element) for element in value) return merkleize(element_tree_hashes)
def hash_tree_root(self, value: Iterable[TSerializable]) -> bytes: if isinstance(self.element_sedes, BasicSedes): serialized_items = tuple( self.element_sedes.serialize(element) for element in value) length = len(serialized_items) merkle_leaves = pack(serialized_items) else: merkle_leaves = tuple( self.element_sedes.hash_tree_root(element) for element in value) length = len(merkle_leaves) return mix_in_length(merkleize(merkle_leaves), length)
def get_hash_tree_root(self, value: Sequence[Any]) -> bytes: if isinstance(value, BaseHashableStructure) and value.sedes == self: return value.hash_tree_root if isinstance(self.element_sedes, BasicSedes): serialized_elements = tuple( self.element_sedes.serialize(element) for element in value) return merkleize(pack(serialized_elements)) else: element_tree_hashes = tuple( self.element_sedes.get_hash_tree_root(element) for element in value) return merkleize(element_tree_hashes)
def get_hash_tree_root(self, value: Iterable[TSerializable]) -> bytes: if isinstance(value, BaseHashableStructure) and value.sedes == self: return value.hash_tree_root if isinstance(self.element_sedes, BasicSedes): serialized_items = tuple( self.element_sedes.serialize(element) for element in value) merkle_leaves = pack(serialized_items) else: merkle_leaves = tuple( self.element_sedes.get_hash_tree_root(element) for element in value) return mix_in_length(merkleize(merkle_leaves, limit=self.chunk_count), len(value))
def get_hash_tree_root_and_leaves( self, value: Sequence[Any], cache: CacheObj) -> Tuple[Hash32, CacheObj]: merkle_leaves = () if isinstance(self.element_sedes, BasicSedes): serialized_elements = tuple( self.element_sedes.serialize(element) for element in value) merkle_leaves = pack(serialized_elements) else: has_get_hash_tree_root_and_leaves = hasattr( self.element_sedes, "get_hash_tree_root_and_leaves") if has_get_hash_tree_root_and_leaves: merkle_leaves = get_merkle_leaves_with_cache( value, self.element_sedes, cache) else: merkle_leaves = get_merkle_leaves_without_cache( value, self.element_sedes) return merkleize_with_cache(merkle_leaves, cache=cache, limit=self.chunk_count)
def get_hash_tree_root_and_leaves( self, value: TSerializable, cache: CacheObj) -> Tuple[Hash32, CacheObj]: merkle_leaves = () if isinstance(self.element_sedes, BasicSedes): serialized_items = tuple( self.element_sedes.serialize(element) for element in value) merkle_leaves = pack(serialized_items) else: has_get_hash_tree_root_and_leaves = hasattr( self.element_sedes, "get_hash_tree_root_and_leaves") if has_get_hash_tree_root_and_leaves: merkle_leaves = get_merkle_leaves_with_cache( value, self.element_sedes, cache) else: merkle_leaves = get_merkle_leaves_without_cache( value, self.element_sedes) merkleize_result, cache = merkleize_with_cache(merkle_leaves, cache=cache, limit=self.chunk_count) return mix_in_length(merkleize_result, len(value)), cache
BaseSedes, BasicSedes, CompositeSedes, ) from ssz.utils import ( merkleize, mix_in_length, pack, read_exact, s_decode_offset, ) TSerializable = TypeVar("TSerializable") TDeserialized = TypeVar("TDeserialized") EMPTY_LIST_HASH_TREE_ROOT = mix_in_length(merkleize(pack([])), 0) class EmptyList(BaseCompositeSedes[Sequence[TSerializable], Tuple[TSerializable, ...]]): is_fixed_sized = False def get_fixed_size(self): raise NotImplementedError("Empty list does not implement `get_fixed_size`") def serialize(self, value: Sequence[TSerializable]): if len(value): raise SerializationError("Cannot serialize non-empty sequence using `EmptyList` sedes") return b'' def deserialize(self, data: bytes) -> Tuple[TDeserialized, ...]: if data:
def get_hash_tree_root_and_leaves( self, value: TSerializable, cache: CacheObj) -> Tuple[Hash32, CacheObj]: serialized_value = self.serialize(value) return merkleize_with_cache(pack((serialized_value, )), cache=cache) # type: ignore
def get_hash_tree_root(self, value: TSerializable) -> Hash32: serialized_value = self.serialize(value) return merkleize(pack((serialized_value, ))) # type: ignore
def hash_tree_root(self, value: TSerializable) -> bytes: serialized_value = self.serialize(value) return merkleize(pack((serialized_value, )))
def test_pack_bytes(data): byte_list = tuple(bytes([byte]) for byte in data) assert pack_bytes(data) == pack(byte_list)
def test_pack(values, packed): assert pack(values) == packed