【Flutter】【WEB3】判断一个String是不是钱包地址
前言
判断一个字符串是否是区块链地址,主要取决于它对应的区块链类型。不同的区块链有不同的地址格式,例如:
- 👉🏻 Ethereum(ETH)地址:42 个字符,以 0x 开头,后面是 40 位十六进制字符。
- 👉🏻 Bitcoin(BTC)地址:长度
26-35 之间,可能以 1、3、bc1 开头。 - 👉🏻 Solana(SOL)地址:基于 Base58,通常 43-44 个字符。
- 👉🏻 TRON(TRX)地址:以 T 开头,Base58 编码。
代码实现
extension BlockchainValidator on String {
/// 判断是否是以太坊地址(ETH)
bool get isEthereumAddress {
final ethRegExp = RegExp(r'^0x[a-fA-F0-9]{40}$');
return ethRegExp.hasMatch(this);
}
/// 判断是否是比特币地址(BTC)
bool get isBitcoinAddress {
final btcRegExp = RegExp(r'^(1|3|bc1)[a-zA-HJ-NP-Z0-9]{25,39}$');
return btcRegExp.hasMatch(this);
}
/// 判断是否是 Solana 地址(SOL)
bool get isSolanaAddress {
final solRegExp = RegExp(r'^[1-9A-HJ-NP-Za-km-z]{32,44}$');
return solRegExp.hasMatch(this);
}
/// 判断是否是 TRON 地址(TRX)
bool get isTronAddress {
final tronRegExp = RegExp(r'^T[a-zA-HJ-NP-Z0-9]{33}$');
return tronRegExp.hasMatch(this);
}
/// 通用方法:检查一个地址属于哪种区块链
bool get isBlockchainAddress {
return isEthereumAddress || isBitcoinAddress || isSolanaAddress || isTronAddress;
}
}
使用事例:
final String result = await Get.toNamed(RouterManifest.walletScanPage);
if (result.isBlockchainAddress) {
_paymentAddressController?.text = result;
} else {
_paymentAddressController?.text = "";
toastError("不是有效的钱包地址");
}
结论
- ✅ 以太坊(ETH):0x 开头,后面 40 个十六进制字符
- ✅ 比特币(BTC):以 1、3 或 bc1 开头,长度 26-39 之间
- ✅ Solana(SOL):Base58 编码,长度 32-44
- ✅ TRON(TRX):T 开头,后面 33 个 Base58 编码字符