go语言与智能合约调用

remix里写一个合约作为示例

pragma solidity^0.8;

contract calldemo{
    uint256 count;
    constructor() public {
        count = 2022;
    }
    function setCount(uint256 _count) external {
        count =  _count;
    }
    function getCount() public view returns (uint256){
        return count;
    }
}

编译后复制abi信息

新建目录,在目录中新建abi文件,将abi信息存入文件calldemo.abi中

执行

abigen -abi calldemo.abi -type calldemo -pkg main -out calldemo.go

其中参数含义如下

-abi:指定传入的abi文件

-type:指定输出文件中基本结构类型

-pkg:指定输出文件package名称

-out:指定输出文件名

在本地开启节点

geth --datadir ./data --networkid 18  --port 30303  --http --http.addr 0.0.0.0 --http.vhosts "*" --http.api "db,net,eth,web3,personal" --http.corsdomain "*" --snapshot=false --mine --miner.threads 1 --http.port 8545 --miner.gasprice 0 --allow-insecure-unlock  console 2> 1.log

将合约部署到本地节点,拿到合约地址

选择web3 provider环境,地址为本地8545端口

package main   
import (
    "fmt"
    "log"
    "github.com/etherum/go-ethereum/common"
    "github.com/etherum/go-etherum/ethclient"
)

func main() {
    conn,err := ethclient.Dial("http://localhost:8545")
    if err!= nil {
        log.Fatalf("Failed to connect to etherum client: %v",err)
    }
    defer conn.Close()

    demonIns, err := newCalldemo(common.HexToAddress("合约地址"),conn)
  if err != nil {
    log.Fatalf("Failed to NewCalldemo : %v",err)
  }
  
  val, err := demoIns.GetCount(nil)
  if err != nil {
    log.Fatalf("Failed to GetCount: %v", err)
  }

  fmt.Println(val)
}

此时可以通过调用函数GetCount()

其中传参值代表身份信息,这里不需要消耗gas所以可以传个nil

posted @ 2022-04-14 09:56  Yu_so1dier0n  阅读(195)  评论(0编辑  收藏  举报