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

