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

猜你喜欢

转载自www.cnblogs.com/tokenpai/p/9109557.html