以太坊系节点余额精度处理

本文介绍了如何在Golang中处理以太坊余额的精度问题。通过json_rpc接口获取到十六进制的余额后,转换为big.int类型,并使用自定义的HexToBigInt方法。以太坊的数字是以wei为最小单位,转换成ETH需要除以10^18。ToDecimal方法在转换时默认保留16位精度,导致四舍五入误差。为解决18位精度需求,可以通过设置方法参数避免精度丢失。最终提供了完整的以太坊余额处理方法。

当我们使用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(整数)转换为小数。 第二个参数是小数位数。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值