예제 #1
0
    def __next__(self):
        if not self._c_iter_ptr:
            raise StopIteration()

        (c_address, c_address_len) = ffi.prepare_byte_result()
        (c_value, c_value_len) = ffi.prepare_byte_result()

        _libexec('merkle_db_leaf_iterator_next', self._c_iter_ptr,
                 ctypes.byref(c_address), ctypes.byref(c_address_len),
                 ctypes.byref(c_value), ctypes.byref(c_value_len))

        address = ffi.from_c_bytes(c_address, c_address_len).decode()
        value = _decode(ffi.from_c_bytes(c_value, c_value_len))

        return (address, value)
예제 #2
0
    def update(self, set_items, delete_items=None, virtual=True):
        """

        Args:
            set_items (dict): dict key, values where keys are addresses
            delete_items (list): list of addresses
            virtual (boolean): True if not committing to disk. I.e.,
                speculative root hash
        Returns:
            the state root after the operations
        """
        c_set_items = (ctypes.POINTER(_Entry) * len(set_items))()
        for (i, (key, value)) in enumerate(set_items.items()):
            c_set_items[i] = ctypes.pointer(_Entry.new(key, _encode(value)))

        if delete_items is None:
            delete_items = []

        c_delete_items = (ctypes.c_char_p * len(delete_items))()
        for (i, address) in enumerate(delete_items):
            c_delete_items[i] = ctypes.c_char_p(address.encode())

        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_update', self.pointer, c_set_items,
                 ctypes.c_size_t(len(set_items)), c_delete_items,
                 ctypes.c_size_t(len(delete_items)), virtual,
                 ctypes.byref(c_merkle_root), ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(c_merkle_root, c_merkle_root_len).decode()
예제 #3
0
    def get_merkle_root(self):
        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_get_merkle_root', self.pointer,
                 ctypes.byref(c_merkle_root), ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(
            c_merkle_root, c_merkle_root_len).decode()
예제 #4
0
    def delete(self, address):
        c_address = ctypes.c_char_p(address.encode())
        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_delete', self.pointer, c_address,
                 ctypes.byref(c_merkle_root), ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(c_merkle_root, c_merkle_root_len).decode()
예제 #5
0
    def finalize_block(self, consensus=None, force=False):
        (c_result, c_result_len) = ffi.prepare_byte_result()
        self._call('finalize_block', consensus, len(consensus),
                   ctypes.c_bool(force), ctypes.byref(c_result),
                   ctypes.byref(c_result_len))

        return ffi.from_c_bytes(c_result, c_result_len).decode('utf-8')
예제 #6
0
    def get_merkle_root(self):
        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_get_merkle_root', self.pointer,
                 ctypes.byref(c_merkle_root), ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(
            c_merkle_root, c_merkle_root_len).decode()
예제 #7
0
    def update(self, set_items, delete_items=None, virtual=True):
        """

        Args:
            set_items (dict): dict key, values where keys are addresses
            delete_items (list): list of addresses
            virtual (boolean): True if not committing to disk. I.e.,
                speculative root hash
        Returns:
            the state root after the operations
        """
        c_set_items = (ctypes.POINTER(_Entry) * len(set_items))()
        for (i, (key, value)) in enumerate(set_items.items()):
            c_set_items[i] = ctypes.pointer(_Entry.new(key, _encode(value)))

        if delete_items is None:
            delete_items = []

        c_delete_items = (ctypes.c_char_p * len(delete_items))()
        for (i, address) in enumerate(delete_items):
            c_delete_items[i] = ctypes.c_char_p(address.encode())

        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_update', self.pointer,
                 c_set_items, ctypes.c_size_t(len(set_items)),
                 c_delete_items, ctypes.c_size_t(len(delete_items)),
                 virtual,
                 ctypes.byref(c_merkle_root),
                 ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(
            c_merkle_root, c_merkle_root_len).decode()
예제 #8
0
    def get(self, address):
        c_address = ctypes.c_char_p(address.encode())
        (c_data, c_data_len) = ffi.prepare_byte_result()

        _libexec('merkle_db_get', self.pointer, c_address,
                 ctypes.byref(c_data), ctypes.byref(c_data_len))

        return _decode(ffi.from_c_bytes(c_data, c_data_len))
예제 #9
0
    def get(self, address):
        c_address = ctypes.c_char_p(address.encode())
        (c_data, c_data_len) = ffi.prepare_byte_result()

        _libexec('merkle_db_get', self.pointer, c_address,
                 ctypes.byref(c_data), ctypes.byref(c_data_len))

        return _decode(ffi.from_c_bytes(c_data, c_data_len))
예제 #10
0
    def __next__(self):
        if not self._c_iter_ptr:
            raise StopIteration()

        (c_address, c_address_len) = ffi.prepare_byte_result()
        (c_value, c_value_len) = ffi.prepare_byte_result()

        _libexec('merkle_db_leaf_iterator_next', self._c_iter_ptr,
                 ctypes.byref(c_address),
                 ctypes.byref(c_address_len),
                 ctypes.byref(c_value),
                 ctypes.byref(c_value_len))

        address = ffi.from_c_bytes(c_address, c_address_len).decode()
        value = _decode(ffi.from_c_bytes(c_value, c_value_len))

        return (address, value)
예제 #11
0
    def delete(self, address):
        c_address = ctypes.c_char_p(address.encode())
        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()
        _libexec('merkle_db_delete', self.pointer, c_address,
                 ctypes.byref(c_merkle_root),
                 ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(
            c_merkle_root, c_merkle_root_len).decode()
예제 #12
0
    def set(self, address, value):
        c_address = ctypes.c_char_p(address.encode())

        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()

        data = _encode(value)
        _libexec('merkle_db_set', self.pointer, c_address, data, len(data),
                 ctypes.byref(c_merkle_root), ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(c_merkle_root, c_merkle_root_len).decode()
예제 #13
0
    def set(self, address, value):
        c_address = ctypes.c_char_p(address.encode())

        (c_merkle_root, c_merkle_root_len) = ffi.prepare_byte_result()

        data = _encode(value)
        _libexec('merkle_db_set', self.pointer, c_address,
                 data, len(data),
                 ctypes.byref(c_merkle_root),
                 ctypes.byref(c_merkle_root_len))

        return ffi.from_c_bytes(
            c_merkle_root, c_merkle_root_len).decode()
예제 #14
0
    def summarize_block(self, force=False):
        (c_result, c_result_len) = ffi.prepare_byte_result()
        self._call('summarize_block', ctypes.c_bool(force),
                   ctypes.byref(c_result), ctypes.byref(c_result_len))

        return ffi.from_c_bytes(c_result, c_result_len)