Files
m2pool_payment/internal/blockchain/blockchain.go

78 lines
1.9 KiB
Go
Raw Normal View History

2025-10-16 18:54:27 +08:00
package blockchain
import (
"fmt"
"sync"
)
type IChainServer interface {
2025-10-27 16:27:33 +08:00
AddAddress(address string, msg any) error
RemoveAddress(address string) error
2025-10-16 18:54:27 +08:00
Listen(symbol string, ch chan any)
Transfer(symbol string, msg any) error
Stop()
}
type BlockChainServer struct {
mu sync.Mutex
chains map[string]IChainServer // "ETH", "TRON", "BTC"
}
func NewBlockChainServer() *BlockChainServer {
return &BlockChainServer{
chains: make(map[string]IChainServer),
}
}
func (b *BlockChainServer) RegisterChain(name string, chain IChainServer) {
b.mu.Lock()
defer b.mu.Unlock()
b.chains[name] = chain
}
2025-10-27 16:27:33 +08:00
func (b *BlockChainServer) AddAddress(chain, address string, msg any) error {
2025-10-16 18:54:27 +08:00
if srv, ok := b.chains[chain]; ok {
srv.AddAddress(address, msg)
fmt.Printf("✅ 添加监听地址: chain=%s, address=%s\n", chain, address)
2025-10-27 16:27:33 +08:00
return nil
2025-10-16 18:54:27 +08:00
} else {
2025-10-27 16:27:33 +08:00
return fmt.Errorf("⚠️ 链未注册: %s\n", chain)
2025-10-16 18:54:27 +08:00
}
}
2025-10-27 16:27:33 +08:00
func (b *BlockChainServer) RemoveAddress(chain, address string) error {
2025-10-16 18:54:27 +08:00
if srv, ok := b.chains[chain]; ok {
srv.RemoveAddress(address)
fmt.Printf("🗑️ 移除监听地址: chain=%s, address=%s\n", chain, address)
2025-10-27 16:27:33 +08:00
return nil
2025-10-16 18:54:27 +08:00
} else {
2025-10-27 16:27:33 +08:00
return fmt.Errorf("⚠️ 链未注册: %s\n", chain)
2025-10-16 18:54:27 +08:00
}
}
func (b *BlockChainServer) Listen(chain, symbol string, ch chan any) error {
if srv, ok := b.chains[chain]; ok {
go func() {
srv.Listen(symbol, ch)
}()
return nil
}
return fmt.Errorf("链未注册: %s", chain)
}
func (b *BlockChainServer) Transfer(chain, symbol string, msg any) error {
if srv, ok := b.chains[chain]; ok {
fmt.Printf("💸 %s-%s发起转账: %+v\n", chain, symbol, msg)
return srv.Transfer(symbol, msg)
}
return fmt.Errorf("链未注册: %s", chain)
}
func (b *BlockChainServer) Stop(chain string) {
if srv, ok := b.chains[chain]; ok {
fmt.Printf("💸 关闭服务: %+v\n", chain)
srv.Stop()
}
fmt.Printf("链未注册: %s", chain)
}