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
- 在http://remix.ethereum.org/上編譯智能合約
- 在remix的 run選項中選擇”Web3 Provider”,Web3 Provider Endpoint 爲”http://localhost:8545”
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])
}