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

web3.utils.toBN与new web3.utils.BN:十六进制字符串该用哪一个?

关于web3.js处理十六进制字符串时BN实例化方式的选择

根据web3.js官方文档,web3.utils.toBN比直接实例化new web3.utils.BN更安全,但处理相同十六进制哈希字符串时,两者返回结果不同:

(new web3.utils.BN('0x149e7b36b314b81fbe1762060fcae0f43be82f1251166a61fc7669e7c236c4bf')).toString()
// 结果: '331504813713151826241762061631415442483512511670626276704822372525'

web3.utils.toBN('0x149e7b36b314b81fbe1762060fcae0f43be82f1251166a61fc7669e7c236c4bf').toString()
// 结果: '9326269197397511364330713577831447135626556432227477146325167069213775807679'

补充说明:处理非十六进制字符串时,两者生成的结果一致:

(new web3.utils.BN('57896044618658097711785492504343953926634992332820282019728792003956564819968')).toString()
// 结果: '57896044618658097711785492504343953926634992332820282019728792003956564819968'

web3.utils.toBN('57896044618658097711785492504343953926634992332820282019728792003956564819968').toString()
// 结果: '57896044618658097711785492504343953926634992332820282019728792003956564819968'

原因分析

直接调用new web3.utils.BN('0x...')时,BN构造函数默认将输入当作十进制数解析(未指定基数参数),导致十六进制字符串被错误解析。而web3.utils.toBN会自动识别0x前缀,以基数16正确解析十六进制字符串,因此得到的是符合预期的数值。

结论

处理十六进制字符串时,必须选择web3.utils.toBN。若坚持直接实例化BN,需手动指定第二个参数为16,示例如下:

new web3.utils.BN('0x149e7b36b314b81fbe1762060fcae0f43be82f1251166a61fc7669e7c236c4bf', 16).toString()
// 结果与web3.utils.toBN一致

但官方推荐优先使用web3.utils.toBN,它会自动处理不同格式输入(如识别十六进制前缀、防范大数溢出等),避免手动指定基数时的失误,安全性更有保障。


内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:23