一隻箱子裡的貓,看著電腦螢幕

Schrödinger's Programmer

奔跑吧工程師,趁年輕跑得越遠越好

使用 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