You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Aptos SDK解码ValidatorSet字段的十六进制字符串为可读字符串?

解决Aptos ValidatorSet地址十六进制串解码乱码问题

你遇到的乱码是因为直接把BCS序列化的结构体字节串当成纯字符串反序列化了。从Aptos API拿到的network_addresses和fullnode_addresses字段值,是链上0x1::stake::ValidatorAddress结构体的BCS序列化结果,包含网络类型、二进制地址等多个字段,不能直接用deserializeStr()解析。

正确解码步骤

  1. 先明确链上ValidatorAddress的结构体定义:
struct ValidatorAddress has drop, store {
    network: u8,          // 网络类型标识
    address: vector<u8>,  // 地址内容(可能是域名或IP+端口的二进制/UTF-8数据)
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:20:12