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