1. 程式人生 > 其它 >go語言與智慧合約呼叫

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