go語言與智慧合約呼叫
阿新 • • 發佈:2022-04-14
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