iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

挑戰已經到了2/3,每天都在與進度和死線追趕,希望能撐到完賽

今天繼續整合API的功能,整合是取得node shard的資訊,為什麼要取的shard的資訊呢,因為需要知道目前已確認的最後一個block高度,之前的文章有提到,交易所需要監控每一個block內的transaction是否有自己交易所的Address然後來做處理,如果你有使用交易所去withdraw或是deposit加密貨幣的話,通常會看到上面會根據你選擇的區塊鏈而顯示需要多少區塊確認,這個意思是指假設上面寫10個區塊確認,就是今天交易所parser到最新的block有屬於自己address的交易,會先儲存進DB紀錄起來,這時候還不會真的撥款和扣款,而是等到parser到那個block後10個區塊都沒發生reorg之類的情況就視為已確認且無法更改的狀態,這時才會真的撥款和扣款。
首先看一下這隻API
https://ithelp.ithome.com.tw/upload/images/20221004/20140358lRmYqG4lwv.png
Elrond前面提到有三個shard和一個meta chain,我們API所帶的shardId對應是
shard 0: 0
shard 1: 1
shard 2: 2
meta chain: 4294967295
至於為什麼是4294967295我也不知道XD,我們主要是取meta chain的資料,因為meta chain的reponse上面會有其他三個shard的最新高度,這個也可以用來確認自己運行的node和public node是否存在區塊高度落後的情況。
首先先建立response的model
在model下建立networkStatusRes.go

package model

type NetworkStatusRes struct {
	Code string     `json:"code"`
	Data StatusData `json:"data"`
}

type StatusData struct {
	Status Status `json:"status"`
}

type Status struct {
	ErdCrossCheckBlockHeight      string `json:"erd_cross_check_block_height"`
	ErdCurrentRound               int    `json:"erd_current_round"`
	ErdEpochNumber                int    `json:"erd_epoch_number"`
	ErdHighestFinalNonce          int    `json:"erd_highest_final_nonce"`
	ErdNonce                      int    `json:"erd_nonce"`
	ErdNonceAtEpochStart          int    `json:"erd_nonce_at_epoch_start"`
	ErdNoncesPassedInCurrentEpoch int    `json:"erd_nonces_passed_in_current_epoch"`
	ErdRoundAtEpochStart          int    `json:"erd_round_at_epoch_start"`
	ErdRoundsPassedInCurrentEpoch int    `json:"erd_rounds_passed_in_current_epoch"`
	ErdRoundsPerEpoch             int    `json:"erd_rounds_per_epoch"`
}

由於這個是屬於取得node資料的函式所以將函式建立在internal/node/nodeUtils.go

package node

import (
	utils "elrondWallet/internal"
	"elrondWallet/internal/model"
	"fmt"
	"github.com/pelletier/go-toml"
)

var (
	conf, _ = toml.LoadFile("./configs/config.toml")
	url     = conf.Get("server.url").(string)
)

func GetNodeInfo() {
	var networkStatusRes model.NetworkStatusRes
	utils.HttpGet(url+"/network/status/4294967295", &networkStatusRes)
	fmt.Println(networkStatusRes)
	fmt.Printf("erd_highest_final_nonce: %d\n", networkStatusRes.Data.Status.ErdHighestFinalNonce)
}

然後執行來測試一下
https://ithelp.ithome.com.tw/upload/images/20221004/201403588GfE7TtuVT.png
成功的取得meta chain的response了,至於為什麼要選meta chain還有另外一個原因,因為可以用meta chain的block hight去取得hyperblock,裡面會記載著三個shard的交易紀錄,只要呼叫一個API就可以取得所有交易紀錄,是一個非常便利的API呢。


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

尚未有邦友留言

立即登入留言