Files
m2pool_payment/internal/blockchain/blockchain.go

81 lines
1.7 KiB
Go
Raw Normal View History

2025-11-13 17:08:38 +08:00
// 区块链网络抽象接口统一实现
2025-10-16 18:54:27 +08:00
package blockchain
import (
"fmt"
2025-11-13 17:08:38 +08:00
"log"
2025-10-16 18:54:27 +08:00
"sync"
)
type IChainServer interface {
2025-11-13 17:08:38 +08:00
Listen() error
ListenMsg()
Transfer(from, to, symbol string, amount, fee float64) error
2025-10-16 18:54:27 +08:00
Stop()
}
type BlockChainServer struct {
mu sync.Mutex
2025-11-13 17:08:38 +08:00
chains map[string]IChainServer
2025-10-16 18:54:27 +08:00
}
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-11-13 17:08:38 +08:00
func (b *BlockChainServer) Listen(chain string, ch chan any) error {
2025-10-16 18:54:27 +08:00
if srv, ok := b.chains[chain]; ok {
2025-11-13 17:08:38 +08:00
go func() {
err := srv.Listen()
if err != nil {
log.Printf("Start Listen error: %v", err)
return
}
}()
2025-10-27 16:27:33 +08:00
return nil
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
return fmt.Errorf("链未注册: %s", chain)
2025-10-16 18:54:27 +08:00
}
2025-11-13 17:08:38 +08:00
func (b *BlockChainServer) ListenMsg(chain string) error {
2025-10-16 18:54:27 +08:00
if srv, ok := b.chains[chain]; ok {
go func() {
2025-11-13 17:08:38 +08:00
srv.ListenMsg()
2025-10-16 18:54:27 +08:00
}()
return nil
}
return fmt.Errorf("链未注册: %s", chain)
}
2025-11-13 17:08:38 +08:00
func (b *BlockChainServer) Transfer(chain, from, to, symbol string, amount, fee float64) error {
2025-10-16 18:54:27 +08:00
if srv, ok := b.chains[chain]; ok {
2025-11-13 17:08:38 +08:00
fmt.Printf("💸 发起转账: Chain(%s)-Symbol(%s), From(%s), To(%s), Amount(%f)\n", chain, symbol, from, to, amount)
go func() {
err := srv.Transfer(from, to, symbol, amount, fee)
if err != nil {
log.Printf("Transfer Error: %v\n Transfer has Exited", err)
return
}
}()
return nil
2025-10-16 18:54:27 +08:00
}
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()
2025-11-13 17:08:38 +08:00
return
2025-10-16 18:54:27 +08:00
}
fmt.Printf("链未注册: %s", chain)
}