golang实现以太坊JSON RPC API调用的插件库ethrpc的使用
Golang实现以太坊JSON RPC API调用的插件库ethrpc的使用
简介
Ethrpc是一个用于以太坊JSON RPC API的Golang客户端库。它提供了与以太坊节点交互的便捷方法。
使用方法
下面是一个完整的示例代码,展示了如何使用ethrpc库与以太坊节点进行交互:
package main
import (
"log"
"github.com/onrik/ethrpc"
)
func main() {
// 创建客户端实例,连接到本地以太坊节点
client := ethrpc.New("http://127.0.0.1:8545")
// 获取客户端版本信息
version, err := client.Web3ClientVersion()
if err != nil {
log.Println(err)
return
}
log.Println(version)
// 发送1个ETH的交易
txid, err := client.EthSendTransaction(ethrpc.T{
From: "0x6247cf0412c6462da2a51d05139e2a3c6c630f0a", // 发送方地址
To: "0xcfa202c4268749fbb5136f2b68f7402984ed444b", // 接收方地址
Value: ethrpc.Eth1(), // 发送金额(1 ETH)
})
if err != nil {
log.Println(err)
return
}
log.Println(txid)
}
支持的方法
ethrpc库支持以下以太坊JSON RPC API方法:
- web3_clientVersion
- web3_sha3
- net_version
- net_peerCount
- net_listening
- eth_protocolVersion
- eth_syncing
- eth_coinbase
- eth_mining
- eth_hashrate
- eth_gasPrice
- eth_accounts
- eth_blockNumber
- eth_getBalance
- eth_getStorageAt
- eth_getTransactionCount
- eth_getBlockTransactionCountByHash
- eth_getBlockTransactionCountByNumber
- eth_getUncleCountByBlockHash
- eth_getUncleCountByBlockNumber
- eth_getCode
- eth_sign
- eth_sendTransaction
- eth_sendRawTransaction
- eth_call
- eth_estimateGas
- eth_getBlockByHash
- eth_getBlockByNumber
- eth_getTransactionByHash
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getTransactionReceipt
- eth_getCompilers (DEPRECATED)
- eth_newFilter
- eth_newBlockFilter
- eth_newPendingTransactionFilter
- eth_uninstallFilter
- eth_getFilterChanges
- eth_getFilterLogs
- eth_getLogs
注意事项
- 在使用eth_sendTransaction方法时,确保发送方账户在节点中已解锁
- 金额可以使用ethrpc.Eth1()等辅助函数来表示ETH单位
- 部分方法已被标记为DEPRECATED(已弃用),建议使用替代方案
这个库提供了与以太坊节点交互的简洁API,适合需要与以太坊区块链交互的Golang应用程序使用。
更多关于golang实现以太坊JSON RPC API调用的插件库ethrpc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现以太坊JSON RPC API调用的插件库ethrpc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 ethrpc 库实现以太坊 JSON-RPC API 调用
ethrpc 是一个 Go 语言实现的以太坊 JSON-RPC 客户端库,它简化了与以太坊节点交互的过程。下面我将介绍如何使用这个库进行基本的以太坊 API 调用。
安装 ethrpc
首先需要安装 ethrpc 库:
go get github.com/onrik/ethrpc
基本使用示例
1. 创建客户端连接
package main
import (
"fmt"
"github.com/onrik/ethrpc"
)
func main() {
// 连接到本地以太坊节点(默认端口8545)
client := ethrpc.New("http://127.0.0.1:8545")
// 测试连接
version, err := client.Web3ClientVersion()
if err != nil {
panic(err)
}
fmt.Println("Ethereum client version:", version)
}
2. 查询区块链信息
// 获取最新区块号
blockNumber, err := client.EthBlockNumber()
if err != nil {
panic(err)
}
fmt.Println("Latest block number:", blockNumber)
// 获取区块信息
block, err := client.EthGetBlockByNumber(blockNumber, false)
if err != nil {
panic(err)
}
fmt.Printf("Block %d hash: %s\n", block.Number, block.Hash)
3. 查询账户余额
// 查询ETH余额(地址示例)
balance, err := client.EthGetBalance("0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "latest")
if err != nil {
panic(err)
}
fmt.Println("Balance:", balance)
4. 发送交易
// 发送交易(需要解锁账户或使用私钥签名)
txHash, err := client.EthSendTransaction(ethrpc.T{
From: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
To: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
Value: ethrpc.EthToWei(0.1),
Gas: 21000,
GasPrice: ethrpc.EthToWei(0.00000002),
})
if err != nil {
panic(err)
}
fmt.Println("Transaction hash:", txHash)
5. 调用智能合约
// 调用合约的只读方法
result, err := client.EthCall(ethrpc.T{
To: "0xContractAddress",
Data: "0x70a08231000000000000000000000000742d35Cc6634C0532925a3b844Bc454e4438f44e",
}, "latest")
if err != nil {
panic(err)
}
fmt.Println("Contract call result:", result)
高级功能
1. 批量请求
// 创建批量请求
batch := client.NewBatch()
// 添加多个请求
var blockNumber int
batch.Add("eth_blockNumber", &blockNumber)
var balance ethrpc.BigInt
batch.Add("eth_getBalance", &balance, "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "latest")
// 执行批量请求
if err := batch.Execute(); err != nil {
panic(err)
}
fmt.Printf("Block number: %d, Balance: %s\n", blockNumber, balance.String())
2. 订阅事件(需要WebSocket连接)
// 创建WebSocket客户端
wsClient := ethrpc.New("ws://127.0.0.1:8546")
// 订阅新块头
subID, err := wsClient.EthSubscribe("newHeads")
if err != nil {
panic(err)
}
// 处理订阅消息
for {
var header ethrpc.Block
if err := wsClient.Client.Call(&header, "eth_getBlockByNumber", "latest", false); err != nil {
panic(err)
}
fmt.Printf("New block: %d\n", header.Number)
}
错误处理
// 检查特定错误
if err != nil {
if rpcErr, ok := err.(*ethrpc.RPCError); ok {
fmt.Printf("RPC error: code=%d, message=%s\n", rpcErr.Code, rpcErr.Message)
} else {
fmt.Printf("Other error: %v\n", err)
}
}
注意事项
-
对于生产环境,建议添加超时设置:
client := ethrpc.New("http://127.0.0.1:8545") client.SetTimeout(30 * time.Second)
-
发送交易时通常需要先对交易进行签名,可以使用其他库如 go-ethereum 的 accounts 包来签名交易。
-
对于复杂的智能合约交互,建议使用 abigen 生成的绑定合约代码。
-
记得处理大整数类型,ethrpc 提供了 BigInt 类型来处理以太坊的大数值。
ethrpc 库提供了对大多数以太坊 JSON-RPC API 的支持,使用简单直观。对于更高级的需求,可以考虑结合 go-ethereum 的 ethclient 包一起使用。