Go语言中如何将16字节UUID转换为32字节以适配Stellar交易的Memo字段
解决Stellar交易Memo存储UUID的问题
嘿,这个需求我很熟悉,咱们来聊聊怎么搞定它:
Stellar的Memo字段确实有明确的限制:Text类型最多28字节(UUID字符串是36字节,确实放不下),但Hash类型支持正好32字节的二进制数据。而UUID本身是16字节的二进制数据,所以我们只需要把这16字节扩展成32字节的二进制数据就行,这里有几个实用的方案:
方案1:重复UUID字节(推荐,可逆)
这是最直接也最实用的方法——把16字节的UUID重复一次,刚好凑够32字节。这种方法的最大优势是完全可逆,之后你可以轻松从Memo的32字节数据里提取出原始UUID(只需要取前16字节或者后16字节就行)。
举个Python实现的例子:
import uuid from stellar_sdk import Memo # 生成或获取你的UUID target_uuid = uuid.uuid4() # 转成16字节的二进制数组 uuid_bytes = target_uuid.bytes # 重复一次得到32字节的Memo哈希数据 memo_hash_data = uuid_bytes * 2 # 创建Stellar的MemoHash对象 stellar_memo = Memo.hash(memo_hash_data)
方案2:用哈希函数生成32字节哈希(单向,不可逆)
如果你不需要反向解析UUID,只是需要一个符合32字节要求的唯一标识,可以用SHA-256哈希UUID的字节数组——SHA-256的输出正好是32字节。不过要注意,这种方法是单向的,你没法从生成的哈希值还原回原始UUID。
示例代码:
import uuid import hashlib from stellar_sdk import Memo target_uuid = uuid.uuid4() uuid_bytes = target_uuid.bytes # 通过SHA256哈希得到32字节数据 memo_hash_data = hashlib.sha256(uuid_bytes).digest() stellar_memo = Memo.hash(memo_hash_data)
方案3:添加固定填充字节(可逆,自定义规则)
你也可以在UUID的字节数组后面添加16字节的固定填充值(比如全0字节、特定标识字节等)来凑够32字节。这种方法同样可逆,只要你记住填充规则,就能提取出原始UUID。
示例代码(填充全0字节):
import uuid from stellar_sdk import Memo target_uuid = uuid.uuid4() uuid_bytes = target_uuid.bytes # 添加16字节的0填充 memo_hash_data = uuid_bytes + b'\x00' * 16 stellar_memo = Memo.hash(memo_hash_data)
注意事项
- 一定要使用Stellar的MemoHash类型,而不是Text类型——因为Text类型会把二进制数据转成字符串,反而会超过字节限制,直接用二进制的MemoHash才符合要求。
- 如果需要后续解析Memo中的UUID,优先选择方案1或方案3,方案2的哈希方法无法逆向还原UUID。
内容的提问来源于stack exchange,提问作者iateadonut
相关产品推荐
相关产品推荐

