Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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))
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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:
Exemplo n.º 8
0
 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
Exemplo n.º 9
0
 def get_hash_tree_root(self, value: TSerializable) -> Hash32:
     serialized_value = self.serialize(value)
     return merkleize(pack((serialized_value, )))  # type: ignore
Exemplo n.º 10
0
 def hash_tree_root(self, value: TSerializable) -> bytes:
     serialized_value = self.serialize(value)
     return merkleize(pack((serialized_value, )))
Exemplo n.º 11
0
def test_pack_bytes(data):
    byte_list = tuple(bytes([byte]) for byte in data)
    assert pack_bytes(data) == pack(byte_list)
Exemplo n.º 12
0
def test_pack(values, packed):
    assert pack(values) == packed