以太坊之——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

  • 在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])
}

知識星球二維碼380.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM