Files
m2pool_payment/internal/server.go

258 lines
7.4 KiB
Go
Raw Normal View History

2025-10-16 18:54:27 +08:00
package server
import (
"encoding/hex"
"encoding/json"
"fmt"
"log"
"m2pool-payment/internal/blockchain"
2025-11-13 17:08:38 +08:00
"m2pool-payment/internal/blockchain/eth"
"m2pool-payment/internal/constant"
2025-10-16 18:54:27 +08:00
"m2pool-payment/internal/crypto"
2025-11-13 17:08:38 +08:00
"m2pool-payment/internal/listen"
2025-10-21 14:25:15 +08:00
"m2pool-payment/internal/logger"
2025-10-16 18:54:27 +08:00
message "m2pool-payment/internal/msg"
rmq "m2pool-payment/internal/queue"
"os"
"os/signal"
"strings"
"syscall"
)
type ServerCtx struct {
2025-11-13 17:08:38 +08:00
msgKey string // 解密msg-sign的密钥启动命令参数传入
2025-10-16 18:54:27 +08:00
Config message.Config
blockChainServer *blockchain.BlockChainServer
rmqServer *rmq.RabbitMQServer
2025-11-13 17:08:38 +08:00
messageServer *listen.ListenServer
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
func loadConfig() message.Config {
2025-10-16 18:54:27 +08:00
file, err := os.ReadFile("config.json")
if err != nil {
panic(fmt.Sprintf("读取配置文件失败: %v", err))
}
2025-11-13 17:08:38 +08:00
var result message.Config
err = json.Unmarshal(file, &result)
2025-10-16 18:54:27 +08:00
if err != nil {
panic(fmt.Sprintf("解析配置文件失败: %v", err))
}
2025-11-13 17:08:38 +08:00
return result
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
func NewServer(msgKey string) *ServerCtx {
cfg := loadConfig()
l := listen.NewListenServer(cfg)
eth_node, err := eth.NewETHNode(cfg, msgKey, l)
2025-10-16 18:54:27 +08:00
if err != nil {
2025-11-13 17:08:38 +08:00
panic(err)
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
node_server := blockchain.NewBlockChainServer()
2025-10-16 18:54:27 +08:00
node_server.RegisterChain("ETH", eth_node)
2025-11-13 17:08:38 +08:00
rmq_server, err := rmq.NewRabbitMQServer(cfg.RmqConfig)
2025-10-27 16:27:33 +08:00
if err != nil {
2025-11-13 17:08:38 +08:00
panic(err)
2025-10-27 16:27:33 +08:00
}
2025-11-13 17:08:38 +08:00
return &ServerCtx{
msgKey: msgKey,
Config: cfg,
blockChainServer: node_server,
rmqServer: rmq_server,
messageServer: l,
2025-10-27 16:27:33 +08:00
}
}
2025-11-13 17:08:38 +08:00
// verifyMessage 验证消息签名
func (s *ServerCtx) verifyMessage(timestamp uint64, sign string) bool {
hash_byte := crypto.Sha256Hash(fmt.Sprintf("%x", timestamp) + s.msgKey)
hash := hex.EncodeToString(hash_byte)
return hash == sign
2025-10-27 16:27:33 +08:00
}
2025-11-13 17:08:38 +08:00
func (s *ServerCtx) handleTopupMsg() {
s.rmqServer.OnTopupMsg = func(msg message.TopupMsg_req) {
2025-10-16 18:54:27 +08:00
msg.Address = strings.ToLower(msg.Address)
// 验证签名
2025-11-13 17:08:38 +08:00
if !s.verifyMessage(msg.Timestamp, msg.Sign) {
err := s.rmqServer.PublishTopupResp(message.TopupMsg_resp{
QueueId: msg.QueueId,
2025-10-27 16:27:33 +08:00
Address: msg.Address,
2025-11-13 17:08:38 +08:00
Status: constant.STATUS_VERIFY_FAILED,
2025-10-27 16:27:33 +08:00
Chain: msg.Chain,
Symbol: msg.Symbol,
})
if err != nil {
log.Printf("❌ 发布充值失败响应失败: %v", err)
}
return
}
2025-11-13 17:08:38 +08:00
s.messageServer.ChFromRmqServer <- msg
2025-10-16 18:54:27 +08:00
}
}
2025-11-13 17:08:38 +08:00
func (s *ServerCtx) handleWithdrawMsg() {
s.rmqServer.OnWithdrawMsg = func(msg message.WithdrawMsg_req) {
2025-10-16 18:54:27 +08:00
msg.FromAddress = strings.ToLower(msg.FromAddress)
msg.ToAddress = strings.ToLower(msg.ToAddress)
// 验证签名
2025-11-13 17:08:38 +08:00
if !s.verifyMessage(msg.Timestamp, msg.Sign) {
err := s.rmqServer.PublishWithdrawResp(message.WithdrawMsg_resp{
QueueId: msg.QueueId,
Chain: msg.Chain,
Symbol: msg.Symbol,
Status: constant.STATUS_VERIFY_FAILED,
FromAddress: msg.FromAddress,
ToAddress: msg.ToAddress,
2025-10-16 18:54:27 +08:00
})
if err != nil {
log.Printf("❌ 发布提现失败响应失败: %v", err)
}
return
}
2025-11-13 17:08:38 +08:00
s.messageServer.ChFromRmqServer <- msg
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
func (s *ServerCtx) handlePayMsg() {
s.rmqServer.OnPayMsg = func(msg message.PayMsg_req) {
2025-10-16 18:54:27 +08:00
msg.FromAddress = strings.ToLower(msg.FromAddress)
// 验证签名
2025-11-13 17:08:38 +08:00
if !s.verifyMessage(msg.Timestamp, msg.Sign) {
err := s.rmqServer.PublishPayResp(message.PayMsg_resp{
QueueId: msg.QueueId,
FromAddress: msg.FromAddress,
PayStatus: constant.STATUS_VERIFY_FAILED,
Transactions: msg.Transactions,
2025-10-16 18:54:27 +08:00
})
if err != nil {
log.Printf("❌ 发布支付失败响应失败: %v", err)
}
return
}
2025-11-13 17:08:38 +08:00
s.messageServer.ChFromRmqServer <- msg
2025-10-16 18:54:27 +08:00
}
}
2025-11-13 17:08:38 +08:00
func (s *ServerCtx) handleRemoveMsg() {
s.rmqServer.OnRemoveMsg = func(msg message.RemoveListenMsg_req) {
msg.Address = strings.ToLower(msg.Address)
// 验证签名
if !s.verifyMessage(msg.Timestamp, msg.Sign) {
err := s.rmqServer.PublishRemoveResp(message.RemoveListenMsg_resp{
QueueId: msg.QueueId,
MsgType: msg.MsgType,
Chain: msg.Chain,
Symbol: msg.Symbol,
Address: msg.Address,
Status: constant.STATUS_VERIFY_FAILED,
})
if err != nil {
log.Printf("❌ 发布移除监听失败响应失败: %v", err)
}
return
}
2025-10-16 18:54:27 +08:00
2025-11-13 17:08:38 +08:00
s.messageServer.ChFromRmqServer <- msg
2025-10-16 18:54:27 +08:00
}
}
2025-11-13 17:08:38 +08:00
func (s *ServerCtx) handleRespMsg() {
for msg := range s.messageServer.ChToRmqServer {
switch v := msg.(type) {
case message.TopupMsg_resp:
log.Printf("📨[充值响应]QueueID=%s, Address=%s, Chain=%s, Symbol=%s, TxHash=%s, Status=%d, Amount=%f", v.QueueId, v.Address, v.Chain, v.Symbol, v.TxHash, v.Status, v.Amount)
err := s.rmqServer.PublishTopupResp(v)
if err != nil {
log.Printf("❌ 发送充值响应失败: %v", err)
return
}
case message.WithdrawMsg_resp:
log.Printf("📨[提现响应]QueueID=%s, Chain=%s, Symbol=%s, FromAddress=%s, ToAddress=%s, TxHash=%s, Status=%d, Amount=%f", v.QueueId, v.Chain, v.Symbol, v.FromAddress, v.ToAddress, v.TxHash, v.Status, v.Amount)
err := s.rmqServer.PublishWithdrawResp(v)
if err != nil {
log.Printf("❌ 发送提现响应失败: %v", err)
return
}
case message.PayMsg_resp:
log.Printf("📨[提现响应]QueueID=%s, Chain=%s, Symbol=%s, FromAddress=%s, Status=%d", v.QueueId, v.Chain, v.Symbol, v.FromAddress, v.PayStatus)
err := s.rmqServer.PublishPayResp(v)
if err != nil {
log.Printf("❌ 发送支付响应失败: %v", err)
return
}
case message.RemoveListenMsg_resp:
log.Printf("📨[充值响应]QueueID=%s, Address=%s, Chain=%s, Symbol=%s,Status=%d", v.QueueId, v.Address, v.Chain, v.Symbol, v.Status)
err := s.rmqServer.PublishRemoveResp(v)
if err != nil {
log.Printf("❌ 发送移除监听响应失败: %v", err)
return
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
default:
log.Printf("❌ 错误响应结构: %v", v)
return
}
2025-10-16 18:54:27 +08:00
}
}
2025-10-21 10:58:58 +08:00
func Start(msgKey string) {
2025-10-16 18:54:27 +08:00
log.Println("========================================")
log.Println("🚀 M2Pool Payment System Starting...")
log.Println("========================================")
2025-11-13 17:08:38 +08:00
server := NewServer(msgKey)
2025-10-16 18:54:27 +08:00
2025-11-13 17:08:38 +08:00
// 启动消息处理
go server.handleTopupMsg()
go server.handleWithdrawMsg()
go server.handlePayMsg()
go server.handleRemoveMsg()
go server.handleRespMsg()
2025-10-27 16:27:33 +08:00
2025-11-13 17:08:38 +08:00
// 启动 RabbitMQ 服务
if err := server.rmqServer.Start(); err != nil {
log.Fatalf("❌ 启动 RabbitMQ 服务失败: %v", err)
}
log.Println("✅ RabbitMQ 服务启动成功")
2025-10-16 18:54:27 +08:00
2025-11-13 17:08:38 +08:00
// 启动消息服务器监听
go server.messageServer.RmqMsgIn()
go server.messageServer.NetMsgIn()
log.Println("✅ 消息服务器监听启动成功")
2025-10-16 18:54:27 +08:00
2025-11-13 17:08:38 +08:00
// 启动区块链监听
if err := server.blockChainServer.Listen("ETH", nil); err != nil {
log.Fatalf("❌ 启动区块链监听失败: %v", err)
}
log.Println("✅ 区块链监听启动成功")
2025-10-16 18:54:27 +08:00
2025-11-13 17:08:38 +08:00
// 启动区块链消息监听
if err := server.blockChainServer.ListenMsg("ETH"); err != nil {
log.Fatalf("❌ 启动区块链消息监听失败: %v", err)
}
log.Println("✅ 区块链消息监听启动成功")
2025-10-16 18:54:27 +08:00
log.Println("========================================")
log.Println("🎉 所有服务启动完成!")
log.Println("========================================")
// ================== 等待退出信号 ==================
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
<-sigCh
// 优雅关闭
log.Println("========================================")
log.Println("🛑 收到退出信号,正在关闭服务...")
log.Println("========================================")
2025-11-13 17:08:38 +08:00
server.blockChainServer.Stop("ETH")
server.rmqServer.Close()
2025-10-21 14:25:15 +08:00
logger.CloseTransactionLogger()
2025-10-16 18:54:27 +08:00
log.Println("👋 服务已全部关闭")
}