---
概述: 用Go从区块链读取账户余额教程。
---
# 账户余额
读取一个账户的余额相当简单。调用客户端的`BalanceAt`方法,给它传递账户地址和可选的区块号。将区块号设置为`nil`将返回最新的余额。
```go
account := common.HexToAddress("0x71c7656ec7ab88b098defb751b7401b5f6d8976f")
balance, err := client.BalanceAt(context.Background(), account, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(balance) // 25893180161173005034
```
传区块号能让您读取该区块时的账户余额。区块号必须是`big.Int`类型。
```go
blockNumber := big.NewInt(5532993)
balance, err := client.BalanceAt(context.Background(), account, blockNumber)
if err != nil {
log.Fatal(err)
}
fmt.Println(balance) // 25729324269165216042
```
以太坊中的数字是使用尽可能小的单位来处理的,因为它们是定点精度,在ETH中它是*wei*。要读取ETH值,您必须做计算`wei/10^18`。因为我们正在处理大数,我们得导入原生的Go`math`和`math/big`包。这是您做的转换。
```go
fbalance := new(big.Float)
fbalance.SetString(balance.String())
ethValue := new(big.Float).Quo(fbalance, big.NewFloat(math.Pow10(18)))
fmt.Println(ethValue) // 25.729324269165216041
```
#### 待处理的余额
有时您想知道待处理的账户余额是多少,例如,在提交或等待交易确认后。客户端提供了类似`BalanceAt`的方法,名为`PendingBalanceAt`,它接收账户地址作为参数。
```go
pendingBalance, err := client.PendingBalanceAt(context.Background(), account)
fmt.Println(pendingBalance) // 25729324269165216042
```
---
### 完整代码
```go
package main
import (
"context"
"fmt"
"log"
"math"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("https://mainnet.infura.io")
if err != nil {
log.Fatal(err)
}
account := common.HexToAddress("0x71c7656ec7ab88b098defb751b7401b5f6d8976f")
balance, err := client.BalanceAt(context.Background(), account, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(balance) // 25893180161173005034
blockNumber := big.NewInt(5532993)
balanceAt, err := client.BalanceAt(context.Background(), account, blockNumber)
if err != nil {
log.Fatal(err)
}
fmt.Println(balanceAt) // 25729324269165216042
fbalance := new(big.Float)
fbalance.SetString(balanceAt.String())
ethValue := new(big.Float).Quo(fbalance, big.NewFloat(math.Pow10(18)))
fmt.Println(ethValue) // 25.729324269165216041
pendingBalance, err := client.PendingBalanceAt(context.Background(), account)
fmt.Println(pendingBalance) // 25729324269165216042
}
```
- 客户端
- 创建客户端
- 以太坊账户
- 账户余额
- 账户代币余额
- 生成新钱包
- 密匙库
- 硬件钱包
- 地址验证
- 交易
- 查询区块
- 查询交易
- ETH转账
- 代币转账
- 监听新区块
- 创建裸交易
- 发送裸交易
- 智能合约
- 智能合约 & ABI
- 部署智能合约
- 加载智能合约
- 查询智能合约
- 写入智能合约
- 读取智能合约二进制码
- 查询ERC20代币智能合约
- 事件日志
- 监听事件日志
- 读取时间日志
- 读取ERC20代币的事件日志
- 读取0x Protocol事件日志
- 签名
- 生成签名
- 验证签名
- 测试
- 发币龙头
- 使用模拟客户端
- Swarm存储
- 创建 Swarm存储
- 上传文件到Swarm
- 从Swarm下载文件
- Whisper通信协议
- 创建Whisper客户端
- 生成Whisper密匙对
- 在Whisper上发送消息
- 监听Whisper消息
- 工具
- 工具集合
- 专有词汇表
- 资源