使用 Go 與 Ethereum 智能合約互動

建立專案

建立專案。

1
2
mkdir eth-go-binding-example
cd eth-go-binding-example

初始化 Go Modules。

1
go mod init github.com/memochou1993/eth-go-binding-example

新增 .env 檔。

1
2
CONTRACT_ADDRESS=your-contract-address
PROVIDER_URL=wss://eth-goerli.g.alchemy.com/v2/your-api-key

新增 .gitignore 檔。

1
.env

將 JSON 格式的 ABI 從 Truffle 專案複製到 abi/TodoList.json 檔。

1
2
3
4
5
6
7
8
[
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
// ...
]

使用 abigen 工具產生 Go 程式碼。

1
abigen --abi="abi/TodoList.json" --type="TodoList" --pkg="contract" --out="contract/todo_list.go"

新增 main.go 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
"log"
"math/big"
"os"

"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
_ "github.com/joho/godotenv/autoload"
"github.com/memochou1993/eth-go-binding-example/contract"
)

func main() {
conn, err := ethclient.Dial(os.Getenv("PROVIDER_URL"))
if err != nil {
log.Fatal(err)
}

todoList, err := contract.NewTodoList(common.HexToAddress(os.Getenv("CONTRACT_ADDRESS")), conn)
if err != nil {
log.Fatal(err)
}

task, err := todoList.Tasks(&bind.CallOpts{}, new(big.Int))
if err != nil {
log.Fatal(err)
}

log.Print(task)
}

執行程式碼。

1
go run main.go

輸出如下:

1
{0 Check out https://github.com/memochou1993 false}

程式碼

參考資料