go简单连接智能合约

590 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 一、获取合约abi

image.png 粘贴至go项目目录下的abi文件中

合约代码改动,abi也是需要更换的

**二、使用abigen工具生成go文件 **

abigen --abi xx.abi --pkg PackageName --type StructName --out xx.go

abi 文件在 remix 编译时可以得到

pkg 指定输出文件的包名,也就是上一级目录名称

type 指定合约结构体名称

out 指定输出go文件名称

使用后会生成一个go文件,里面有合约方法

三、调用智能合约

package config
 
import (
	"Sharing/Agreement"
	"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"
	"log"
	"math/big"
)
 
const (
	Prikey           = "5fd7eb82fbd4c5cc87fbeb867ff4804537723d80a5289606c28ca5c8eed4aa77"
	ShareFishAddress = "0x154AD795Fb5dEf4BD0e21B29d316c6aAFc2D8E8b"
	gasLimit = 3000000
)
 
//获取client
func GetClient() (*ethclient.Client, error) {
    //ganache为7545,私链为8545
	client, err := ethclient.Dial("http://127.0.0.1:7545")
	//client, err := ethclient.Dial("https://rinkeby.etherscan.io")
 
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()
	return client, nil
}
 
// 获取合约对象
func GetAddress(client *ethclient.Client) (*Agreement.User, error) {
	contract, err := Agreement.NewUser(common.HexToAddress(ShareFishAddress), client)
	if err != nil {
		log.Fatal(err)
	}
	return contract, err
}
 
//获取Opts对象
func GetOpts() *bind.TransactOpts {
	privateKey := GetPrivateKey()
	opts := bind.NewKeyedTransactor(privateKey)
	fmt.Println("opts:", opts)
	return opts
}
 
//获取私钥
func GetPrivateKey() *ecdsa.PrivateKey {
	privateKey, err := crypto.HexToECDSA(Prikey)
	if err != nil {
		panic(err)
	}
	return privateKey
}
 
// 获取 gasPrice
func GetGasPrice(client *ethclient.Client) (*big.Int, error) {
	gasPrice, err := client.SuggestGasPrice(context.Background())
 
	if err != nil {
		return big.NewInt(0), err
	} else {
		fmt.Println("gasPrice", gasPrice)
		return gasPrice, nil
	}
 
}

调用合约方法

package handler


import (
	config "Sharing/Config"
	"crypto/ecdsa"
	"fmt"
	"github.com/ethereum/go-ethereum/common"
	"github.com/gin-gonic/gin"
	"net/http"
)
//登录
func login(c *gin.Context) {
	//初始化client
	client, err := config.GetClient()
	if err != nil {
		fmt.Println(err)
		respError(c, err)
		return
	}
	//初始化合约地址
	contract, err := config.GetAddress(client)
	if err != nil {
		respError(c, err)
		return
	}
 
	data, err := config.LoginMethod(client,contract)
    }