建立專案
建立專案。
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
檔。
將 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
| {0 Check out https://github.com/memochou1993 false}
|
程式碼
參考資料