最近看了使用go调用智能合约的方式,感觉比truffle用起来更加习惯,部署合约不是很方便,但是调用合约更方便
在remix上部署好合约之后,就可以使用golang调用了
1,下载以太坊源码并编译abigen
工具包
abigen
在go-ethereum\cmd\abigen
目录下,使用go build编译并打包,复制到$GOPATH
目录下
2,部署智能合约
随意部署一个erc20合约,把abi拷贝出来,本文部署的是名为CHT的token
remix如何部署合约不再赘述了
3,新建一个go项目,新建cht.abi文件,把abi粘贴进去
4,使用abigen
工具生成abi文件对应的go文件
abigen --abi cht.abi --pkg cht --type chtToken --out cht.go
–abi表示abi文件名
–pkg表示生成文件的所属包
–type表示生成数据结构的名称,不填就默认是包名
–out表示生成的文件名
可以使用abigen help
查看所有用法
5,方法中编写代码调用合约
package main
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"math/big"
"mydefi1/abi/cht"
)
const (
keyStorePath = `your keyStorePath`
fromKeyStore = `your from keyStore`
toAddress = "0x477257735cCEF9C7d42856649c7149865D04eDeb"
chainId = 7851254
chtAddress = "0xb9bD7405797CfFBc7e57309444b4af89c39cA92c" //合约地址
)
func main() {
//服务器地址
conn, err := ethclient.Dial("http://172.16.30.174:8545")
if err != nil {
fmt.Println("Dial err", err)
return
}
defer conn.Close()
//创建合约对象
chtToken, err := cht.NewChttoken(common.HexToAddress(chtAddress), conn)
if err != nil {
fmt.Println("newChttoken error", err)
}
//调用查询方法
//symbol, err := chtToken.Decimals(nil)
//if err != nil {
// fmt.Println("invoke error", err)
//}
//fmt.Println(symbol)
res1, err := chtToken.BalanceOf(&bind.CallOpts{
Pending: false,
From: common.Address{},
BlockNumber: nil,
Context: nil,
}, common.HexToAddress(toAddress))
if err != nil {
fmt.Println("BalanceOf error", err)
}
fmt.Println(res1)
//调用其他方法,需要组装from
//解锁对应账户
fromKey, err := keystore.DecryptKey([]byte(fromKeyStore), "abc123")
if err != nil {
fmt.Println(err)
}
auth, err := bind.NewKeyedTransactorWithChainID(fromKey.PrivateKey, new(big.Int).SetInt64(chainId))
if err != nil {
fmt.Println(err)
}
//fromPrivateKey := fromKey.PrivateKey
//fromPublicKey := fromPrivateKey.PublicKey
//fromAddr := crypto.PubkeyToAddress(fromPublicKey)
tx, err := chtToken.Transfer(&bind.TransactOpts{
From: auth.From,
//Nonce: nil,
Signer: auth.Signer,
//Value: nil,
//GasPrice: nil,
//GasFeeCap: nil,
//GasTipCap: nil,
//GasLimit: 0,
//Context: nil,
//NoSend: false,
}, common.HexToAddress(toAddress), new(big.Int).SetInt64(1e18))
if err != nil {
fmt.Println(err)
}
fmt.Println(tx.Hash())
//等待挖矿完成
receipt, err := bind.WaitMined(context.Background(), conn, tx)
if err != nil {
fmt.Println("WaitMined error", err)
}
fmt.Println(receipt.BlockNumber)
//转账之后查询余额
res2, err := chtToken.BalanceOf(&bind.CallOpts{
Pending: false,
From: common.Address{},
BlockNumber: nil,
Context: nil,
}, common.HexToAddress(toAddress))
if err != nil {
fmt.Println("BalanceOf error", err)
}
fmt.Println(res2)
}
转载请注明来源