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
相关产品推荐
相关产品推荐

