def decode(cls, data): packed = messages.wrap(data) if packed is None: return None # signature must be at the end message_type = type(packed) signature = message_type.fields_spec[-1] assert signature.name == 'signature', 'signature is not the last field' message_data = data[:-signature.size_bytes] message_signature = data[-signature.size_bytes:] message_hash = sha3(message_data) data_that_was_signed = pack_signing_data( message_type.get_bytes_from(data, 'nonce'), message_type.get_bytes_from(data, 'transferred_amount'), message_type.get_bytes_from(data, 'channel'), message_type.get_bytes_from(data, 'locksroot'), message_hash, ) publickey = recover_publickey_safe(data_that_was_signed, message_signature) if publickey is None: return None message = cls.unpack(packed) # pylint: disable=no-member message.sender = publickey_to_address(publickey) return message
def decode(cls, data): packed = messages.wrap(data) if packed is None: return # signature must be at the end message_type = type(packed) signature = message_type.fields_spec[-1] assert signature.name == 'signature', 'signature is not the last field' data_that_was_signed = data[:-signature.size_bytes] message_signature = data[-signature.size_bytes:] publickey = recover_publickey_safe(data_that_was_signed, message_signature) message = cls.unpack(packed) # pylint: disable=no-member message.sender = publickey_to_address(publickey) return message