分享
以太坊之——golang以太坊接口调用
tokenpai · · 4983 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
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
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信4983 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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