MacOS 安装 solidity
或者通过remix将智能合约进行编译,拷贝编译好的abi
git clone https://github.com/ethereum/go-ethereum.git
go install ./cmd/abigen
可以在GOBIN对应的目录下看到生成的abigen工具
abigen --abi contract-nft-nbc.abi --pkg nbc --type nbcToken --out nbc.go
–abi表示abi文件名
–pkg表示生成文件的所属包
–type表示生成数据结构的名称,不填就默认是包名
–out表示生成的文件名
本地是单元测试代码,比较乱,下面代码是从网上找的示例。
使用go调用智能合约
package mainimport ("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 = 7851254chtAddress = "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)
}