74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package nicehash
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"dappco.re/go/core/proxy"
|
|
"dappco.re/go/core/proxy/pool"
|
|
)
|
|
|
|
// NonceMapper manages one outbound pool connection and the 256-slot NonceStorage.
|
|
// It implements pool.StratumListener to receive job and result events from the pool.
|
|
//
|
|
// m := nicehash.NewNonceMapper(id, cfg, strategy)
|
|
// m.Start()
|
|
type NonceMapper struct {
|
|
id int64
|
|
storage *NonceStorage
|
|
strategy pool.Strategy // manages pool client lifecycle and failover
|
|
pending map[int64]SubmitContext // sequence → {requestID, minerID}
|
|
cfg *proxy.Config
|
|
active bool // true once pool has sent at least one job
|
|
suspended int // > 0 when pool connection is in error/reconnecting
|
|
mu sync.Mutex
|
|
}
|
|
|
|
// SubmitContext tracks one in-flight share submission waiting for pool reply.
|
|
//
|
|
// ctx := SubmitContext{RequestID: 42, MinerID: 7}
|
|
type SubmitContext struct {
|
|
RequestID int64 // JSON-RPC id from the miner's submit request
|
|
MinerID int64 // miner that submitted
|
|
}
|
|
|
|
// NewNonceMapper creates one upstream pool mapper and its local slot table.
|
|
//
|
|
// mapper := nicehash.NewNonceMapper(1, cfg, strategy)
|
|
func NewNonceMapper(id int64, cfg *proxy.Config, strategy pool.Strategy) *NonceMapper {
|
|
return &NonceMapper{
|
|
id: id,
|
|
storage: NewNonceStorage(),
|
|
strategy: strategy,
|
|
cfg: cfg,
|
|
pending: make(map[int64]SubmitContext),
|
|
}
|
|
}
|
|
|
|
func (m *NonceMapper) Add(miner *proxy.Miner) bool {
|
|
return m.storage.Add(miner)
|
|
}
|
|
|
|
func (m *NonceMapper) Remove(miner *proxy.Miner) {
|
|
m.storage.Remove(miner)
|
|
}
|
|
|
|
func (m *NonceMapper) Submit(event *proxy.SubmitEvent) {
|
|
if event == nil || m.strategy == nil {
|
|
return
|
|
}
|
|
|
|
sequence := m.strategy.Submit(event.JobID, event.Nonce, event.Result, event.Algo)
|
|
m.mu.Lock()
|
|
m.pending[sequence] = SubmitContext{
|
|
RequestID: event.RequestID,
|
|
MinerID: event.Miner.ID(),
|
|
}
|
|
m.mu.Unlock()
|
|
}
|
|
|
|
func (m *NonceMapper) IsActive() bool {
|
|
if m.strategy == nil {
|
|
return false
|
|
}
|
|
return m.strategy.IsActive()
|
|
}
|