如何用Aptos SDK解码ValidatorSet字段的十六进制字符串为可读字符串?
解决Aptos ValidatorSet地址十六进制串解码乱码问题
你遇到的乱码是因为直接把BCS序列化的结构体字节串当成纯字符串反序列化了。从Aptos API拿到的network_addresses和fullnode_addresses字段值,是链上0x1::stake::ValidatorAddress结构体的BCS序列化结果,包含网络类型、二进制地址等多个字段,不能直接用deserializeStr()解析。
正确解码步骤
- 先明确链上
ValidatorAddress的结构体定义:
struct ValidatorAddress has drop, store { network: u8, // 网络类型标识 address: vector<u8>, // 地址内容(可能是域名或IP+端口的二进制/UTF-8数据) }
- 在JS中对应定义BCS可反序列化的类,按照结构体字段顺序解析字节。
完整代码示例
const aptos = require('aptos'); // 定义与链上匹配的ValidatorAddress BCS类型 class ValidatorAddress { constructor(network, address) { this.network = network; this.address = address; } // 按照BCS规则反序列化 static deserialize(deserializer) { const network = deserializer.deserializeU8(); const address = deserializer.deserializeBytes(); return new ValidatorAddress(network, address); } } // 你的目标十六进制字符串 const targetHex = "0x014404021a6170746f732d76616c696461746f722e7374616b656c792e696f0524180720796e34b3ffbd8396ad4ade8e397420bad3b5c49dee20a1dbcf8e6256105a1a2a0800"; const hexBytes = new aptos.HexString(targetHex).toUint8Array(); // 反序列化为结构体 const deserializer = new aptos.BCS.Deserializer(hexBytes); const addrInfo = ValidatorAddress.deserialize(deserializer); // 解析地址内容:如果是域名用UTF-8解码,若是IP+端口需转成对应格式 const readableAddr = new TextDecoder().decode(addrInfo.address); console.log("网络类型标识:", addrInfo.network); console.log("可读地址:", readableAddr);
结果说明
- 示例中会解析出网络类型
1,可读地址包含aptos-validator.stakely.io,后面的二进制内容是节点的具体网络标识(比如IP和端口的二进制编码),可以根据网络类型进一步解析(比如IPv4/IPv6+端口的转换)。 - 对于
network_addresses数组中的每个元素,都可以用这个方式循环解析。
内容的提问来源于stack exchange,提问作者trikunai
相关产品推荐
相关产品推荐

