[docs]defserialize(self,msg:str,set_references:bool=True)->str:""" Serialize a message using a custom kryo-like serialization method. Used after encoding the message to sign. :param msg: The string message to serialize. :param set_references: Whether to include references in the prefix. :return: The serialized message as a hexadecimal string. """prefix=("03"+("01"ifset_referenceselse"")+self._utf8_length(len(msg)+1).hex())coded=msg.encode("utf-8").hex()returnprefix+coded
@staticmethoddef_utf8_length(value:int)->bytes:""" Encodes the length of a UTF8 string as a variable-length encoded integer. :param value: The value to encode. :return: The encoded length as a bytes object. """buffer=bytearray()ifvalue>>6==0:# Requires 1 bytebuffer.append(value|0x80)# Set bit 8.elifvalue>>13==0:# Requires 2 bytesbuffer.append(value|0x40|0x80)# Set bits 7 and 8.buffer.append(value>>6)elifvalue>>20==0:# Requires 3 bytesbuffer.append(value|0x40|0x80)# Set bits 7 and 8.buffer.append((value>>6)|0x80)# Set bit 8.buffer.append(value>>13)elifvalue>>27==0:# Requires 4 bytesbuffer.append(value|0x40|0x80)# Set bits 7 and 8.buffer.append((value>>6)|0x80)# Set bit 8.buffer.append((value>>13)|0x80)# Set bit 8.buffer.append(value>>20)else:# Requires 5 bytesbuffer.append(value|0x40|0x80)# Set bits 7 and 8.buffer.append((value>>6)|0x80)# Set bit 8.buffer.append((value>>13)|0x80)# Set bit 8.buffer.append((value>>20)|0x80)# Set bit 8.buffer.append(value>>27)returnbytes(buffer)