go简单连接智能合约

一、获取合约abi

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

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

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

abigen --abi xx.abi --pkg PackageName --type StructName --out xx.go
  1. abi 文件在 remix 编译时可以得到
  2. pkg 指定输出文件的包名,也就是上一级目录名称
  3. type 指定合约结构体名称
  4. out 指定输出go文件名称

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

三、调用智能合约

package configimport ("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,私链为8545client, 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 handlerimport (config "Sharing/Config""crypto/ecdsa""fmt""github.com/ethereum/go-ethereum/common""github.com/gin-gonic/gin""net/http"
)
//登录
func login(c *gin.Context) {//初始化clientclient, 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)}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部