m2pool_core/internal/gbt/enx/templatemanager/templatemanager.go

50 lines
1.2 KiB
Go

package templatemanager
import (
"sync"
"github.com/kaspanet/kaspad/app/appmessage"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/pow"
)
var currentTemplate *externalapi.DomainBlock
var currentState *pow.State
var prevState *pow.State
var isSynced bool
var lock = &sync.Mutex{}
// Get returns the template to work on
func Get() (*externalapi.DomainBlock, *pow.State, bool) {
lock.Lock()
defer lock.Unlock()
// Shallow copy the block so when the user replaces the header it won't affect the template here.
if currentTemplate == nil {
return nil, nil, false
}
if prevState != nil {
if currentState.Target.Cmp(&(prevState.Target)) == 0 {
return nil, nil, false
}
}
block := *currentTemplate
state := *currentState
prevState = currentState
currentTemplate = nil
return &block, &state, isSynced
}
// Set sets the current template to work on
func Set(template *appmessage.GetBlockTemplateResponseMessage) error {
block, err := appmessage.RPCBlockToDomainBlock(template.Block)
if err != nil {
return err
}
lock.Lock()
defer lock.Unlock()
currentTemplate = block
currentState = pow.NewState(block.Header.ToMutable())
isSynced = template.IsSynced
return nil
}