Jest测试环境下web3js调用signTransaction报'Expected message to be an Uint8Array'错误的求助
解决Jest测试中web3
signTransaction报错"Expected message to be an Uint8Array"的问题 我之前也碰到过一模一样的问题,这种情况基本都是Node.js测试环境和浏览器环境的API兼容差异,或是web3.js版本对参数处理的细微区别导致的,下面给你几个可以尝试的解决方案:
1. 手动转换私钥为Uint8Array格式
Jest环境下,直接传入字符串格式的私钥(哪怕带0x前缀),有时候会导致web3内部转Uint8Array时出错。你可以手动把私钥转换成Buffer(Uint8Array的子类)再传入:
// 移除私钥的0x前缀,再转成Buffer格式 const privateKeyBuffer = Buffer.from(constants.TEST_WALLET_PRIVATE_KEY.replace('0x', ''), 'hex'); // 用转换后的私钥签名 return await web3.eth.accounts.signTransaction(tx, privateKeyBuffer);
2. 给交易对象添加明确的chainId
Kovan测试网的chainId是42,web3的signTransaction在部分版本里需要明确指定chainId才能正确生成签名消息,否则内部处理时容易出现格式异常:
const tx = { from, to: constants.AAVE_V2_KOVAN_LENDING_POOL, gas: web3.utils.toHex(279600), data, chainId: 42 // 添加上Kovan的chainId };
3. 为Jest环境添加polyfill兼容
如果你的web3.js是v4.x版本,它对Node.js环境的依赖和v1.x有差异,需要补充polyfill来兼容Uint8Array/Buffer的处理:
- 先安装依赖包:
npm install --save-dev buffer @babel/polyfill
- 新建
jest.setup.js文件,添加以下内容:
import '@babel/polyfill'; global.Buffer = global.Buffer || require('buffer').Buffer;
- 在
jest.config.js中指定这个setup文件:
module.exports = { setupFiles: ['./jest.setup.js'], // 其他测试配置... };
4. 验证web3实例的初始化配置
确保测试环境中web3的Provider初始化正确,Infura Provider在测试环境可能需要额外指定chainId参数:
// 检查你的chains配置中web3的初始化代码,补充chainId const web3 = new Web3( new Web3.providers.HttpProvider(`https://kovan.infura.io/v3/${process.env.INFURA_KEY}`, { chainId: 42, headers: [ { name: 'Accept', value: 'application/json' }, { name: 'Content-Type', value: 'application/json' } ] }) );
最后,你可以优化测试用例的断言逻辑,先验证结果是否存在:
test('Expect signed message', async () => { expect.assertions(1); const result = await getDepositSignedMessage(); expect(result).toBeDefined(); // 先断言签名结果存在 // 也可以进一步断言签名结构,比如expect(result.signature).toBeDefined(); }, 10000);
建议先尝试添加chainId和转换私钥这两个步骤,这是最常见的解决思路,如果还不行再排查web3版本和polyfill配置。
内容的提问来源于stack exchange,提问作者Yeasin Rahaman
相关产品推荐
相关产品推荐

