当我们使用json_rpc接口 eth_getBalance 获取以太坊余额时,将得到一个string类型的十六进制数,如:0x1bc10edd0701d9f2
此时我们需要将该值转为big.int类型的整数,转换方法如下:
value := common.HexToBigInt("0x1bc10edd0701d9f2")
fmt.Println(value) //得到big.int类型整数值:1999896051997334002
注:如果我们需要将该整数值再次转为string,方便其它方法调用使用时,则如下转换即可:
balance := common.HexToBigInt(res)
fmt.Println(balance.String())
HexToBigInt 方法如下:
func hexToBigInt(hex string) *big.Int {
n := new(big.Int)
n, _ = n.SetString(hex[2:], 16)
return n
}
得到一个整数值后,我们知道以太坊中的数字是使用尽可能小的单位来处理的,因为它们是定点精度,在ETH中它是wei。要读取ETH值,就必须做计算wei/10^18。因为我们正在处理大数,我们得导入原生的Gomath和math/big包。这是我们要做的转换。同时要使用ToDecimal 方法针对以太坊进行浮点数运算
将wei(整数)转换为小数。 第二个参数是小数位数。
本文介绍了如何在Golang中处理以太坊余额的精度问题。通过json_rpc接口获取到十六进制的余额后,转换为big.int类型,并使用自定义的HexToBigInt方法。以太坊的数字是以wei为最小单位,转换成ETH需要除以10^18。ToDecimal方法在转换时默认保留16位精度,导致四舍五入误差。为解决18位精度需求,可以通过设置方法参数避免精度丢失。最终提供了完整的以太坊余额处理方法。
订阅专栏 解锁全文
1649

被折叠的 条评论
为什么被折叠?



