update
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"m2pool-payment/internal/blockchain"
|
||||
"m2pool-payment/internal/blockchain/eth"
|
||||
"m2pool-payment/internal/crypto"
|
||||
"m2pool-payment/internal/db"
|
||||
"m2pool-payment/internal/logger"
|
||||
message "m2pool-payment/internal/msg"
|
||||
rmq "m2pool-payment/internal/queue"
|
||||
@@ -15,6 +16,7 @@ import (
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
const MSG_KEY string = "9f3c7a12"
|
||||
@@ -32,6 +34,7 @@ type ServerCtx struct {
|
||||
Config message.Config
|
||||
blockChainServer *blockchain.BlockChainServer
|
||||
rmqServer *rmq.RabbitMQServer
|
||||
sqlitedb db.SQLite
|
||||
}
|
||||
|
||||
var s_ctx ServerCtx
|
||||
@@ -76,6 +79,113 @@ func initBlockChainServer() {
|
||||
log.Println("✅ 区块链服务初始化完成")
|
||||
}
|
||||
|
||||
func loadSQLiteData() {
|
||||
err1 := loadTopupReqMsg()
|
||||
if err1 != nil {
|
||||
log.Fatalf("load topup msg err:%v", err1)
|
||||
}
|
||||
err2 := loadWithdrawReqMsg()
|
||||
if err2 != nil {
|
||||
log.Fatalf("load withdraw msg err:%v", err2)
|
||||
}
|
||||
err3 := loadPayReqMsg()
|
||||
if err3 != nil {
|
||||
log.Fatalf("load pay msg err:%v", err3)
|
||||
}
|
||||
}
|
||||
|
||||
func loadTopupReqMsg() error {
|
||||
sql := `SELECT chain, symbol, timestamp, to_addr FROM msg_topup_req;`
|
||||
rows, err := s_ctx.sqlitedb.DB.Query(sql)
|
||||
if err != nil {
|
||||
return fmt.Errorf("query history topup-msg error: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var topupReq_msg message.TopupMsg_req
|
||||
hasData := false
|
||||
for rows.Next() {
|
||||
hasData = true
|
||||
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)
|
||||
}
|
||||
|
||||
if !hasData {
|
||||
log.Println("Msg_topup_req`s msg has not data, doesn`t need to load.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 在遍历完所有数据后检查是否发生了错误
|
||||
if err := rows.Err(); err != nil {
|
||||
log.Printf("Error encountered while iterating over rows: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func loadWithdrawReqMsg() error {
|
||||
sql := `SELECT queueId, chain, symbol, timestamp, from_addr, to_addr, amount FROM msg_withdraw_req;`
|
||||
rows, err := s_ctx.sqlitedb.DB.Query(sql)
|
||||
if err != nil {
|
||||
return fmt.Errorf("query history withdraw-msg error: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var withdrawReq_msg message.WithdrawMsg_req
|
||||
hasData := false
|
||||
for rows.Next() {
|
||||
hasData = true
|
||||
// var chain, symbol, to_addr string
|
||||
// var timestamp uint64
|
||||
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)
|
||||
}
|
||||
|
||||
if !hasData {
|
||||
log.Println("Msg_withdraw_req`s msg has not data, doesn`t need to load.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 在遍历完所有数据后检查是否发生了错误
|
||||
if err := rows.Err(); err != nil {
|
||||
log.Printf("Error encountered while iterating over rows: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func loadPayReqMsg() error {
|
||||
sql := `SELECT queueId, chain, symbol, timestamp, from_addr, to_addr, amount, orderId 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)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var payReq_msg message.PayMsg_req
|
||||
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 {
|
||||
return err
|
||||
}
|
||||
s_ctx.blockChainServer.AddAddress(payReq_msg.Chain, payReq_msg.ToAddress, payReq_msg)
|
||||
}
|
||||
|
||||
if !hasData {
|
||||
log.Println("Msg_pay_req`s msg has not data, doesn`t need to load.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 在遍历完所有数据后检查是否发生了错误
|
||||
if err := rows.Err(); err != nil {
|
||||
log.Printf("Error encountered while iterating over rows: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func initRmqServer() {
|
||||
// 初始化rmq服务
|
||||
rmq_server, err := rmq.NewRabbitMQServer(s_ctx.Config.RMQConfig)
|
||||
@@ -88,6 +198,21 @@ func initRmqServer() {
|
||||
log.Printf("✅ RabbitMQ服务初始化完成: %s", s_ctx.Config.RMQConfig.SubAddr)
|
||||
}
|
||||
|
||||
func initSQLite(sqlite3_file string) {
|
||||
// 初始化sqlite3数据库
|
||||
sqlite3, err := db.NewSQLite(sqlite3_file)
|
||||
if err != nil {
|
||||
log.Fatalf("connect sqlite3 error:%v", err)
|
||||
return
|
||||
}
|
||||
sqlByte, err := os.ReadFile("../public/SQLite3.sql")
|
||||
if err != nil {
|
||||
log.Fatalf("open sql file error: %s", "../public/SQLite3.sql")
|
||||
}
|
||||
sqlite3.Exec_(string(sqlByte))
|
||||
s_ctx.sqlitedb = *sqlite3
|
||||
}
|
||||
|
||||
func handleTopupMsg() {
|
||||
s_ctx.rmqServer.OnTopupMsg = func(msg message.TopupMsg_req) {
|
||||
msg.Address = strings.ToLower(msg.Address)
|
||||
@@ -109,7 +234,32 @@ func handleTopupMsg() {
|
||||
}
|
||||
|
||||
// 添加监听地址
|
||||
s_ctx.blockChainServer.AddAddress(msg.Chain, msg.Address, msg)
|
||||
// go func() {
|
||||
err := s_ctx.blockChainServer.AddAddress(msg.Chain, msg.Address, msg)
|
||||
if err != nil {
|
||||
log.Printf("❌ 添加监听地址失败: %v", err)
|
||||
// 发送失败响应
|
||||
err = s_ctx.rmqServer.PublishTopupResp(message.TopupMsg_resp{
|
||||
Address: msg.Address,
|
||||
Status: STATUS_FAILED,
|
||||
Chain: msg.Chain,
|
||||
Symbol: msg.Symbol,
|
||||
Amount: 0,
|
||||
TxHash: "",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("❌ 发布充值失败响应失败: %v", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
// }()
|
||||
// 将新增数据写入sqlite
|
||||
insert_sql := `INSERT OR REPLACE INTO msg_topup_req (chain, symbol, timestamp, to_addr) VALUES (?, ?, ?, ?)`
|
||||
data := []any{msg.Chain, msg.Symbol, msg.Timestamp, msg.Address}
|
||||
err = s_ctx.sqlitedb.Insert(insert_sql, data)
|
||||
if err != nil {
|
||||
log.Printf("❌ 插入 msg_req 失败: %v, data: %+v", err, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +297,30 @@ func handleWithdrawMsg() {
|
||||
Symbol: msg.Symbol,
|
||||
TxHash: "",
|
||||
})
|
||||
return // 转账失败时直接返回,不进入链上确认流程
|
||||
}
|
||||
// go func() {
|
||||
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg.ToAddress, msg)
|
||||
if err != nil {
|
||||
log.Printf("❌ 添加监听地址失败: %v", err)
|
||||
// 发送失败响应
|
||||
s_ctx.rmqServer.PublishWithdrawResp(message.WithdrawMsg_resp{
|
||||
QueueId: msg.QueueId,
|
||||
Status: STATUS_FAILED,
|
||||
Amount: msg.Amount,
|
||||
Chain: msg.Chain,
|
||||
Symbol: msg.Symbol,
|
||||
TxHash: "",
|
||||
})
|
||||
return
|
||||
}
|
||||
// }()
|
||||
// 将新增数据写入sqlite
|
||||
insert_sql := `INSERT OR REPLACE INTO msg_withdraw_req (queueId, chain, symbol, timestamp, from_addr, to_addr, amount) VALUES (?, ?, ?, ?, ?, ?, ?)`
|
||||
data := []any{msg.QueueId, msg.Chain, msg.Symbol, msg.Timestamp, msg.FromAddress, msg.ToAddress, msg.Amount}
|
||||
err = s_ctx.sqlitedb.Insert(insert_sql, data)
|
||||
if err != nil {
|
||||
log.Printf("❌ 插入 withdraw_req 失败: %v, data: %+v", err, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -187,6 +361,31 @@ func handlePayMsg() {
|
||||
OrderId: msg.OrderId,
|
||||
TxHash: "",
|
||||
})
|
||||
return // 转账失败时直接返回,不进入链上确认流程
|
||||
}
|
||||
// go func() {
|
||||
err = s_ctx.blockChainServer.AddAddress(msg.Chain, msg.ToAddress, 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: "",
|
||||
})
|
||||
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}
|
||||
err = s_ctx.sqlitedb.Insert(insert_sql, data)
|
||||
if err != nil {
|
||||
log.Printf("❌ 插入 pay_req 失败: %v, data: %+v", err, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -233,32 +432,87 @@ func handleChainEvent(chainEventCh chan any) {
|
||||
err := s_ctx.rmqServer.PublishTopupResp(msg)
|
||||
if err != nil {
|
||||
log.Printf("❌ 发送充值响应失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
go func() {
|
||||
// 插入响应数据
|
||||
sql := `INSERT INTO msg_topup_resp (chain, symbol, timestamp, to_addr, amount, height, txHash, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
|
||||
data := []any{msg.Chain, msg.Symbol, time.Now().Unix(), msg.Address, msg.Amount, msg.BlockHeight, msg.TxHash, msg.Status}
|
||||
err := s_ctx.sqlitedb.Insert(sql, data)
|
||||
if err != nil {
|
||||
log.Printf("❌ 插入 topup_resp 失败: %v", err)
|
||||
return
|
||||
}
|
||||
}()
|
||||
case message.WithdrawMsg_resp:
|
||||
// 提现确认
|
||||
log.Printf("✅ [链上] 提现确认: QueueId=%s, Amount=%.2f, TxHash=%s, Status=%d",
|
||||
msg.QueueId, msg.Amount, msg.TxHash, msg.Status)
|
||||
// 记录交易日志
|
||||
logger.LogWithdraw(msg.QueueId, "确认", msg.Amount, msg.FromAddress,
|
||||
msg.ToAddress, msg.TxHash, msg.BlockHeight)
|
||||
logger.LogWithdraw(msg.ToAddress, "确认", msg.Amount, msg.FromAddress, msg.TxHash, msg.BlockHeight)
|
||||
err := s_ctx.rmqServer.PublishWithdrawResp(msg)
|
||||
if err != nil {
|
||||
log.Printf("❌ 发送提现响应失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
go func() {
|
||||
// 插入响应数据
|
||||
sql := `INSERT INTO msg_withdraw_resp (queueId, chain, symbol, timestamp, from_addr, to_addr, amount, height, txHash, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
||||
data := []any{msg.QueueId, msg.Chain, msg.Symbol, time.Now().Unix(), msg.FromAddress, msg.ToAddress, msg.Amount, msg.BlockHeight, msg.TxHash, msg.Status}
|
||||
err := s_ctx.sqlitedb.Insert(sql, data)
|
||||
if err != nil {
|
||||
log.Printf("❌ 插入 withdraw_resp 失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 删除对应数据
|
||||
del_sql := `DELETE FROM msg_withdraw_req WHERE queueId = ?;`
|
||||
count, err := s_ctx.sqlitedb.Delete(del_sql, msg.QueueId)
|
||||
if err != nil {
|
||||
log.Printf("❌ 清理 withdraw_req 失败: %v, queueId=%s", err, msg.QueueId)
|
||||
} else if count == 0 {
|
||||
log.Printf("⚠️ 未找到要删除的 withdraw_req 记录: queueId=%s", msg.QueueId)
|
||||
} else {
|
||||
log.Printf("✅ 清理 withdraw_req 成功: 删除了 %d 条记录, queueId=%s", count, msg.QueueId)
|
||||
}
|
||||
}()
|
||||
|
||||
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)
|
||||
// 记录交易日志
|
||||
logger.LogPay(msg.OrderId, msg.QueueId, "确认", msg.Amount, msg.FromAddress,
|
||||
msg.ToAddress, msg.TxHash, msg.BlockHeight)
|
||||
logger.LogPay(msg.ToAddress, "确认", msg.Amount, msg.FromAddress, msg.TxHash, msg.BlockHeight, msg.OrderId, msg.QueueId)
|
||||
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
|
||||
}
|
||||
|
||||
// 删除对应数据
|
||||
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)
|
||||
}
|
||||
@@ -283,6 +537,11 @@ func Start(msgKey string) {
|
||||
// ================== 初始化区块链节点 ==================
|
||||
initBlockChainServer()
|
||||
|
||||
// ================== 初始化SQLite3 ==================
|
||||
initSQLite(s_ctx.Config.SQLite3.MsgPath)
|
||||
// 读取历史信息
|
||||
loadSQLiteData()
|
||||
|
||||
// ================== 初始化 RabbitMQ 服务 ==================
|
||||
initRmqServer()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user