This commit is contained in:
lzx
2025-10-21 10:58:58 +08:00
parent a0689dbb09
commit 03c5430d98
9 changed files with 728 additions and 560 deletions

682
README.md
View File

@@ -2,16 +2,19 @@
<div align="center">
**基于区块链的分布式支付系统**
**基于以太坊区块链的分布式支付系统**
[![Go Version](https://img.shields.io/badge/Go-1.24+-00ADD8?style=flat&logo=go)](https://golang.org)
[![Ethereum](https://img.shields.io/badge/Ethereum-Mainnet-3C3C3D?style=flat&logo=ethereum)](https://ethereum.org)
[![RabbitMQ](https://img.shields.io/badge/RabbitMQ-3.x-FF6600?style=flat&logo=rabbitmq)](https://www.rabbitmq.com)
[![MySQL](https://img.shields.io/badge/MySQL-8.0+-4479A1?style=flat&logo=mysql)](https://www.mysql.com)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
支持 **充值**、**提现**、**支付** 三大核心功能,实时监听链上交易,自动确认到账。
[快速开始](#快速开始) • [功能特性](#功能特性) • [架构设计](#架构设计) • [API 文档](#api-文档)
基于 Go 1.24 + Ethereum + RabbitMQ + MySQL 技术栈构建的企业级支付解决方案。
[快速开始](#快速开始) • [功能特性](#功能特性) • [架构设计](#架构设计) • [配置说明](#配置说明)
</div>
@@ -170,35 +173,51 @@ M2Pool Payment System v2 是一个基于以太坊区块链的**分布式支付
### 核心模块
#### 1. Blockchain Manager (blockchain/)
- **eth/eth.go**:以太坊节点交互
- 监听 USDT Transfer 事件
- 监听新区块产生
- 管理待确认交易池
- 执行 ERC20 转账
#### 2. Message Queue (queue/)
- **rabbitmq.go**:消息队列服务
- 消费充值/提现/支付请求
- 发布交易确认响应
#### 1. Blockchain Manager (`internal/blockchain/`)
- **blockchain.go**:统一的区块链接口定义
- **eth/eth.go**:以太坊节点实现
- 监听 USDT Transfer 事件(实时检测充值)
- 监听新区块产生(触发交易确认)
- 管理待确认交易池UnConfirmTxs
- 执行 ERC20 转账(提现/支付)
- 自动重连机制
- 地址统一小写处理
#### 3. Database (db/)
- **db.go**:数据库连接池
#### 2. Message Queue (`internal/queue/`)
- **rabbitmq.go**RabbitMQ 消息队列服务
- 消费 3 个请求队列(充值/提现/支付)
- 发布 3 个响应队列(交易确认结果)
- 自动重连和错误重试
- 消息持久化
#### 3. Database (`internal/db/`)
- **db.go**MySQL 数据库连接池
- 存储钱包私钥(加密)
- 存储交易记录
- 连接池管理
- 事务支持
#### 4. Message (msg/)
#### 4. Message (`internal/msg/`)
- **msg.go**:消息结构定义
- 请求消息结构
- 响应消息结构
- 配置结构
- 请求消息TopupMsg_req, WithdrawMsg_req, PayMsg_req
- 响应消息TopupMsg_resp, WithdrawMsg_resp, PayMsg_resp
- 配置结构Config, RMQConfig, ETHConfig
#### 5. Utils (utils/)
#### 5. Utils (`internal/utils/`)
- **utils.go**:工具函数
- 数值转换
- 数值转换BigInt ↔ Float64
- 哈希计算
- 加密解密
#### 6. Crypto (`internal/crypto/`)
- **crypto.go**:加密工具
- SHA256 哈希
- 签名验证
#### 7. Server (`internal/server.go`)
- 服务启动和管理
- 消息路由和处理
- 优雅关闭
---
## 快速开始
@@ -210,7 +229,7 @@ M2Pool Payment System v2 是一个基于以太坊区块链的**分布式支付
- ✅ RabbitMQ 3.x+
- ✅ 以太坊节点(支持 WebSocket 和 RPC
### 安装
### 安装步骤
```bash
# 1. 克隆项目
@@ -221,23 +240,71 @@ cd m2pool-payment-v2
go mod download
# 3. 创建数据库
mysql -u root -p < schema.sql
mysql -u root -p
```
```sql
CREATE DATABASE payment CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE payment;
-- 创建钱包余额表
CREATE TABLE `eth_balance` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`address` VARCHAR(42) NOT NULL UNIQUE,
`private_key` VARCHAR(255) NOT NULL COMMENT '加密后的私钥',
`balance` DECIMAL(20, 8) DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_address` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ETH钱包表';
```
```bash
# 4. 配置文件
cp test/config.example.json test/config.json
cd test
cp config.json config.json.backup
# 编辑 config.json填入实际配置
# 5. 编译
# 5. 编译主程序
cd ..
go build -o m2pool-payment cmd/main.go
# 6. 运行
./m2pool-payment
# 6. 运行(指定通信密钥)
./m2pool-payment -key=your_secret_key
# 或者直接运行测试
# 或者运行测试程序
cd test
go run test.go
```
### 配置文件示例
创建 `test/config.json`
```json
{
"rmq_config": {
"sub_addr": "amqp://m2pool:m2pool@localhost:5672"
// ... 其他配置见下文
},
"eth_config": {
"rpcUrl": "http://localhost:8545",
"wsUrl": "ws://localhost:8546",
"confirmHeight": 20,
"dbConfig": {
"user": "root",
"password": "your_password",
"host": "127.0.0.1",
"port": 3306,
"database": "payment",
"maxOpenConns": 20,
"maxIdleCoons": 20,
"connMaxLife": 120
}
}
}
```
---
## 配置说明
@@ -544,97 +611,179 @@ go run test.go
```
m2pool-payment-v2/
├── cmd/ # 主程序入口
│ └── main.go
├── internal/ # 内部包
│ ├── blockchain/ # 区块链交互
│ ├── blockchain.go # 统一接口
│ │ ├── eth/ # 以太坊实现
│ │ │ └── eth.go
│ │ └── tron/ # TRON实现待开发
├── crypto/ # 加密工具
│ └── crypto.go
├── db/ # 数据库
│ └── db.go
├── msg/ # 消息定义
│ └── msg.go
├── queue/ # 消息队列
│ ├── rabbitmq.go
│ │ ── README.md
└── utils/ # 工具函数
└── utils.go
├── test/ # 测试和示例
├── test.go
── config.json
├── go.mod
├── go.sum
── README.md
│ └── main.go # 程序入口,解析命令行参数
├── internal/ # 内部包(不对外暴露)
│ ├── server.go # 服务启动和管理
│ ├── blockchain/ # 区块链交互模块
│ │ ├── blockchain.go # 统一的区块链接口定义
│ │ ── eth/ # 以太坊实现
│ │ │ └── eth.go # USDT 监听、转账、确认
│ └── tron/ # TRON 实现(待开发)
── crypto/ # 加密工具
│ └── crypto.go # SHA256、签名验证
├── db/ # 数据库
│ └── db.go # MySQL 连接池管理
── msg/ # 消息定义
│ └── msg.go # 请求/响应结构体定义
│ ├── queue/ # 消息队列
│ │ ── rabbitmq.go # RabbitMQ 客户端封装
│ └── README.md # RabbitMQ 使用文档
│ └── utils/ # 工具函数
│ └── utils.go # 类型转换、格式化
├── test/ # 测试和示例
── test.go # 测试程序(独立运行)
│ └── config.json # 配置文件
├── go.mod # Go 模块定义
── go.sum # 依赖版本锁定
└── README.md # 项目文档(本文件)
```
### 代码统计
| 模块 | 文件 | 代码行数 | 说明 |
|------|------|---------|------|
| **eth** | eth.go | ~700 | 以太坊核心逻辑 |
| **queue** | rabbitmq.go | ~350 | RabbitMQ 封装 |
| **server** | server.go | ~300 | 服务管理 |
| **msg** | msg.go | ~130 | 消息定义 |
| **blockchain** | blockchain.go | ~70 | 接口定义 |
| **其他** | - | ~200 | 工具、数据库等 |
| **总计** | - | **~1750** | - |
### 开发环境设置
#### 方式一Docker 快速启动(推荐)
```bash
# 1. 安装 Go
wget https://go.dev/dl/go1.24.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.24.0.linux-amd64.tar.gz
# 2. 设置环境变量
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
# 3. 启动 MySQL
# 1. 启动 MySQL
docker run -d \
--name mysql \
--name m2pool-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
-e MYSQL_ROOT_PASSWORD=Lzx2021@! \
-e MYSQL_DATABASE=payment \
-v mysql_data:/var/lib/mysql \
mysql:8.0
# 4. 启动 RabbitMQ
# 2. 启动 RabbitMQ
docker run -d \
--name rabbitmq \
--name m2pool-rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=m2pool \
-e RABBITMQ_DEFAULT_PASS=m2pool \
-v rabbitmq_data:/var/lib/rabbitmq \
rabbitmq:3-management
# 5. 连接以太坊节点
# 使用 Infura、Alchemy 或自建节点
# 3. 访问 RabbitMQ 管理界面
# http://localhost:15672
# 用户名: m2pool
# 密码: m2pool
```
#### 方式二:本地安装
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install golang-1.24 mysql-server rabbitmq-server
# CentOS/RHEL
sudo yum install golang mysql-server rabbitmq-server
# macOS
brew install go mysql rabbitmq
```
#### 以太坊节点选择
**选项 1使用公共节点服务推荐**
```bash
# Infura免费层每天 100,000 请求)
RPC: https://mainnet.infura.io/v3/YOUR_API_KEY
WS: wss://mainnet.infura.io/ws/v3/YOUR_API_KEY
# Alchemy免费层每秒 25 请求)
RPC: https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY
WS: wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY
```
**选项 2自建节点**
```bash
# 使用 Geth
geth --http --http.addr 0.0.0.0 --http.port 8545 \
--ws --ws.addr 0.0.0.0 --ws.port 8546 \
--http.api eth,net,web3 --ws.api eth,net,web3
# 或使用 Erigon更轻量
erigon --http --ws
```
**选项 3测试网络**
```bash
# Goerli 测试网(免费)
RPC: https://goerli.infura.io/v3/YOUR_API_KEY
WS: wss://goerli.infura.io/ws/v3/YOUR_API_KEY
# Sepolia 测试网(推荐)
RPC: https://sepolia.infura.io/v3/YOUR_API_KEY
WS: wss://sepolia.infura.io/ws/v3/YOUR_API_KEY
```
### 数据库表结构
```sql
-- 钱包余额表
-- 钱包余额表(必须)
CREATE TABLE `eth_balance` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`address` VARCHAR(42) NOT NULL UNIQUE,
`private_key` VARCHAR(255) NOT NULL,
`balance` DECIMAL(20, 8) DEFAULT 0,
`address` VARCHAR(42) NOT NULL UNIQUE COMMENT '钱包地址(小写)',
`private_key` VARCHAR(255) NOT NULL COMMENT '加密后的私钥',
`balance` DECIMAL(20, 8) DEFAULT 0 COMMENT 'USDT余额',
`eth_balance` DECIMAL(20, 18) DEFAULT 0 COMMENT 'ETH余额用于Gas',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_address` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ETH钱包表';
-- 交易记录表(可选)
-- 插入归集钱包示例
INSERT INTO `eth_balance` (`address`, `private_key`, `balance`, `eth_balance`)
VALUES ('归集钱包', 'encrypted_private_key_here', 10000.00, 1.0);
-- 交易记录表(可选,用于审计)
CREATE TABLE `transactions` (
`id` BIGINT AUTO_INCREMENT PRIMARY KEY,
`tx_hash` VARCHAR(66) NOT NULL UNIQUE,
`from_address` VARCHAR(42) NOT NULL,
`to_address` VARCHAR(42) NOT NULL,
`amount` DECIMAL(20, 8) NOT NULL,
`symbol` VARCHAR(10) NOT NULL,
`chain` VARCHAR(10) NOT NULL,
`tx_hash` VARCHAR(66) NOT NULL UNIQUE COMMENT '交易哈希',
`from_address` VARCHAR(42) NOT NULL COMMENT '发送地址',
`to_address` VARCHAR(42) NOT NULL COMMENT '接收地址',
`amount` DECIMAL(20, 8) NOT NULL COMMENT '金额',
`symbol` VARCHAR(10) NOT NULL COMMENT '币种',
`chain` VARCHAR(10) NOT NULL COMMENT '链名称',
`tx_type` TINYINT NOT NULL COMMENT '0=充值,1=提现,2=支付',
`status` TINYINT NOT NULL COMMENT '0=失败,1=成功,2=待确认',
`block_height` BIGINT,
`block_height` BIGINT COMMENT '区块高度',
`queue_id` VARCHAR(50) COMMENT '队列ID',
`order_id` VARCHAR(50) COMMENT '订单ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`confirmed_at` TIMESTAMP NULL COMMENT '确认时间',
INDEX `idx_tx_hash` (`tx_hash`),
INDEX `idx_from` (`from_address`),
INDEX `idx_to` (`to_address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INDEX `idx_to` (`to_address`),
INDEX `idx_status` (`status`),
INDEX `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易记录表';
```
### 重要说明
⚠️ **私钥安全**
- 数据库中存储的是**加密后的私钥**
- 需要实现真实的加密/解密逻辑
- 当前代码中的解密逻辑是占位代码,需要替换为实际的加密算法(如 AES-256
⚠️ **归集钱包**
- 必须在数据库中配置归集钱包
- 地址字段填写 `"归集钱包"` 字符串
- 保持足够的 USDT 和 ETH 余额
---
## 部署指南
@@ -818,10 +967,24 @@ sudo journalctl -u m2pool-payment -f
### Q5: 如何保证私钥安全?
**A:**
1. 私钥在数据库中**加密存储**
2. 仅在转账时临时解密
3. 建议使用 HSM硬件安全模块
4. 使用 KMS密钥管理服务
1. **私钥加密存储**数据库中存储加密后的私钥
2. **临时解密**仅在转账时临时解密用完立即释放
3. **访问控制**数据库限制访问权限
4. **建议方案**
- 使用 AES-256 加密私钥
- 使用 HSM硬件安全模块
- 使用云服务商的 KMS密钥管理服务
- 使用环境变量传递解密密钥
**重要**当前代码中的解密逻辑`eth.go` 467 **占位代码**生产环境必须替换为真实的加密算法
```go
// ❌ 当前代码(占位)
privateKey := encryptedKey + address + ""
// ✅ 应该改为(示例)
privateKey := AES256Decrypt(encryptedKey, decodeKey)
```
### Q6: 余额不足时如何处理?
@@ -863,6 +1026,35 @@ sudo journalctl -u m2pool-payment -f
2. 实现幂等性处理
3. 数据库添加唯一索引
### Q11: 支持的 USDT 合约地址是什么?
**A:** 当前配置的合约地址
- **以太坊主网**`0xdAC17F958D2ee523a2206206994597C13D831ec7`
- **测试网**需要部署测试 ERC20 合约
- **私有链**需要部署自己的 ERC20 合约
修改合约地址位置`internal/blockchain/eth/eth.go` 99
### Q12: 新区块监听的作用是什么?
**A:** 新区块监听确保交易及时确认
- **问题**如果只依赖 USDT Transfer 事件在长时间无 USDT 转账时待确认交易无法被确认
- **解决**监听新区块产生每个新区块都检查待确认交易
- **效果**交易在达到第 20 个区块后下一个区块就会被确认
### Q13: Channel 缓冲区设置多大?
**A:** 当前设置为 1000
```go
chainEventCh := make(chan any, 1000)
```
- **轻量负载**<50 TPS100 足够
- **中等负载**50-200 TPS500-1000 推荐
- **高负载**>200 TPS2000+ 或优化架构
监控 Channel 使用率,避免满载丢消息。
---
## 安全建议
@@ -1003,6 +1195,70 @@ rabbitmqctl list_queues
---
## 注意事项
### ⚠️ 生产环境部署前必须修改
#### 1. 私钥加密实现(重要!)
**位置**`internal/blockchain/eth/eth.go` 第 467 行
**当前代码**(占位):
```go
privateKey := encryptedKey + address + ""
```
**必须改为**(示例):
```go
// 使用 AES-256-GCM 加密
import "crypto/aes"
import "crypto/cipher"
func (e *ETHNode) decodePrivatekey(address string) string {
// 从数据库查询加密密钥
encryptedKey := queryFromDB(address)
// 使用 AES 解密
privateKey := AESDecrypt(encryptedKey, e.decodeKey)
return privateKey
}
```
#### 2. USDT 合约地址验证
确认你的以太坊网络与合约地址匹配:
| 网络 | Chain ID | USDT 合约地址 |
|------|----------|--------------|
| 主网 | 1 | `0xdAC17F958D2ee523a2206206994597C13D831ec7` ✅ |
| Goerli | 5 | 需要部署测试合约 |
| Sepolia | 11155111 | 需要部署测试合约 |
| 私有链 | 自定义 | 需要部署自己的合约 |
**修改位置**`internal/blockchain/eth/eth.go` 第 99 行
#### 3. 消息签名密钥
**当前密钥**`9f3c7a12`(测试用)
**生产环境**
```bash
# 生成强密钥
openssl rand -hex 32
# 启动时传入
./m2pool-payment -key=your_production_secret_key
```
#### 4. 数据库密码安全
- ❌ 不要在代码中硬编码密码
- ✅ 使用环境变量
- ✅ 使用配置管理工具(如 Vault
---
## 贡献指南
欢迎贡献代码!请遵循以下步骤:
@@ -1015,51 +1271,256 @@ rabbitmqctl list_queues
### 代码规范
- 使用 `gofmt` 格式化代码
- 遵循 Go 命名规范
- 添加必要的注释
- 编写单元测试
- 更新文档
- 使用 `gofmt` 格式化代码
- 遵循 Go 命名规范
- 添加必要的注释
- ✅ 所有地址统一小写处理
- ✅ 使用状态码常量(不要硬编码数字)
- ✅ 添加错误处理和日志
- ✅ 更新相关文档
### 提交规范
```bash
# 功能
feat: 添加 BTC 网络支持
# 修复
fix: 修复充值消息重复发送问题
# 文档
docs: 更新 API 文档
# 性能
perf: 优化交易确认性能
# 重构
refactor: 重构数据库连接池
```
---
## 命令行参数
```bash
# 启动程序
./m2pool-payment -key=your_secret_key
# 参数说明
-key string
通信密钥,用于消息签名验证 (默认: "m2pool")
```
### 签名验证算法
```go
// 生成签名
hash := SHA256(hex(timestamp) + secret_key)
sign := hex.EncodeToString(hash)
// 示例
timestamp = 1758610297
secret_key = "9f3c7a12"
hash = SHA256("696a2d6929" + "9f3c7a12")
sign = "219b3b3935f3d56db7eacd32aae84fa06df95806373d6fc4ed6e9b35ffb17f2d"
```
---
## 运行日志示例
### 启动日志
```
========================================
🚀 M2Pool Payment System Starting...
========================================
✅ 配置加载成功: RPC=http://10.168.3.236:18545, WS=ws://10.168.3.236:18546
✅ 区块链服务初始化完成
✅ RabbitMQ服务初始化完成: amqp://m2pool:m2pool@localhost:5672
✅ RabbitMQ 监听启动完成
========================================
🎉 所有服务启动完成!
========================================
🔍 ETH 开始监听 USDT Transfer 事件...
🔍 开始监听新区块...
✅ 订阅成功
✅ 新区块订阅成功
```
### 充值日志
```
📥 [RMQ] 收到充值请求: Chain=ETH, Symbol=USDT, Address=0x123...
📨 [链上] 充值待确认: Address=0x123..., Amount=100.50, TxHash=0xabc...
📤 [RMQ] 发送充值响应: Address=0x123..., Status=2, TxHash=0xabc...
✅ [链上] 充值确认: Address=0x123..., Amount=100.50, TxHash=0xabc..., Status=1
📤 [RMQ] 发送充值响应: Address=0x123..., Status=1, TxHash=0xabc...
```
### 提现日志
```
📥 [RMQ] 收到提现请求: QueueId=w123, From=0x111..., To=0x222..., Amount=50.00 USDT
✅ [链上] 提现确认: QueueId=w123, Amount=50.00, TxHash=0xdef..., Status=1
📤 [RMQ] 发送提现响应: QueueId=w123, Status=1, TxHash=0xdef...
```
---
## 路线图
### v2.1 (计划中)
- [ ] 支持 BTC 网络
- [ ] 支持 TRON 网络
- [ ] 添加 HTTP API
- [ ] 添加 WebSocket 推送
### v2.0 (已完成)
- [x] 以太坊 USDT 支持
- [x] 充值/提现/支付功能
- [x] RabbitMQ 集成
- [x] 双重监听机制
- [x] 自动交易确认
- [x] 地址统一规范
- [x] Gas 费用检查
- [x] Panic 恢复机制
### 🚧 v2.1 (开发中)
- [ ] 支持更多 ERC20 代币USDC, DAI
- [ ] 交易记录持久化
- [ ] HTTP API 接口
- [ ] 私钥真实加密实现
- [ ] 性能优化(读写锁、缓存)
### v2.2 (计划中)
- [ ] 支持更多 ERC20 代币
### 📋 v2.2 (计划中)
- [ ] 支持 TRON 网络TRC20-USDT
- [ ] 支持 BTC 网络
- [ ] 多签钱包支持
- [ ] 交易记录持久化
- [ ] 管理后台
- [ ] 监控面板
- [ ] 管理后台界面
- [ ] 实时监控面板
- [ ] 告警系统
### v3.0 (规划中)
- [ ] 微服务架构
### 🔮 v3.0 (规划中)
- [ ] 微服务架构拆分
- [ ] 水平扩展支持
- [ ] 分布式事务
- [ ] 高可用部署
- [ ] 高可用集群部署
- [ ] Kubernetes 支持
---
## 核心特性详解
### 1. 双重监听机制 🎯
系统同时监听两种链上事件:
**① USDT Transfer 事件监听**
```go
// 检测 USDT 转账,用于充值检测和交易确认触发
e.WsClient.SubscribeFilterLogs(query, e.USDT.LogsChan)
```
**② 新区块头监听**
```go
// 每个新区块触发交易确认检查,确保及时确认
e.WsClient.SubscribeNewHead(e.Ctx, headers)
```
### 2. 智能交易确认 ⚡
**事件驱动 + 区块驱动**
- Transfer 事件到达时立即检查
- 每个新区块产生时也检查
- **确保交易在第 20 个区块后立即确认**
### 3. 地址统一规范 🔡
所有以太坊地址**统一转换为小写**
- 存储时转换
- 比较时转换
- 查询时转换
避免大小写不一致导致的匹配失败。
### 4. 并发安全设计 🔒
- `sync.Map` 用于高并发地址监听
- `sync.Mutex` 保护共享数据结构
- Channel 缓冲区防止阻塞
- Goroutine panic 恢复机制
### 5. 余额智能管理 💰
**自动归集钱包切换:**
```
用户钱包余额 < 转账金额
自动使用归集钱包
确保交易成功
```
### 6. Gas 费用检查 ⛽
转账前自动检查:
- USDT 余额是否足够
- ETH 余额是否足够支付 Gas
- 预估 Gas 价格
---
## 相关文档
- [RabbitMQ 使用说明](internal/queue/README.md)
- [并发能力分析](docs/CONCURRENCY_ANALYSIS.md)(如果有)
- [交易类型说明](docs/TRANSACTION_TYPES.md)(如果有)
---
## 贡献指南
欢迎贡献代码!请遵循以下步骤:
### 提交流程
1. Fork 本项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'feat: Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
### 代码规范
- ✅ 使用 `gofmt` 格式化代码
- ✅ 遵循 Go 命名规范
- ✅ 添加必要的注释
- ✅ 所有地址统一小写处理
- ✅ 使用状态码常量(不要硬编码数字)
- ✅ 添加错误处理和日志
- ✅ 更新相关文档
### Commit 规范
```bash
# 新功能
feat: 添加 BTC 网络支持
# Bug 修复
fix: 修复充值消息重复发送问题
# 文档更新
docs: 更新 API 文档
# 性能优化
perf: 优化交易确认性能
# 代码重构
refactor: 重构数据库连接池
# 测试
test: 添加单元测试
```
---
## 技术支持
- 📧 Email: support@m2pool.com
- 💬 Telegram: @m2pool_support
- 📱 WeChat: m2pool_tech
如有问题,欢迎通过以下方式联系:
- 📧 Email: support@example.com
- 💬 Issues: [GitHub Issues](https://github.com/your-repo/issues)
- 📖 文档: [项目 Wiki](https://github.com/your-repo/wiki)
---
@@ -1097,3 +1558,4 @@ Made with ❤️ by M2Pool Team
</div>