Go語言具有簡單易學、功能強大,可跨平台編譯等眾多優勢,所以這裡選擇以Go語言切入以太坊。
開始之前需要以下環境:
$ 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 --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.go1. abi 檔案在 remix 部署時可以得到2. Pkg 指定的是編譯成的 go 檔案對應的 package 名稱3. type指定的是go檔案的入口函數,可以認為是類名4. out 指定輸出go檔案名稱
go調用rpc介面
- geth啟動時加上參數--rpcapi "db,eth,net,web3,personal"
- go調用getBalance()執行個體
package mainimport ( "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])}