使用 Golang 和智能合約互動
藉由 abigen 產出能與智能合約互動的 Go package 來操作合約
之前都是透過 PHP 去呼叫 Smart Contract,這引發兩個問題
一個是慢,另一個是套件不維護了。而 Golang 有官方套件可以用,速度又快,恰好解決了這兩個問題
這篇主要是說明如何透過工具把既有的 Smart Contract abi 轉成 Go package 來操作合約
前置作業
在 mac 環境中要先透過 Homebrew 安裝以下套件
brew update
brew tap ethereum/ethereum
brew install ethereum
brew install solidity
brew install protobuf
否則之後的步驟會出現
Please install solc
Please install protoc
安裝 go-ethereum
接著就是要安裝我們轉換的工具,官方套件自帶的 Abigen 指令可以把 abi 轉成 go package
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make devtools
產生 Go library file
安裝好之後,當然還要有 contract abi 才能拿來轉換
關於什麼是 contract abi 不在這篇的主題中,未來如果對合約有更深入的操作再來深入說明
取得目標合約的 abi.json 之後就可以執行指令
abigen --abi="./erc721.abi.json" --type="erc721" --pkg=erc721 --out="erc721.go"
參數名稱 | 說明 | 範例 |
---|---|---|
–abi | 合約 abi.json 的檔案路徑 | ./erc721.abi.json |
–type | 綁定到 struct 的 type 名稱 | erc721 |
–pkg | 產出檔案的 go package name | erc721 |
–out | 輸出的檔名 | erc721.go |
於是我們就會得到一個檔名為erc721.go
的檔案,點開查看會發現 package 名稱是erc721
比對裡面的 function 會發現有對應上 abi 中的合約 function
接著就可以透過引用 package 來操作合約啦!
在 go 中操作產出的 package
首先在程式中 import 剛剛產出的erc721
package
當然操作區塊鏈不可少的go-ethereum
也必須先引入
import (
erc721 "project/package-erc721/path"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
然後透過go-ethereum
操作智能合約
以下範例是以操作合約中TotalSupply
這個 function 為例
傳入一個智能合約的 contract address 字串:hexAddress
就可以得到該合約所發行的總數量,此範例是以 ERC721 的 NFT 合約為例
infuraUrl := "https://mainnet.infura.io/v3/38ad7d4b...97aa1d5c583"
client, err := ethclient.Dial(infuraUrl)
if err != nil {
return nil, err
}
defer client.Close()
address := common.HexToAddress(hexAddress)
instance, err := erc721.NewErc721(address, client)
if err != nil {
return nil, err
}
totalSupply, err := instance.TotalSupply(nil)
if err != nil {
return nil, err
}
return totalSupply, nil
以上就是如何使用 abigen 來產生 Smart Contract 對應的 go package
目前呼叫過的 function 有Owner
, OwnerOf
, TotalSupply
,都有成功取得區塊鏈上資料
其他的應用待未來有機會操作再來挖掘