81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
// 区块链网络抽象接口统一实现
|
|
package blockchain
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"sync"
|
|
)
|
|
|
|
type IChainServer interface {
|
|
Listen() error
|
|
ListenMsg()
|
|
Transfer(from, to, symbol string, amount, fee float64) error
|
|
Stop()
|
|
}
|
|
|
|
type BlockChainServer struct {
|
|
mu sync.Mutex
|
|
chains map[string]IChainServer
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
func (b *BlockChainServer) Listen(chain string, ch chan any) error {
|
|
if srv, ok := b.chains[chain]; ok {
|
|
go func() {
|
|
err := srv.Listen()
|
|
if err != nil {
|
|
log.Printf("Start Listen error: %v", err)
|
|
return
|
|
}
|
|
}()
|
|
return nil
|
|
}
|
|
return fmt.Errorf("链未注册: %s", chain)
|
|
}
|
|
|
|
func (b *BlockChainServer) ListenMsg(chain string) error {
|
|
if srv, ok := b.chains[chain]; ok {
|
|
go func() {
|
|
srv.ListenMsg()
|
|
}()
|
|
return nil
|
|
}
|
|
return fmt.Errorf("链未注册: %s", chain)
|
|
}
|
|
|
|
func (b *BlockChainServer) Transfer(chain, from, to, symbol string, amount, fee float64) error {
|
|
if srv, ok := b.chains[chain]; ok {
|
|
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
|
|
}
|
|
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()
|
|
return
|
|
}
|
|
fmt.Printf("链未注册: %s", chain)
|
|
}
|