如何将RSK令牌余额转换为Javascript数字?

如何将RSK令牌余额转换为Javascript数字?,javascript,web3js,rsk,Javascript,Web3js,Rsk,我想从代币智能合约中获得余额(代币数量) 我正在使用web3.js与合同交互,并且能够获得返回值。 但是,使用此值时,如果执行.toString(),我会看到它具有正确的值。 但是,如果我执行.toNumber(),它会给我一个错误: 错误:数字最多只能安全存储53位 为什么会发生这种情况?如何从智能合约中获取特定账户的余额,作为一个数字(而不是字符串)?智能合约可以支持非常大的数字(高达uint256)。但是,内置的Number类型的Javascript不能表示那么大的数字,因此在web3.j

我想从代币智能合约中获得余额(代币数量)

我正在使用web3.js与合同交互,并且能够获得返回值。 但是,使用此值时,如果执行
.toString()
,我会看到它具有正确的值。 但是,如果我执行
.toNumber()
,它会给我一个错误:
错误:数字最多只能安全存储53位


为什么会发生这种情况?如何从智能合约中获取特定账户的余额,作为一个数字(而不是字符串)?

智能合约可以支持非常大的数字(高达
uint256
)。但是,内置的
Number
类型的Javascript不能表示那么大的数字,因此在
web3.js
中,任何数值都被包装在
BN
(大数字)中。您可以在
web3.utils.BN
中找到此类

这就是为什么当您得到余额查询的错误时, 因为余额是
uint256
,通常用于表示
18
小数位。我们可以只使用web3.js来复制它,而不需要

const web3=require('web3');
//余额为'1',后面有21'0'-s
//对于拥有1000个令牌的帐户,典型令牌将返回此值
const balanceBN=new web3.utils.BN('10000000000000000000');
常量余额=余额bn.toNumber();
这会引发以下错误:

Uncaught Error: Number can only safely store up to 53 bits
    at assert (/some/path/node_modules/bn.js/lib/bn.js:6:21)
    at BN.toNumber (/some/path/node_modules/bn.js/lib/bn.js:519:7)
因此,您的选择是:

  • 如果BN足够小,可以使用
    .toNumber()
  • 如果BN太大,请在调用
    .toNumber()
    之前使用
    .div()
    缩小其大小
将上述内容应用到您的特定问题,即关于获取代币余额的问题, 我们可以做到以下几点:

const balanceBN=contract.methods.balanceOf(myAddress.call();
const decimalsBN=contract.methods.decimals().call();
//当我们知道BN是用JS数字表示的小英文时
常量小数=decimalsBN.toNumber();
//当我们知道BN太大而无法用JS数字表示时
const balance=balanceBN.div(新web3.utils.BN(10).pow(小数点)).toNumber();
  • 查询代币合约以获取余额和小数值,两者均为
    BN
  • 使用
    .toNumber()
    将小数直接转换为数字,因为我们希望它足够小
  • 将余额
    BN
    除以10,并将其提升到小数的幂次方
    BN
    ,然后调用
    .toNumber
注意:
balance
的结果值将与通常显示在用户界面中的令牌数量相匹配。。。而不是智能合约本身存储的价值


或者使用BN from—它扩展了字节长度,实际上更好(xmr/vet也需要更多的数字)——