以太坊之——golang以太坊接口調用

Go語言具有簡單易學、功能強大,可跨平臺編譯等衆多優勢,所以這裏選擇以Go語言切入以太坊。
開始之前需要以下環境:
- Ubuntu(這裏以ubuntu16.04爲例)
- geth

Ubuntu16.04安裝Go1.9.2

在與以太坊交互之前,我們需要安裝Go語言開發工具,這裏選擇的版本是Go1.9.2。接下來我們開始安裝

在終端輸入以下命令

$ curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz  
$ tar -C /usr/local -zxvf go1.9.linux-amd64.tar.gz  
$ mkdir -p ~/go/src
$ export GOPATH=~/go/src  //go項目要放到~/go/src目錄下編譯
$ go version

接下來,需要用到ipc方式和rpc方式。go-ethereum中有相關文件和工具,我們把它克隆下來。

克隆go-ethereum到本地

在終端輸入

$ cd ~/go/src
$ mkdir -p github.com/ethereum
$ cd github.com/ethereum/
$ git clone https://github.com/ethereum/go-ethereum.git

部署智能合約到geth

接下來的操作需要geth私有節點,下面是啓動命令和參數
- 啓動geth

$ geth --identity "pdj" --datadir data0 --rpcport 8545 --rpccorsdomain "*" --port "30303" --nodiscover --nat "any" --networkid 15 --rpc --rpcapi "db,eth,net,web3,personal" --ipcpath "geth.ipc" console

ipc方式調用智能合約

  • 複製部署智能合約時產生的abi到.abi文件中
  • 通過abigen工具產生.go文件

這裏需要編譯生成一個abigen工具,用來產生.go文件

  • 編譯~/go/src/github.com/ethereum/go-ethereum/cmd/abigen/目錄下的main.go
$ cd ~/go/src/github.com/ethereum/go-ethereum/cmd/abigen/
$ go build -i

編譯成功之後就會在當前目錄下生成abigen

$ abigen --abi xx.abi --pkg pkgname --type apiname --out xx.go

1. abi 文件在 remix 部署時可以得到
2. Pkg 指定的是編譯成的 go 文件對應的 package 名稱
3. type指定的是go文件的入口函數,可以認爲是類名
4. out 指定輸出go文件名稱

go調用rpc接口

  • geth啓動時加上參數–rpcapi “db,eth,net,web3,personal”
  • go調用getBalance()實例
package main

import (
    "fmt"
    "github.com/ethereum/go-ethereum/rpc"
)

func main() {

    client, err := rpc.Dial("http://localhost:8545")
    if err != nil {
        fmt.Println("rpc.Dial err", err)
        return
    }   

    var account[]string
    err = client.Call(&account, "eth_accounts")
    var result string
    //var result hexutil.Big
    err = client.Call(&result, "eth_getBalance", account[0], "latest")
    //err = ec.c.CallContext(ctx, &result, "eth_getBalance", account, "latest")

    if err != nil {
        fmt.Println("client.Call err", err)
        return
    }   

    fmt.Printf("account[0]: %s\nbalance[0]: %s\n", account[0], result)
    //fmt.Printf("accounts: %s\n", account[0])
}

知識星球二維碼380.png

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章