概述: 用Go从区块链读取账户余额教程。

账户余额

读取一个账户的余额相当简单。调用客户端的BalanceAt方法,给它传递账户地址和可选的区块号。将区块号设置为nil将返回最新的余额。

  1. account := common.HexToAddress("0x71c7656ec7ab88b098defb751b7401b5f6d8976f")
  2. balance, err := client.BalanceAt(context.Background(), account, nil)
  3. if err != nil {
  4. log.Fatal(err)
  5. }
  6. fmt.Println(balance) // 25893180161173005034

传区块号能让您读取该区块时的账户余额。区块号必须是big.Int类型。

  1. blockNumber := big.NewInt(5532993)
  2. balance, err := client.BalanceAt(context.Background(), account, blockNumber)
  3. if err != nil {
  4. log.Fatal(err)
  5. }
  6. fmt.Println(balance) // 25729324269165216042

以太坊中的数字是使用尽可能小的单位来处理的,因为它们是定点精度,在ETH中它是wei。要读取ETH值,您必须做计算wei/10^18。因为我们正在处理大数,我们得导入原生的Gomathmath/big包。这是您做的转换。

  1. fbalance := new(big.Float)
  2. fbalance.SetString(balance.String())
  3. ethValue := new(big.Float).Quo(fbalance, big.NewFloat(math.Pow10(18)))
  4. fmt.Println(ethValue) // 25.729324269165216041

待处理的余额

有时您想知道待处理的账户余额是多少,例如,在提交或等待交易确认后。客户端提供了类似BalanceAt的方法,名为PendingBalanceAt,它接收账户地址作为参数。

  1. pendingBalance, err := client.PendingBalanceAt(context.Background(), account)
  2. fmt.Println(pendingBalance) // 25729324269165216042

完整代码

account_balance.go

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "math"
  7. "math/big"
  8. "github.com/ethereum/go-ethereum/common"
  9. "github.com/ethereum/go-ethereum/ethclient"
  10. )
  11. func main() {
  12. client, err := ethclient.Dial("https://mainnet.infura.io")
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. account := common.HexToAddress("0x71c7656ec7ab88b098defb751b7401b5f6d8976f")
  17. balance, err := client.BalanceAt(context.Background(), account, nil)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. fmt.Println(balance) // 25893180161173005034
  22. blockNumber := big.NewInt(5532993)
  23. balanceAt, err := client.BalanceAt(context.Background(), account, blockNumber)
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. fmt.Println(balanceAt) // 25729324269165216042
  28. fbalance := new(big.Float)
  29. fbalance.SetString(balanceAt.String())
  30. ethValue := new(big.Float).Quo(fbalance, big.NewFloat(math.Pow10(18)))
  31. fmt.Println(ethValue) // 25.729324269165216041
  32. pendingBalance, err := client.PendingBalanceAt(context.Background(), account)
  33. fmt.Println(pendingBalance) // 25729324269165216042
  34. }