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

  • 940
  • 0

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

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

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

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


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

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

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

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

BlockData.cs


    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; }
        }
    }

c-sharp-convert-wallet-to-trx-wallet.cs 



        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;
            }

        }

c-sharp-tron-grid-get-block-transaction-info.cs


        /// <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

---

請你暫時把你的勇氣給我 在夢想快消失的時候 讓我的 Code 用力的穿過天空 為愛我的人做一秒英雄 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力…

Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer.