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

注意事项

  1. 在使用eth_sendTransaction方法时,确保发送方账户在节点中已解锁
  2. 金额可以使用ethrpc.Eth1()等辅助函数来表示ETH单位
  3. 部分方法已被标记为DEPRECATED(已弃用),建议使用替代方案

这个库提供了与以太坊节点交互的简洁API,适合需要与以太坊区块链交互的Golang应用程序使用。


更多关于golang实现以太坊JSON RPC API调用的插件库ethrpc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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)
    }
}

注意事项

  1. 对于生产环境,建议添加超时设置:

    client := ethrpc.New("http://127.0.0.1:8545")
    client.SetTimeout(30 * time.Second)
    
  2. 发送交易时通常需要先对交易进行签名,可以使用其他库如 go-ethereum 的 accounts 包来签名交易。

  3. 对于复杂的智能合约交互,建议使用 abigen 生成的绑定合约代码。

  4. 记得处理大整数类型,ethrpc 提供了 BigInt 类型来处理以太坊的大数值。

ethrpc 库提供了对大多数以太坊 JSON-RPC API 的支持,使用简单直观。对于更高级的需求,可以考虑结合 go-ethereum 的 ethclient 包一起使用。

回到顶部