50 lines
1.2 KiB
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
|
||
|
}
|