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

Midnight JS库复现Compact内置pad()函数及Bytes<32>类型Uint8Array适配问题咨询

Midnight JS库复现Compact内置pad()函数及Bytes<32>类型Uint8Array适配问题咨询

嘿,我刚好在Midnight的Compact合约开发和JS SDK适配这块踩过类似的坑,给你几个靠谱的解决方案,确保你生成的Uint8Array和Compact里用pad()得到的Bytes<32>完全匹配:


1. 用Midnight JS SDK内置的工具函数(优先推荐)

Midnight的官方JS SDK里其实已经提供了和Compact pad()行为完全对齐的字节处理工具,你可以直接用bytes.pad方法,不用自己造轮子:

// 从SDK导入工具模块
import { bytes } from '@midnight-ntwrk/midnight-js-sdk';

// 示例:原始的短字节数组(比如从你的token元数据或标识生成)
const rawTokenBytes = new Uint8Array([0x1a, 0x2b, 0x3c]);

// 调用pad方法补到32字节,默认左补0(和Compact的`pad(32)`默认行为一致)
const paddedBytes32 = bytes.pad(rawTokenBytes, 32);

// 现在paddedBytes32就是完全符合Compact `Bytes<32>`类型的Uint8Array了

这个函数会自动处理两种情况:如果输入字节长度小于32,就在左侧填充0x00;如果输入长度超过32,会自动截断到32字节(和Compact的pad()处理超长输入的逻辑完全一致)。


2. 自己实现对齐Compact pad()的函数(备用方案)

如果你的开发环境里没法直接用官方SDK的工具,也可以自己写一个完全匹配Compact pad()行为的函数,确保和合约端的结果一致:

/**
 * 实现和Compact内置pad()完全对齐的字节填充函数
 * @param {Uint8Array} inputBytes - 原始输入字节数组
 * @param {number} targetLength - 目标长度,这里我们要的是32
 * @param {boolean} padRight - 可选,是否右补0,默认false(和Compact默认左补一致)
 * @returns {Uint8Array} 符合要求的固定长度字节数组
 */
function compactPad(inputBytes, targetLength = 32, padRight = false) {
  const result = new Uint8Array(targetLength).fill(0x00);
  const copyLength = Math.min(inputBytes.length, targetLength);
  
  if (padRight) {
    // 右补0的情况:把原始字节放在开头,后面补0
    result.set(inputBytes.slice(0, copyLength), 0);
  } else {
    // 左补0的情况:把原始字节放在末尾,前面补0(Compact默认行为)
    const startPos = targetLength - copyLength;
    result.set(inputBytes.slice(inputBytes.length - copyLength), startPos);
  }
  return result;
}

// 调用示例
const rawTokenData = new Uint8Array([0x05, 0x0f]);
const bytes32 = compactPad(rawTokenData);

3. 配合tokenType()函数使用

当你得到符合要求的Uint8Array后,就可以直接传入Midnight JS SDK的tokenType()函数,得到和Compact合约里计算完全一致的TokenType结果:

import { token } from '@midnight-ntwrk/midnight-js-sdk';

// 假设paddedBytes32是上面生成的符合要求的32字节数组
const tokenTypeResult = await token.tokenType(paddedBytes32);

// 现在tokenTypeResult就是你需要的TokenType值了

要注意的核心点是:必须保证填充后的字节数组和Compact合约里pad()生成的Bytes<32>完全一致,哪怕填充的位置(左/右)或者截断逻辑有一点不一样,都会导致tokenType()的计算结果和合约端不匹配。


备注:内容来源于stack exchange,提问作者Petlover620

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:25:31