BigNumber和单位转换
这一讲,我们介绍BigNumber
类和单位转换。
BigNumber
以太坊中,许多计算都对超出JavaScript
整数的安全值(js中最大安全整数为9007199254740991
)。因此,ethers.js
使用BigNumber
类安全地对任何数量级的数字进行数学运算。在ethers.js
中,大多数需要返回值的操作将返回BigNumber
,而接受值的参数也会接受它们。
创建BigNumber
实例
你可以利用ethers.BigNumber.from()
函数将string
,number
,BigNumber
等类型转换为BigNumber
。
代码参考:https://docs.ethers.io/v5/api/utils/bignumber/#BigNumber
注意,超过js最大安全整数的数值将不能转换。
const oneGwei = ethers.BigNumber.from("1000000000"); // 从十进制字符串生成
console.log(oneGwei)
console.log(ethers.BigNumber.from("0x3b9aca00")) // 从hex字符串生成
console.log(ethers.BigNumber.from(1000000000)) // 从数字生成
// 不能从js最大的安全整数之外的数 字生成BigNumber,下面代码会报错
// ethers.BigNumber.from(Number.MAX_SAFE_INTEGER);
console.log("js中最大安全整数:", Number.MAX_SAFE_INTEGER)
BigNumber
运算
BigNumber
支持很多运算,例如加减乘除、取模mod
,幂运算pow
,绝对值abs
等运算:
// 运算
console.log("加法:", oneGwei.add(1).toString())
console.log("减法:", oneGwei.sub(1).toString())
console.log("乘法:", oneGwei.mul(2).toString())
console.log("除法:", oneGwei.div(2).toString())
// 比较
console.log("是否相等:", oneGwei.eq("1000000000"))
单位转换
在以太坊中,1 ether
等于10^18 wei
。下面列出了一些常用的单位:
在应用中,我们经常将数值在用户可读的字符串(以ether
为单位)和机器可读的数值(以wei
为单位)之间转换。例如,钱包可以为用户界面指定余额(以ether
为单位)和gas
价格(以gwei
为单位),但是在发送交易时,两者都必须转换成以wei
为单位的数值。ethers.js
提供了一些功能函数,方便这类转换。
-
formatUnits(变量, 单位)
:格式化,小单位转大单位,比如wei
->ether
,在显示余额时很有用。参数中,单位填位数(数字)或指定的单位(字符串)。//代码参考:https://docs.ethers.io/v5/api/utils/display-logic/#utils-parseUnits console.group('\n2. 格式化:小单位转大单位,formatUnits'); console.log(ethers.utils.formatUnits(oneGwei, 0)); // '1000000000' console.log(ethers.utils.formatUnits(oneGwei, "gwei")); // '1.0' console.log(ethers.utils.formatUnits(oneGwei, 9)); // '1.0' console.log(ethers.utils.formatUnits(oneGwei, "ether")); // `0.000000001` console.log(ethers.utils.formatUnits(1000000000, "gwei")); // '1.0' console.log(ethers.utils.formatEther(oneGwei)); // `0.000000001` 等同于formatUnits(value, "ether") console.groupEnd();
-
parseUnits
:解析,大单位转小单位,比如ether
->wei
,在将用户输入的值转为wei
为单位的数值很有用。参数中,单位填位数(数字)或指定的单位(字符串)。// 3. 解析:大单位转小单位 // 例如将ether转换为wei:parseUnits(变量, 单位),parseUnits默认单位是 ether // 代码参考:https://docs.ethers.io/v5/api/utils/display-logic/#utils-parseUnits console.group('\n3. 解析:大单位转小单位,parseUnits'); console.log(ethers.utils.parseUnits("1.0").toString()); // { BigNumber: "1000000000000000000" } console.log(ethers.utils.parseUnits("1.0", "ether").toString()); // { BigNumber: "1000000000000000000" } console.log(ethers.utils.parseUnits("1.0", 18).toString()); // { BigNumber: "1000000000000000000" } console.log(ethers.utils.parseUnits("1.0", "gwei").toString()); // { BigNumber: "1000000000" } console.log(ethers.utils.parseUnits("1.0", 9).toString()); // { BigNumber: "1000000000" } console.log(ethers.utils.parseEther("1.0").toString()); // { BigNumber: "1000000000000000000" } 等同于parseUnits(value, "ether") console.groupEnd();
总结
这一讲,我们介绍了BigNumber
类,以太坊中的常用单位,以及单位转换。