携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 一、获取合约abi
粘贴至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)
}