通常現在創建錢包不管是 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.