难点:
1、采用rpc模式,脱离Dapp或者钱包等插件
2、不是本身链的货币,获得erc20的代币(也包括usdt等)
3、国内最新版本资料太少(好多都不是最新版本)
前提:
我用的是bsc测试链,自己发行了一个代币用于测试
第一步:rpc地址获得:
A: https://nodereal.io/ (包含bsc正式和测试)
B: https://infura.io/
第二个:发行的代币的ABI生产golang的需要文件文件
加载依赖包:go getgithub.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
}
}
第五步:展示执行效果

