merge transactions and update

This commit is contained in:
lzx
2025-10-31 13:46:58 +08:00
parent 056bc05b75
commit 8d7da5d345
12 changed files with 1154 additions and 975 deletions

View File

@@ -6,7 +6,7 @@ import (
"fmt"
"log"
"m2pool-payment/internal/blockchain"
"m2pool-payment/internal/blockchain/eth"
eth "m2pool-payment/internal/blockchain/eth"
"m2pool-payment/internal/crypto"
"m2pool-payment/internal/db"
"m2pool-payment/internal/logger"
@@ -19,7 +19,7 @@ import (
"time"
)
const MSG_KEY string = "9f3c7a12"
// const MSG_KEY string = "9f3c7a12"
// 状态码常量
const (
@@ -41,7 +41,7 @@ var s_ctx ServerCtx
// verifyMessage 验证消息签名
func verifyMessage(timestamp uint64, sign string) bool {
hash_byte := crypto.Sha256Hash(fmt.Sprintf("%x", timestamp) + MSG_KEY)
hash_byte := crypto.Sha256Hash(fmt.Sprintf("%x", timestamp) + s_ctx.msgKey)
hash := hex.EncodeToString(hash_byte)
return hash == sign
}
@@ -109,7 +109,7 @@ func loadTopupReqMsg() error {
if err := rows.Scan(&topupReq_msg.Chain, &topupReq_msg.Symbol, &topupReq_msg.Timestamp, &topupReq_msg.Address); err != nil {
return err
}
s_ctx.blockChainServer.AddAddress(topupReq_msg.Chain, topupReq_msg.Address, topupReq_msg)
s_ctx.blockChainServer.AddAddress(topupReq_msg.Chain, topupReq_msg)
}
if !hasData {
@@ -141,7 +141,7 @@ func loadWithdrawReqMsg() error {
if err := rows.Scan(&withdrawReq_msg.QueueId, &withdrawReq_msg.Chain, &withdrawReq_msg.Symbol, &withdrawReq_msg.Timestamp, &withdrawReq_msg.FromAddress, &withdrawReq_msg.ToAddress, &withdrawReq_msg.Amount); err != nil {
return err
}
s_ctx.blockChainServer.AddAddress(withdrawReq_msg.Chain, withdrawReq_msg.ToAddress, withdrawReq_msg)
s_ctx.blockChainServer.AddAddress(withdrawReq_msg.Chain, withdrawReq_msg)
}
if !hasData {
@@ -157,7 +157,7 @@ func loadWithdrawReqMsg() error {
}
func loadPayReqMsg() error {
sql := `SELECT queueId, chain, symbol, timestamp, from_addr, to_addr, amount, orderId FROM msg_pay_req;`
sql := `SELECT queueId, chain, symbol, timestamp, from_addr, total_amount FROM msg_pay_req;`
rows, err := s_ctx.sqlitedb.DB.Query(sql)
if err != nil {
return fmt.Errorf("query history pay-msg error: %w", err)
@@ -168,10 +168,10 @@ func loadPayReqMsg() error {
hasData := false
for rows.Next() {
hasData = true
if err := rows.Scan(&payReq_msg.QueueId, &payReq_msg.Chain, &payReq_msg.Symbol, &payReq_msg.Timestamp, &payReq_msg.FromAddress, &payReq_msg.ToAddress, &payReq_msg.Amount, &payReq_msg.OrderId); err != nil {
if err := rows.Scan(&payReq_msg.QueueId, &payReq_msg.Chain, &payReq_msg.Symbol, &payReq_msg.Timestamp, &payReq_msg.FromAddress, &payReq_msg.TotalAmount); err != nil {
return err
}
s_ctx.blockChainServer.AddAddress(payReq_msg.Chain, payReq_msg.ToAddress, payReq_msg)
s_ctx.blockChainServer.AddAddress(payReq_msg.Chain, payReq_msg)
}
if !hasData {
@@ -235,7 +235,7 @@ func handleTopupMsg() {
// 添加监听地址
// go func() {
err := s_ctx.blockChainServer.AddAddress(msg.Chain, msg.Address, msg)
err := s_ctx.blockChainServer.AddAddress(msg.Chain, msg)
if err != nil {
log.Printf("❌ 添加监听地址失败: %v", err)
// 发送失败响应
@@ -285,7 +285,7 @@ func handleWithdrawMsg() {
}
// 执行转账
err := s_ctx.blockChainServer.Transfer(msg.Chain, msg.Symbol, msg)
err := s_ctx.blockChainServer.Transfer(msg.Chain, msg)
if err != nil {
log.Printf("❌ 提现转账失败: %v", err)
// 发送失败响应
@@ -300,7 +300,7 @@ func handleWithdrawMsg() {
return // 转账失败时直接返回,不进入链上确认流程
}
// go func() {
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg.ToAddress, msg)
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg)
if err != nil {
log.Printf("❌ 添加监听地址失败: %v", err)
// 发送失败响应
@@ -328,18 +328,14 @@ func handleWithdrawMsg() {
func handlePayMsg() {
s_ctx.rmqServer.OnPayMsg = func(msg message.PayMsg_req) {
msg.FromAddress = strings.ToLower(msg.FromAddress)
msg.ToAddress = strings.ToLower(msg.ToAddress)
// msg.ToAddress = strings.ToLower(msg.ToAddress)
// 验证签名
if !verifyMessage(msg.Timestamp, msg.Sign) {
err := s_ctx.rmqServer.PublishPayResp(message.PayMsg_resp{
QueueId: msg.QueueId,
Status: STATUS_VERIFY_FAILED,
Amount: msg.Amount,
Chain: msg.Chain,
Symbol: msg.Symbol,
OrderId: msg.OrderId,
TxHash: "",
QueueId: msg.QueueId,
FromAddress: msg.FromAddress,
PayStatus: STATUS_VERIFY_FAILED,
})
if err != nil {
log.Printf("❌ 发布支付失败响应失败: %v", err)
@@ -348,41 +344,33 @@ func handlePayMsg() {
}
// 执行转账
err := s_ctx.blockChainServer.Transfer(msg.Chain, msg.Symbol, msg)
err := s_ctx.blockChainServer.Transfer(msg.Chain, msg)
if err != nil {
log.Printf("❌ 支付转账失败: %v", err)
// 发送失败响应
s_ctx.rmqServer.PublishPayResp(message.PayMsg_resp{
QueueId: msg.QueueId,
Status: STATUS_FAILED,
Amount: msg.Amount,
Chain: msg.Chain,
Symbol: msg.Symbol,
OrderId: msg.OrderId,
TxHash: "",
QueueId: msg.QueueId,
FromAddress: msg.FromAddress,
PayStatus: STATUS_FAILED,
})
return // 转账失败时直接返回,不进入链上确认流程
}
// go func() {
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg.ToAddress, msg)
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg)
if err != nil {
log.Printf("❌ 添加监听地址失败: %v", err)
// 发送失败响应
s_ctx.rmqServer.PublishPayResp(message.PayMsg_resp{
QueueId: msg.QueueId,
Status: STATUS_FAILED,
Amount: msg.Amount,
Chain: msg.Chain,
Symbol: msg.Symbol,
OrderId: msg.OrderId,
TxHash: "",
QueueId: msg.QueueId,
FromAddress: msg.FromAddress,
PayStatus: STATUS_FAILED,
})
return
}
// }()
// 将新增数据写入sqlite
insert_sql := `INSERT OR REPLACE INTO msg_pay_req (queueId, chain, symbol, timestamp, from_addr, to_addr, amount, orderId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
data := []any{msg.QueueId, msg.Chain, msg.Symbol, msg.Timestamp, msg.FromAddress, msg.ToAddress, msg.Amount, msg.OrderId}
insert_sql := `INSERT OR REPLACE INTO msg_pay_req (queueId, chain, symbol, timestamp, from_addr, total_amount) VALUES (?, ?, ?, ?, ?, ?)`
data := []any{msg.QueueId, msg.Chain, msg.Symbol, msg.Timestamp, msg.FromAddress, msg.TotalAmount}
err = s_ctx.sqlitedb.Insert(insert_sql, data)
if err != nil {
log.Printf("❌ 插入 pay_req 失败: %v, data: %+v", err, data)
@@ -481,37 +469,37 @@ func handleChainEvent(chainEventCh chan any) {
case message.PayMsg_resp:
// 支付确认
log.Printf("✅ [链上] 支付确认: QueueId=%s, OrderId=%s, Amount=%.2f, TxHash=%s, Status=%d",
msg.QueueId, msg.OrderId, msg.Amount, msg.TxHash, msg.Status)
log.Printf("✅ [链上] 支付确认: QueueId=%s, FromAddress=%s, Status=%d",
msg.QueueId, msg.FromAddress, msg.PayStatus)
// 记录交易日志
logger.LogPay(msg.ToAddress, "确认", msg.Amount, msg.FromAddress, msg.TxHash, msg.BlockHeight, msg.OrderId, msg.QueueId)
logger.LogPay("全部交易确认", msg.FromAddress, msg.QueueId, msg.Transactions)
err := s_ctx.rmqServer.PublishPayResp(msg)
if err != nil {
log.Printf("❌ 发送支付响应失败: %v", err)
return
}
go func() {
// 插入响应数据
sql := `INSERT INTO msg_pay_resp (queueId, chain, symbol, timestamp, from_addr, to_addr, amount, height, txHash, status, orderId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
data := []any{msg.QueueId, msg.Chain, msg.Symbol, time.Now().Unix(), msg.FromAddress, msg.ToAddress, msg.Amount, msg.BlockHeight, msg.TxHash, msg.Status, msg.OrderId}
err := s_ctx.sqlitedb.Insert(sql, data)
if err != nil {
log.Printf("❌ 插入 pay_resp 失败: %v", err)
return
}
// go func() {
// // 插入响应数据
// sql := `INSERT INTO msg_pay_resp (queueId, chain, symbol, timestamp, from_addr, to_addr, amount, height, txHash, status, orderId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
// data := []any{msg.QueueId, msg.Chain, msg.Symbol, time.Now().Unix(), msg.FromAddress, msg.ToAddress, msg.Amount, msg.BlockHeight, msg.TxHash, msg.Status, msg.OrderId}
// err := s_ctx.sqlitedb.Insert(sql, data)
// if err != nil {
// log.Printf("❌ 插入 pay_resp 失败: %v", err)
// return
// }
// 删除对应数据
del_sql := `DELETE FROM msg_pay_req WHERE queueId = ?;`
count, err := s_ctx.sqlitedb.Delete(del_sql, msg.QueueId)
if err != nil {
log.Printf("❌ 清理 pay_req 失败: %v, queueId=%s", err, msg.QueueId)
} else if count == 0 {
log.Printf("⚠️ 未找到要删除的 pay_req 记录: queueId=%s", msg.QueueId)
} else {
log.Printf("✅ 清理 pay_req 成功: 删除了 %d 条记录, queueId=%s", count, msg.QueueId)
}
}()
// // 删除对应数据
// del_sql := `DELETE FROM msg_pay_req WHERE queueId = ?;`
// count, err := s_ctx.sqlitedb.Delete(del_sql, msg.QueueId)
// if err != nil {
// log.Printf("❌ 清理 pay_req 失败: %v, queueId=%s", err, msg.QueueId)
// } else if count == 0 {
// log.Printf("⚠️ 未找到要删除的 pay_req 记录: queueId=%s", msg.QueueId)
// } else {
// log.Printf("✅ 清理 pay_req 成功: 删除了 %d 条记录, queueId=%s", count, msg.QueueId)
// }
// }()
default:
log.Printf("⚠️ 未知消息类型: %T", event)
@@ -547,7 +535,7 @@ func Start(msgKey string) {
// ================== 启动链上事件监听通道 ==================
chainEventCh := make(chan any, 1000) // 增加缓冲区,避免高并发丢消息
go s_ctx.blockChainServer.Listen("ETH", "USDT", chainEventCh)
go s_ctx.blockChainServer.Listen("ETH", chainEventCh)
// ================== 启动 RabbitMQ 监听 ==================
initRmqListen()