Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

使用 Golang 和智能合約互動

藉由 abigen 產出能與智能合約互動的 Go package 來操作合約

Ray

之前都是透過 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 剛剛產出的erc721package
當然操作區塊鏈不可少的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,都有成功取得區塊鏈上資料
其他的應用待未來有機會操作再來挖掘

最新文章

Category

Tag