golang区块链能做什么 (golang区块链入门)

难点:

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,麻烦)

golang区块链如何实现数据安全,golang只应用于区块链吗

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

golang区块链如何实现数据安全,golang只应用于区块链吗

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

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

golang区块链如何实现数据安全,golang只应用于区块链吗

golang区块链如何实现数据安全,golang只应用于区块链吗

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

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
	}
}

第五步:展示执行效果

golang区块链如何实现数据安全,golang只应用于区块链吗

golang区块链如何实现数据安全,golang只应用于区块链吗