go语言后端调用以太坊rpc

任务要求:使用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

命令解析:

  1. --identity "MyNodeName":为你的节点设置身份标识,以更容易在节点列表中识别 
  2. --rpc:开启 RPC 接口
  3. --rpcport "8080":RPC 端口
  4. --rpccorsdomain "*":设置能连接到你的节点的 URL,用来完成 RPC 任 务。* 指任何 URL 都能连接到你。
  5. --datadir "data0":区块数据文件夹 (在geth同目录下生成data0文件夹)
  6. --port "30303":用来监听其他节点的端口
  7. --nodiscover:你的节点不会被其他人发现,除非他们手动添加你
  8. --rpcapi "db,eth,net,web3":提供给别人使用的 RPC API,默认为 web3 接口
  9. 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()

}

任务完成

后续将完成转账与签名功能

发布了29 篇原创文章 · 获赞 18 · 访问量 4063

猜你喜欢

转载自blog.csdn.net/Aaron_Kings/article/details/105279111