如何在JavaScript中复现Solidity指定大小整数转换与位运算逻辑
JavaScript复现Solidity位运算拼接函数方案
问题根因
- JavaScript 原生位运算符默认将操作数转换为32位有符号整数处理,左移64位会直接溢出32位范围导致计算错误
- 普通JavaScript Number类型是双精度浮点数,最大安全整数仅为
2^53-1,你需要的计算结果远超这个阈值,会出现精度丢失
正确实现
使用ES6新增的BigInt类型处理大整数运算,所有参与位运算的数值都需要转换为BigInt类型:
function addPhase(_phase, _originalId) { // 入参如果是普通数字先转BigInt const phase = BigInt(_phase); const originalId = BigInt(_originalId); // 按Solidity逻辑运算,返回BigInt类型,也可以按需转成字符串 return (phase << 64n) | originalId; } // 测试示例 console.log(addPhase(1, 5132).toString()) // 输出:18446744073709556748,和Solidity运行结果完全一致
注意事项
- 运算结果如果需要传入web3相关接口,现在主流的web3.js、ethers库都已支持直接传入BigInt类型,也可以调用
toString()方法转成十进制字符串、或者toString(16)转成十六进制字符串使用 - 不要将计算结果转为普通Number类型,否则会出现精度丢失
内容的提问来源于stack exchange,提问作者Harry Papacharissiou
相关产品推荐
相关产品推荐

