任务要求:使用golang作为后端语言,获取eth(私链)中的账户信息以及创建新的账号
1、启动geth
geth --identity "aaron" --datadir data0 --rpcport 8545 --rpccorsdomain "*" --port "30303" --nodiscover --nat "any" --networkid 15 --rpc --rpcapi "db,eth,net,web3,personal" --ipcpath "geth.ipc" console
命令解析:
- --identity "MyNodeName":为你的节点设置身份标识,以更容易在节点列表中识别
- --rpc:开启 RPC 接口
- --rpcport "8080":RPC 端口
- --rpccorsdomain "*":设置能连接到你的节点的 URL,用来完成 RPC 任 务。* 指任何 URL 都能连接到你。
- --datadir "data0":区块数据文件夹 (在geth同目录下生成data0文件夹)
- --port "30303":用来监听其他节点的端口
- --nodiscover:你的节点不会被其他人发现,除非他们手动添加你
- --rpcapi "db,eth,net,web3":提供给别人使用的 RPC API,默认为 web3 接口
- networkid 1999:相同 networkdid 才会连接到一起
2、通过rpc进行通信
package main
import (
"fmt"
"strconv"
"github.com/ethereum/go-ethereum/rpc"
"github.com/pkg/errors"
)
var (
client *rpc.Client
)
func init() {
//获取连接与eth客户端
client, _ = rpc.Dial("http://localhost:8545")
if client == nil {
fmt.Println("rpc.Dial err")
//panic("连接错误")
return
}
}
//获取账户列表
func getAccounts(client *rpc.Client) (accounts []string, err error) {
err = client.Call(&accounts, "eth_accounts")
if err == nil {
return accounts, nil
} else {
return nil, errors.New("账户列表获取错误")
}
}
//获取挖矿账户
func getCoinbase(client *rpc.Client) (coinbase string, err error) {
err = client.Call(&coinbase, "eth_coinbase")
if err == nil {
return coinbase, nil
} else {
return "", errors.New("挖矿账户获取错误")
}
}
//获取余额
func getBalance(client *rpc.Client, account string) (Balance int64, err error) {
var balance string
err = client.Call(&balance, "eth_getBalance", account, "latest")
if err != nil {
return -1, err
}
Balance, _ = strconv.ParseInt(balance, 0, 64)
return Balance, nil
}
func creatNewAccount(client *rpc.Client, password string) (newAccount string, err error) {
err = client.Call(&newAccount, "personal_newAccount", password)
if err != nil {
return "", err
}
return newAccount, nil
}
func main() {
//创建新账户
var password string = "123456"
newAccount, err := creatNewAccount(client, password)
if err != nil {
fmt.Println("err=", err)
}
fmt.Println("新账户为:", newAccount)
//获取账户列表
accounts, err := getAccounts(client)
if err != nil {
fmt.Println("err=", err)
}
for i, v := range accounts {
balance, err := getBalance(client, v)
if err != nil {
fmt.Println("err=", err)
} else {
fmt.Printf("账户%d的账号为:%s,余额为:%d\n", i, v, balance)
}
}
//获取挖矿账户
coinbase, err := getCoinbase(client)
if err != nil {
fmt.Println("err=", err)
}
fmt.Println("挖矿账户为:", coinbase)
//延迟关闭
defer client.Close()
}
任务完成
后续将完成转账与签名功能