iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

再開始串新的API之前先把昨天新增的struct整理一下,將struct類型的檔案放置到/internal/model。

在/internal/model新增balanceModel.go
https://ithelp.ithome.com.tw/upload/images/20221003/20140358hsLLaOLFTg.png
將昨天寫的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)
}

然後測試一下是功能都正常
https://ithelp.ithome.com.tw/upload/images/20221003/20140358L5KdEAu8L6.png
這邊說明一下為什麼要取得Nonce呢?根據Managing nonces with Nethereum中提到,Nonces是一個地址的交易數量,也是獨一無二的,為了避免重放攻擊,所以我們在提交交易時需要先知道我們下一筆交易的Nonce是多少才能夠順利提交交易。
明天會來繼續開發新的API function。


上一篇
[Day 18] Elrond full node (九)
下一篇
[Day 20] Elrond full node (十一)
系列文
如何打造屬於自己的區塊鏈錢包服務31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言