Go-Ethereum

如何使用 Go 以程式方式與 JSON RPC 伺服器通信?

  • October 20, 2017

有沒有辦法直接在 Go 中與 JSON RPC 伺服器互動?

我嘗試了以下方法:

  1. 使用“geth –rpc”啟動 RPC 伺服器
  2. 執行以下程式碼:
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

希望這會有所幫助,如果您在執行它時遇到問題,請告訴我。

引用自:https://ethereum.stackexchange.com/questions/3289