abi生成go文件

  1. abi文件生成需要安装solidity,参考上一篇文章

MacOS 安装 solidity

或者通过remix将智能合约进行编译,拷贝编译好的abi

  1. 下载以太坊源码并变异abigen工具包

git clone https://github.com/ethereum/go-ethereum.git
go install ./cmd/abigen

可以在GOBIN对应的目录下看到生成的abigen工具

  1. 通过abigen根据abi文件生成对应go文件

abigen --abi contract-nft-nbc.abi --pkg nbc --type nbcToken --out nbc.go

–abi表示abi文件名

–pkg表示生成文件的所属包

–type表示生成数据结构的名称,不填就默认是包名

–out表示生成的文件名

  1. 调用合约

本地是单元测试代码,比较乱,下面代码是从网上找的示例。

使用go调用智能合约

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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值