[C#] 從詐騙註記詞測試 TronLink 預設錢包的還原機制

  • 944
  • 0

通常現在創建錢包不管是 ETH 或是 TRON 基本上都是基於 BIP39 使用 12 , 24 當作註記詞創建錢包

最近在測試一個詐騙的東西想用程式端去還原錢包,發現 ERC20 和 TRC20 預設的 Path 是不一樣的

基本上這篇範例基於這組 註記詞  alarm fetch churn bridge exercise tape speak race clerk couch crater letter

請注意這是一組詐騙的註記詞,不要往裡面的錢包轉帳打款
 

1. 安裝 Nethereum.HdWallet

預設的 ERC20 位置會是 m/44'/60'/0'/0 但是 TRC20 預設是 m/44'/195'/0'/0

C# Code:


            //這是詐騙註記詞請勿使用
            //This is a scam seed phrase. Do not use it.
            var words = "alarm fetch churn bridge exercise tape speak race clerk couch crater letter";

            var wallet1 = new Nethereum.HdWallet.Wallet(words, null, "m/44'/195'/0'/0");


            var account = wallet1.GetAccount(0);
            var trxAddress = WalletUtil.GetBase58CheckAddress(account.Address);
            _Result = trxAddress;
            //This is a scam wallet. Do not use it.
            //Result: TS64QAQEL5GfbB61C86ZSJjfkVi6kPFmEA

基本上,因為透過 TronLink or METAMASK 那一段在程式內是不用設定 password 的直接填寫 null , TRC20 用的 Path  是不同的

其他的就大同小異 可以參考我之前的文章 https://blog.no2don.com/2021/11/c-trx-eth-nethereum.html

C# 轉換 ERC20 Wallet to TRC20 Wallet Code:


public class WalletUtil
 {


     public static string GetMoneyString(decimal number, int maxLessDigNum = 2)
     {
         if (number == 0)
         {
             return "0";
         }
         if (number.ToString().Contains("."))
         {
             var format = "#,###,###,####.";
             var tmpDot = number.ToString().Split('.')[1];

             var max = maxLessDigNum;
             if (tmpDot.Length < max)
             {
                 max = tmpDot.Length;
             }




             for (var i = 0; i < max; i++)
             {
                 format += "#";
             }
             return number.ToString(format);
         }
         else
         {
             return number.ToString("#,###,###,####");
         }
     }


     public static Nethereum.Web3.Accounts.Account GetHDWalletInfoByIndex(string words, string password, int index)
     {

         return new Nethereum.HdWallet.Wallet(words, password).GetAccount(index);
     }

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

     }


 


     public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
     {
         System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
         dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
         return dtDateTime;
     }


    


     public static long GetCurrentBlock(IServiceCollection tronService)
     {


         IServiceCollection services = new ServiceCollection();


         IServiceCollection _TronServiceNile = new ServiceCollection();

         services = tronService;


         services.AddLogging();
         var service = services.BuildServiceProvider();

         var newestBlock = service.GetService<IWalletClient>().GetProtocol().GetNowBlock(new TronNet.Protocol.EmptyMessage());

         return newestBlock.BlockHeader.RawData.Number;
     }
  

 }
 
 


請注意這範例結果的錢包 TS64QAQEL5GfbB61C86ZSJjfkVi6kPFmEA 是詐騙錢包
你去 Tron Scan 上面看 他會有警告,該錢包是授權另一個錢包全權管理,就算你有註記詞有私鑰你也無法去動裡面的錢

主要是因為要測試一些東西需要取得 TronLink 使用註記詞產出的錢包,剛好看到詐騙的註記詞就拿來測試了

---

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

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