Example #1
0
 def get_hash_tree_root_and_leaves(
         self, value: Sequence[bool],
         cache: CacheObj) -> Tuple[Hash32, CacheObj]:
     root, cache = merkleize_with_cache(pack_bits(value),
                                        cache=cache,
                                        limit=self.chunk_count)
     return mix_in_length(root, len(value)), cache
Example #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)
Example #3
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))
Example #4
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
Example #5
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:
Example #6
0
 def get_hash_tree_root(self, value: Sequence[bool]) -> bytes:
     return mix_in_length(
         merkleize(pack_bits(value), limit=self.chunk_count), len(value))
Example #7
0
 def hash_tree_root(self) -> Hash32:
     return mix_in_length(self.raw_root, len(self))
Example #8
0
def test_mix_in_length(root, length, result):
    assert mix_in_length(root, length) == result
Example #9
0
 def hash_tree_root(self, value: bytes) -> bytes:
     merkle_leaves = pack_bytes(value)
     merkleized = merkleize(merkle_leaves)
     return mix_in_length(merkleized, len(value))