下载地址:https://pan38.com/xiazai/index.php?id=18 提取码:7147
哈喽大家好!我是爱写代码的技术UP主!今天给大家带来一个超实用的项目——USDT模拟转账器Java版!完全本地运行,仅供学习区块链原理使用哦!🚀
⚠️重要声明
本项目仅供学习参考!严禁用于任何非法用途!
不涉及真实区块链操作!不连接真实网络!
📦 项目效果预览
🎨 简洁的Swing界面
💸 模拟USDT转账流程
📊 交易记录查看
🔐 模拟钱包地址生成
🛠️ 技术栈
Java 17
Swing(GUI)
模拟数据生成
💻 完整代码实现
- 主界面类 - USDTSimulator.java
java
import javax.swing.;
import java.awt.;
import java.awt.event.;
import java.util.;
import java.util.List;
/**
- USDT模拟转账器 - 仅供学习参考
作者:B站技术UP主
*/
public class USDTSimulator extends JFrame {// 组件声明
private JTextField fromField, toField, amountField;
private JTextArea logArea;
private JComboBox walletCombo;
private DefaultListModel txListModel;
private JList transactionList;// 模拟数据
private Map walletBalances;
private List transactions;
private Random random;public USDTSimulator() {
setTitle("💰 USDT模拟转账器 v1.0 - 仅供学习参考"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setLocationRelativeTo(null); initData(); initUI(); // 启动时显示免责声明 showDisclaimer();}
private void initData() {
walletBalances = new HashMap<>(); transactions = new ArrayList<>(); random = new Random(); // 初始化几个模拟钱包 String[] wallets = { "TXmjhS...4Bc3(我的主钱包)", "0x742d...c89A(测试钱包1)", "0x913b...f67C(测试钱包2)", "0x5a2e...98dF(冷钱包)" }; for (String wallet : wallets) { walletBalances.put(wallet, 1000.0 + random.nextDouble() * 9000); }}
private void initUI() {
// 使用现代化布局 setLayout(new BorderLayout(10, 10)); // 顶部面板 - 钱包选择 JPanel topPanel = createTopPanel(); add(topPanel, BorderLayout.NORTH); // 中间面板 - 转账表单 JPanel centerPanel = createCenterPanel(); add(centerPanel, BorderLayout.CENTER); // 底部面板 - 交易记录 JPanel bottomPanel = createBottomPanel(); add(bottomPanel, BorderLayout.SOUTH); // 右侧面板 - 操作日志 JPanel rightPanel = createRightPanel(); add(rightPanel, BorderLayout.EAST);}
private JPanel createTopPanel() {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); panel.setBorder(BorderFactory.createTitledBorder("🎒 钱包管理")); panel.setBackground(new Color(240, 248, 255)); JLabel walletLabel = new JLabel("选择钱包:"); String[] wallets = walletBalances.keySet().toArray(new String[0]); walletCombo = new JComboBox<>(wallets); JButton refreshBtn = new JButton("🔄 刷新余额"); refreshBtn.addActionListener(e -> refreshBalance()); JButton newWalletBtn = new JButton("➕ 生成新钱包"); newWalletBtn.addActionListener(e -> generateNewWallet()); panel.add(walletLabel); panel.add(walletCombo); panel.add(refreshBtn); panel.add(newWalletBtn); return panel;}
private JPanel createCenterPanel() {
JPanel panel = new JPanel(new GridBagLayout()); panel.setBorder(BorderFactory.createTitledBorder("💸 转账操作")); panel.setBackground(new Color(255, 250, 240)); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(5, 5, 5, 5); gbc.fill = GridBagConstraints.HORIZONTAL; // 发送地址 gbc.gridx = 0; gbc.gridy = 0; panel.add(new JLabel("发送地址:"), gbc); gbc.gridx = 1; gbc.gridwidth = 2; fromField = new JTextField(30); fromField.setText((String) walletCombo.getSelectedItem()); panel.add(fromField, gbc); // 接收地址 gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; panel.add(new JLabel("接收地址:"), gbc); gbc.gridx = 1; gbc.gridwidth = 2; toField = new JTextField(30); toField.setText("0x"); panel.add(toField, gbc); // 金额输入 gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 1; panel.add(new JLabel("金额(USDT):"), gbc); gbc.gridx = 1; amountField = new JTextField(10); panel.add(amountField, gbc); gbc.gridx = 2; JLabel unitLabel = new JLabel("USDT"); panel.add(unitLabel, gbc); // 按钮面板 JPanel buttonPanel = new JPanel(new FlowLayout()); JButton sendBtn = new JButton("🚀 确认转账"); sendBtn.setBackground(new Color(50, 205, 50)); sendBtn.setForeground(Color.WHITE); sendBtn.addActionListener(e -> executeTransaction()); JButton clearBtn = new JButton("🧹 清空表单"); clearBtn.addActionListener(e -> clearForm()); buttonPanel.add(sendBtn); buttonPanel.add(clearBtn); gbc.gridx = 0; gbc.gridy = 3; gbc.gridwidth = 3; gbc.anchor = GridBagConstraints.CENTER; panel.add(buttonPanel, gbc); return panel;}
private JPanel createBottomPanel() {
JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createTitledBorder("📜 交易记录")); panel.setPreferredSize(new Dimension(800, 150)); txListModel = new DefaultListModel<>(); transactionList = new JList<>(txListModel); transactionList.setFont(new Font("等线", Font.PLAIN, 12)); JScrollPane scrollPane = new JScrollPane(transactionList); panel.add(scrollPane, BorderLayout.CENTER); // 添加右键菜单 JPopupMenu popupMenu = new JPopupMenu(); JMenuItem detailItem = new JMenuItem("查看详情"); detailItem.addActionListener(e -> showTransactionDetail()); popupMenu.add(detailItem); transactionList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { popupMenu.show(transactionList, e.getX(), e.getY()); } } }); return panel;}
private JPanel createRightPanel() {
JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createTitledBorder("📋 操作日志")); panel.setPreferredSize(new Dimension(300, 0)); logArea = new JTextArea(20, 25); logArea.setEditable(false); logArea.setFont(new Font("等线", Font.PLAIN, 11)); logArea.setBackground(new Color(248, 248, 248)); JScrollPane scrollPane = new JScrollPane(logArea); panel.add(scrollPane, BorderLayout.CENTER); // 添加清空日志按钮 JButton clearLogBtn = new JButton("清空日志"); clearLogBtn.addActionListener(e -> logArea.setText("")); panel.add(clearLogBtn, BorderLayout.SOUTH); return panel;}
// 核心业务方法
private void executeTransaction() {String from = fromField.getText().trim(); String to = toField.getText().trim(); String amountStr = amountField.getText().trim(); // 输入验证 if (from.isEmpty() || to.isEmpty() || amountStr.isEmpty()) { showError("所有字段都必须填写!"); return; } if (from.equals(to)) { showError("发送和接收地址不能相同!"); return; } double amount; try { amount = Double.parseDouble(amountStr); if (amount <= 0) { showError("转账金额必须大于0!"); return; } } catch (NumberFormatException e) { showError("请输入有效的金额!"); return; } // 检查余额 Double balance = walletBalances.get(from); if (balance == null || balance < amount) { showError("余额不足!当前余额:" + (balance != null ? String.format("%.2f", balance) : "0") + " USDT"); return; } // 模拟矿工费 double gasFee = Math.min(1.0, amount * 0.001); double totalDeduction = amount + gasFee; // 执行转账 walletBalances.put(from, balance - totalDeduction); walletBalances.putIfAbsent(to, 0.0); walletBalances.put(to, walletBalances.get(to) + amount); // 创建交易记录 String txHash = generateTxHash(); Transaction tx = new Transaction( txHash, from, to, amount, gasFee, new Date() ); transactions.add(tx); // 更新UI updateTransactionList(tx); addLog("✅ 转账成功!"); addLog(" 交易哈希:" + txHash); addLog(" 发送地址:" + from); addLog(" 接收地址:" + to); addLog(" 转账金额:" + String.format("%.2f", amount) + " USDT"); addLog(" 矿工费用:" + String.format("%.4f", gasFee) + " USDT"); addLog(" 剩余余额:" + String.format("%.2f", walletBalances.get(from)) + " USDT"); // 播放成功音效(模拟) Toolkit.getDefaultToolkit().beep();}
private void refreshBalance() {
String selected = (String) walletCombo.getSelectedItem(); if (selected != null) { Double balance = walletBalances.get(selected); JOptionPane.showMessageDialog(this, "钱包地址:" + selected + "\n" + "当前余额:" + String.format("%.2f", balance) + " USDT", "钱包余额", JOptionPane.INFORMATION_MESSAGE); }}
private void generateNewWallet() {
String newWallet = generateWalletAddress(); walletBalances.put(newWallet, 100.0); // 新钱包给100测试币 walletCombo.addItem(newWallet); walletCombo.setSelectedItem(newWallet); fromField.setText(newWallet); addLog("🎉 新钱包已生成!"); addLog(" 地址:" + newWallet); addLog(" 测试余额:100.0 USDT");}
private void showTransactionDetail() {
int index = transactionList.getSelectedIndex(); if (index >= 0 && index < transactions.size()) { Transaction tx = transactions.get(index); JTextArea detailArea = new JTextArea(10, 40); detailArea.setText(tx.getDetails()); detailArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(detailArea); JOptionPane.showMessageDialog(this, scrollPane, "交易详情", JOptionPane.INFORMATION_MESSAGE); }}
// 工具方法
private String generateTxHash() {String chars = "0123456789abcdef"; StringBuilder hash = new StringBuilder("0x"); for (int i = 0; i < 64; i++) { hash.append(chars.charAt(random.nextInt(chars.length()))); } return hash.toString();}
private String generateWalletAddress() {
String chars = "0123456789abcdefABCDEF"; StringBuilder address = new StringBuilder("0x"); for (int i = 0; i < 40; i++) { address.append(chars.charAt(random.nextInt(chars.length()))); } return address.toString() + "(新钱包)";}
private void updateTransactionList(Transaction tx) {
String displayText = String.format("[%tH:%tM] %s → %s | %.2f USDT", tx.timestamp, tx.timestamp, tx.from.substring(0, Math.min(10, tx.from.length())) + "...", tx.to.substring(0, Math.min(10, tx.to.length())) + "...", tx.amount); txListModel.add(0, displayText);}
private void addLog(String message) {
String timestamp = String.format("[%tH:%tM:%tS]", new Date(), new Date(), new Date()); logArea.append(timestamp + " " + message + "\n"); logArea.setCaretPosition(logArea.getDocument().getLength());}
private void clearForm() {
toField.setText("0x"); amountField.setText("");}
private void showError(String message) {
JOptionPane.showMessageDialog(this, message, "错误", JOptionPane.ERROR_MESSAGE); addLog("❌ " + message);}
private void showDisclaimer() {
JTextArea disclaimer = new JTextArea(); disclaimer.setText("⚠️ ⚠️ ⚠️ 重要声明 ⚠️ ⚠️ ⚠️\n\n" + "1. 本软件为USDT模拟转账器,仅供学习区块链转账原理使用\n" + "2. 不连接真实区块链网络,所有数据均为模拟数据\n" + "3. 不会进行真实的USDT转账操作\n" + "4. 严禁用于任何非法用途\n" + "5. 作者不对任何滥用行为负责\n\n" + "点击确定表示您已阅读并同意以上条款"); disclaimer.setEditable(false); disclaimer.setFont(new Font("微软雅黑", Font.BOLD, 12)); disclaimer.setBackground(new Color(255, 255, 240)); JOptionPane.showMessageDialog(this, disclaimer, "免责声明", JOptionPane.WARNING_MESSAGE);}
// 交易记录实体类
private class Transaction {String txHash; String from; String to; double amount; double gasFee; Date timestamp; Transaction(String txHash, String from, String to, double amount, double gasFee, Date timestamp) { this.txHash = txHash; this.from = from; this.to = to; this.amount = amount; this.gasFee = gasFee; this.timestamp = timestamp; } String getDetails() { return String.format( "交易哈希:%s\n" + "发送地址:%s\n" + "接收地址:%s\n" + "转账金额:%.2f USDT\n" + "矿工费用:%.4f USDT\n" + "交易时间:%tF %tT\n" + "状态:✅ 成功", txHash, from, to, amount, gasFee, timestamp, timestamp ); }}
// 启动方法
public static void main(String[] args) {SwingUtilities.invokeLater(() -> { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } USDTSimulator simulator = new USDTSimulator(); simulator.setVisible(true); });}
}- 配置文件 - config.properties(可选)
propertiesUSDT模拟转账器配置
app.version=1.0
app.name=USDT Simulator
default.gas.fee=0.001
max.transaction.history=100
simulation.mode=true
- 配置文件 - config.properties(可选)
初始测试钱包
wallet.count=4
initial.balance.min=1000
initial.balance.max=10000
- 编译运行脚本 - run.bat(Windows)
batch
@echo off
title USDT模拟转账器 - 编译运行
echo ========================================
echo USDT模拟转账器 Java版 - 仅供学习参考
echo ========================================
javac -encoding UTF-8 USDTSimulator.java
if %errorlevel% equ 0 (
echo 编译成功!
echo 正在启动程序...
java USDTSimulator
) else (
echo 编译失败,请检查Java环境配置
pause
)
- 运行脚本 - run.sh(Linux/Mac)
bash!/bin/bash
echo "========================================"
echo " USDT模拟转账器 Java版 - 仅供学习参考"
echo "========================================"
javac -encoding UTF-8 USDTSimulator.java
if [ $? -eq 0 ]; then
echo "编译成功!"
echo "正在启动程序..."
java USDTSimulator
else
echo "编译失败,请检查Java环境配置"
fi
🎯 核心功能详解
🔐 模拟钱包系统
自动生成以太坊格式的钱包地址
每个钱包有独立的模拟余额
支持新钱包生成
💸 转账模拟
完整的转账流程模拟
包含矿工费计算
余额检查机制
交易哈希生成
📊 数据记录
交易历史记录保存
详细的操作日志
交易详情查看
💡 学习要点
Swing GUI编程 - 掌握Java桌面开发
事件驱动编程 - 理解用户交互处理
数据模拟技巧 - 学习如何生成模拟数据
交易流程理解 - 了解区块链转账基本原理
⚠️ 安全提示
再次强调:
❌ 不连接真实网络
❌ 不使用真实私钥
❌ 不进行真实交易
✅ 仅供学习原理
📚 扩展建议
如果想深入学习,可以扩展:
添加交易签名模拟
实现多币种支持
添加汇率转换功能
实现交易导出功能
🎁 项目总结
这个项目虽然简单,但涵盖了区块链钱包应用的很多核心概念。通过这个模拟器,你可以理解:
钱包地址的格式
交易的基本流程
余额管理的逻辑
交易记录的存储
最后求个三连! 如果这个项目对你有帮助,请点赞、收藏、关注!我会持续分享更多实用的编程项目!
代码已开源,仅供学习交流!