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 }}
第五步:展示执行效果