Golang ethclient.Client如何调用RPC接口?无封装方法怎么处理?
go-ethereum ethclient调用未封装RPC方法解决方案
你之前尝试访问client.c报错的原因是该字段是小写开头的私有字段,仅允许go-ethereum包内部代码访问,包外无法直接引用。不需要同时维护两个独立客户端,有两种更合理的实现方案:
方案1:直接调用ethclient暴露的RPC方法
go-ethereum v1.10.0及以上版本的ethclient.Client已经提供了公开的RPC()方法,直接返回底层私有*rpc.Client实例,可直接用来调用任意未封装的RPC接口:
client, err := ethclient.Dial(url) if err != nil { log.Fatal(err) } var result interface{} txHash := common.HexToHash("你的交易哈希") // 直接获取底层rpc客户端调用自定义方法 err = client.RPC().Call(&result, "debug_traceTransaction", txHash, nil) if err != nil { log.Fatal(err) }
方案2:主动持有底层RPC客户端(兼容旧版本)
如果使用的go-ethereum版本较低,没有RPC()导出方法,可以先初始化底层RPC客户端,再用它实例化ethclient,天然持有两个实例的引用,本质还是复用同一个RPC连接,没有额外开销:
// 先初始化底层rpc客户端 rpcClient, err := rpc.Dial(url) if err != nil { log.Fatal(err) } // 用rpc客户端实例化ethclient ethClient := ethclient.NewClient(rpcClient) // 正常调用封装好的eth方法 addr := common.HexToAddress("你的钱包地址") balance, err := ethClient.BalanceAt(context.Background(), addr, nil) if err != nil { log.Fatal(err) } // 直接用自己持有的rpcClient调用自定义方法 var result interface{} txHash := common.HexToHash("你的交易哈希") err = rpcClient.Call(&result, "debug_traceTransaction", txHash, nil) if err != nil { log.Fatal(err) }
两种方案均复用同一个RPC连接,不会产生额外的连接开销,也不会出现两个独立客户端连接状态不一致的问题,比单独开启两个客户端的方案更稳定高效。
内容的提问来源于stack exchange,提问作者thousandsofthem
相关产品推荐
相关产品推荐

