[C#] 透過 Trongrid 取得 Tron 一個指定區塊中的交易資料

2024-12-02

最近因為在幫忙處理一些鏈上數據的問題,主要針對 Tron 鏈,因為需要一整個區塊的資料

我發現其實有蠻多辦法可以拿到的,今天這方法算是可以解決部分問題..


主要試因為我要判斷抓取錢包位置,並且要判斷交易 USDT,不過這篇文章的重點先放在如何撈取整個完整的區塊資料

我是使用 v1/blocks/{blockNum}/events 來做到,接下來就不廢話直接給程式碼


1. 我有用到 RestSharp,記得先安裝

2. 因為他一筆回來只有 200 個,但是在撈取 json 的時候 ,在 meta => links 如果是有網址的就得繼續撈下去



所以就得透過迴圈一直撈下去,這邊我就簡單做出撈出 Block 的資料,並且判斷 from , to 不是空的交易資訊,我就列出 txid , from, to , 交易金額

中間他回應的錢包也不是用 trx 錢包的格式所以要稍微轉換一下

public class BlockData { public List<Datum> data { get; set; } public bool success { get; set; } public Meta meta { get; set; } public class Datum { public int block_number { get; set; } public object block_timestamp { get; set; } public string caller_contract_address { get; set; } public string contract_address { get; set; } public int event_index { get; set; } public string event_name { get; set; } public Result result { get; set; } public ResultType result_type { get; set; } public string @event { get; set; } public string transaction_id { get; set; } public class Result { [JsonProperty("0")] public string _0 { get; set; } [JsonProperty("1")] public string _1 { get; set; } [JsonProperty("2")] public string _2 { get; set; } public string from { get; set; } public string to { get; set; } public string value { get; set; } } public class ResultType { public string from { get; set; } public string to { get; set; } public string value { get; set; } } } public class Meta { public long at { get; set; } public string fingerprint { get; set; } public Links links { get; set; } public int page_size { get; set; } } public class Links { public string next { get; set; } } }

public static string GetBase58CheckAddress(string ethAddress) { string fixaddress = "0x41" + TronNet.ByteArrary.RemoveHexPrefix(ethAddress); byte[] addressBytes = TronNet.ByteArrary.HexToByteArray(fixaddress); byte[] hash0 = ToSHA256(addressBytes); byte[] hash1 = ToSHA256(hash0); var checkSum = hash1.Take(4).ToArray(); return Base58Encoding.Encode(addressBytes.Concat(checkSum).ToArray()); } public static byte[] ToSHA256(byte[] data) { using (var alg = SHA256.Create()) { var hashValue = alg.ComputeHash(data); return hashValue; } }

/// <summary> /// 透過 trongrid 取得 block 中的 transaction /// </summary> /// <param name="blockNum">Block Number </param> static void GetBlockData(string blockNum) { string baseUrl = $"https://api.trongrid.io/v1/blocks/{blockNum}/events"; var allTransactions = new List<BlockData.Datum>(); using (HttpClient client = new HttpClient()) { string nextPage = baseUrl; while (!string.IsNullOrEmpty(nextPage)) { var response = client.GetStringAsync(nextPage).Result; var blockData = JsonConvert.DeserializeObject<BlockData>(response); foreach (var d in blockData.data) { if (d.result.from != null && d.result.to != null) { Console.WriteLine("txid:" + d.transaction_id + ", from:" + GetBase58CheckAddress(d.result.from) + " , to:" + GetBase58CheckAddress(d.result.to)); } } // 暫存交易資料 if (blockData.data != null) { allTransactions.AddRange(blockData.data); } if (blockData.meta.links != null) { nextPage = blockData.meta != null ? blockData.meta.fingerprint : ""; if (!string.IsNullOrEmpty(blockData.meta.links.next)) { nextPage = blockData.meta.links.next; } } else { break; } } } Console.WriteLine($"獲取到 {allTransactions.Count} 筆交易"); }


result:


挑出來一筆做們做驗證

Transaction ff67cb02dd3b358f4e8c0b1aa9de90e819ec9c564832d961619973f0d393ee9a | TRONSCAN

程式印出來的

txid:ff67cb02dd3b358f4e8c0b1aa9de90e819ec9c564832d961619973f0d393ee9a, from:TT27CwjDsqWxrFLzs96xeKVhFhihkD1DjG , to:TEk2MfjDGuM4UMgmCqZwj2WRgtkwbmtrL7 ,amount:1442000000


大概先筆記到這邊 ,希望有快速幫到需要的你

reference:

https://developers.tron.network/reference/get-events-by-block-number

api.trongrid.io/v1/blocks/64991111/events



當麻許的碎念筆記 2014 | Donma Hsu Design.