再開始串新的API之前先把昨天新增的struct整理一下,將struct類型的檔案放置到/internal/model。
在/internal/model新增balanceModel.go
將昨天寫的struct移過去
package model
type BalanceRes struct {
Code string `json:"code"`
Data BalanceResData `json:"data"`
}
type BalanceResData struct {
Balance string `json:"balance"`
BlockInfo BalanceResDataInfo `json:"blockInfo"`
}
type BalanceResDataInfo struct {
Nonce int `json:"nonce"`
Hash string `json:"hash"`
RootHash string `json:"rootHash"`
}
修改walletUtils.go
import (
utils "elrondWallet/internal"
"elrondWallet/internal/model"
"encoding/json"
"fmt"
"github.com/ElrondNetwork/elrond-sdk/erdgo"
"github.com/pelletier/go-toml"
)
func GetAddressBalance(address string) {
url := conf.Get("server.url").(string)
body := utils.HttpGet(url + "/address/" + address + "/balance")
var balanceRes model.BalanceRes
err := json.Unmarshal(body, &balanceRes)
if err != nil {
return
}
fmt.Println(balanceRes)
fmt.Printf("balance: %s\n", balanceRes.Data.Balance)
}
在/internal/model新增addressNonceModel.go
package model
type AddressNonceRes struct {
Code string `json:"code"`
Data AddressNonceData `json:"data"`
}
type AddressNonceData struct {
Nonce int `json:"nonce"`
BlockInfo AddressNonceInfo `json:"blockInfo"`
}
type AddressNonceInfo struct {
Nonce int `json:"nonce"`
Hash string `json:"hash"`
RootHash string `json:"rootHash"`
}
在寫get nonce時發現code重複了所以這邊先優化一下,因為呼叫完API都要做json.Unmarshal,何不呼叫的時候做呢,在HttpGet函式這邊傳一個any的model,而傳進來的值是各model的址,平常Python、JAVA寫久了,寫Golang還真的滿有樂趣的。
func HttpGet(url string, model any) {
resp, err := http.Get(url)
if err != nil {
// handle error
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
}
}(resp.Body)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
err = json.Unmarshal(body, &model)
if err != nil {
return
}
}
walletUtils.go 這邊呼叫GetAddressBalance跟新增的GetAddressNonce要改寫,
func GetAddressBalance(address string) {
var balanceRes model.BalanceRes
utils.HttpGet(url+"/address/"+address+"/balance", &balanceRes)
fmt.Println(balanceRes)
fmt.Printf("balance: %s\n", balanceRes.Data.Balance)
}
func GetAddressNonce(address string) {
var addressNonceRes model.AddressNonceRes
utils.HttpGet(url+"/address/"+address+"/nonce", &addressNonceRes)
fmt.Println(addressNonceRes)
fmt.Printf("nonce: %d\n", addressNonceRes.Data.Nonce)
}
然後測試一下是功能都正常
這邊說明一下為什麼要取得Nonce呢?根據Managing nonces with Nethereum中提到,Nonces是一個地址的交易數量,也是獨一無二的,為了避免重放攻擊,所以我們在提交交易時需要先知道我們下一筆交易的Nonce是多少才能夠順利提交交易。
明天會來繼續開發新的API function。