2023年2月:使用Golang实现服务器端的ERC20代币余额和转账功能

发表时间: 2023-02-17 17:54

难点:

1、采用rpc模式,脱离Dapp或者钱包等插件

2、不是本身链的货币,获得erc20的代币(也包括usdt等)

3、国内最新版本资料太少(好多都不是最新版本)

前提:

我用的是bsc测试链,自己发行了一个代币用于测试

第一步:rpc地址获得:

A: https://nodereal.io/   (包含bsc正式和测试)B: https://infura.io/

第二个:发行的代币的ABI生产golang的需要文件文件

加载依赖包:go get github.com/ethereum/go-ethereum

在这个目录下面有一个Abi生产脚本
go-ethereum/cmd/abigen/main.go(可以find的命令找到),通过 "go build -o mainExe abigen/main.go" 生成可以执行脚本,注意(我用户linux的环境,window环境需要安装gcc,麻烦)


接下来,通过刚刚mainExe脚本通过abi信息生成go类,注意我将abi数据保存到了文件token.abi.

生成命令:./mainExe --abi token.abi --pkg code --type Token --out token.go

第三步:拥有代币的私钥字符串项目布局





第四步:开始获取数据(上代码)

import (	"context"	"crypto/ecdsa"	"fmt"	"github.com/ethereum/go-ethereum/accounts/abi/bind"	"github.com/ethereum/go-ethereum/common"	"github.com/ethereum/go-ethereum/crypto"	"github.com/ethereum/go-ethereum/ethclient"	"github.com/ethereum/go-ethereum/params"	"github.com/ethereum/go-ethereum/rpc"	"go/test/code"       //放置生成文件位置	"log"	"math"	"math/big")func main() {url := "https://bsc-testnet.nodereal.io/v1/17a4161812b6492d844419a35990b160"clt, e := rpc.Dial(url)fmt.Println(e)fmt.Println(clt)client := ethclient.NewClient(clt)fmt.Println("==version==>", params.Version)inputPrivateKey := "ee3645f62f55205***********************0be2700800352"    //私钥privateKey, err := crypto.HexToECDSA(inputPrivateKey)chainID, err := client.NetworkID(context.Background())	fmt.Println("=======888888=====>", chainID)	auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID)	if err != nil {		log.Fatalln("读取keystore失败", err)	} else {		fmt.Println(auth)	}  var tokenAddress="0xA30C1Afe3338Ca72f40EA2b81d2883C7bb7AAf6C"       //代币地址	//开始使用生成文件  token, err := code.NewToken(common.HexToAddress(tokenAddress), client)	if err != nil {		log.Fatalln("获取token失败", err)		panic(err)	}	balanceInt, errInt := token.BalanceOf(nil, common.HexToAddress(fromAddress.String()))	if errInt != nil {		log.Fatalln("token balance of", err)	}	log.Println("to address balance: ", balanceInt)	amount := big.NewFloat(2.00)      //测试转2个代币	//这是处理位数的代码段	tenDecimal := big.NewFloat(math.Pow(10, 18))	convertAmount, _ := new(big.Float).Mul(tenDecimal, amount).Int(&big.Int{})	toAccount := "0xb4377fb04FE5aDe3C359ea43290cd354308807bF"      //测试收笔地址	tx, err := token.Transfer(auth, common.HexToAddress(toAccount), convertAmount)	if nil != err {		fmt.Println("=====>", err)	} else {		fmt.Printf("result: %v\n", tx.Hash().Hex())        //获得交易id	}}

第五步:展示执行效果