如何使用 Go 以程式方式與 JSON RPC 伺服器通信?
有沒有辦法直接在 Go 中與 JSON RPC 伺服器互動?
我嘗試了以下方法:
- 使用“geth –rpc”啟動 RPC 伺服器
- 執行以下程式碼:
package main import ( "fmt" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc/comms" ) func main() { client, err := comms.ClientFromEndpoint("rpc:127.0.0.1", 0) if err != nil { panic(err) } xeth := rpc.NewXeth(client) type p interface { } response := make(map[string]interface{}, 0) var params []interface{} response, err = xeth.Call("eth_gasPrice", params) if err != nil { panic(err) } fmt.Println(response) }
連接似乎有效,但我收到以下錯誤:
panic: interface conversion: interface {} is string, not map[string]interface {} goroutine 1 [running]: panic(0x48c3d00, 0xc820098380) /usr/local/go/src/runtime/panic.go:481 +0x3e6 github.com/ethereum/go-ethereum/rpc.(*Xeth).Call(0xc8201bdc80, 0x49ee5f0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) /Users/tim/Documents/go_workspace/src/github.com/ethereum/go-ethereum/rpc/xeth.go:72 +0x4dc main.main() /Users/tim/Documents/go_workspace/src/eth_test/main.go:23 +0x12e exit status 2
如果我在這裡更改“呼叫”方法:https ://github.com/ethereum/go-ethereum/blob/master/rpc/xeth.go ,我可以將類型斷言更改為正確的類型,我得到正確的結果背部。
除此之外,連結文件(xeth.go)中的註釋告訴它是遠端節點的介面,但是我想要一個本地節點的介面。
我認為必須可以純粹以程式方式首先啟動 RPC 伺服器(否則在控制台上以“geth –rpc”啟動),因為控制台命令畢竟會呼叫 Go 方法,其次應該可以發送 RPC使用 GO 請求。
我在這裡做錯了什麼?
您可以看看我們為 etherapis 採用的簡單方法:https ://github.com/etherapis/etherapis/blob/master/etherapis/geth/api.go
但是,有一個 RPC 客戶端正在開發中,它也應該已經支持訂閱。不確定 Felix 什麼時候會用它打開他的 PR。
我沒有針對您的程式碼的解決方案,因為我沒有考慮使用 go-ethereum 內部進行 RPC 呼叫,但我製作了一個非常小的 rpc 客戶端庫,您可以在我的 github 上找到它使用 gorequest 和 simplejson (我不是專家;))
還有一個“主”文件,我開始通過轉到一個定義更明確的 api 來包裝呼叫,你可以在這裡檢查最簡單的方法是如何實現的,我基本上只是用正確的方法和參數呼叫 mini-lib,在這種情況下沒有,轉換值並返回它。
如果您的 geth 啟用了 –rpc 並且它在預設埠上,這也將為您提供程式碼並立即工作:
go get github.com/makevoid/web3_go
cd 進入目錄,然後執行:
go run web3_go.go
希望這會有所幫助,如果您在執行它時遇到問題,請告訴我。