44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package stateroot
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
|
)
|
|
|
|
// UpdateStateValidators updates list of state validator keys.
|
|
func (s *Module) UpdateStateValidators(height uint32, pubs keys.PublicKeys) {
|
|
script, _ := smartcontract.CreateDefaultMultiSigRedeemScript(pubs)
|
|
h := hash.Hash160(script)
|
|
|
|
s.mtx.Lock()
|
|
if s.updateValidatorsCb != nil {
|
|
s.updateValidatorsCb(height, pubs)
|
|
}
|
|
kc := s.getKeyCacheForHeight(height)
|
|
if kc.validatorsHash != h {
|
|
s.keys = append(s.keys, keyCache{
|
|
height: height,
|
|
validatorsKeys: pubs,
|
|
validatorsHash: h,
|
|
validatorsScript: script,
|
|
})
|
|
}
|
|
s.mtx.Unlock()
|
|
}
|
|
|
|
func (s *Module) getKeyCacheForHeight(h uint32) keyCache {
|
|
for i := len(s.keys) - 1; i >= 0; i-- {
|
|
if s.keys[i].height <= h && (i+1 == len(s.keys) || s.keys[i+1].height < h) {
|
|
return s.keys[i]
|
|
}
|
|
}
|
|
return keyCache{}
|
|
}
|
|
|
|
// GetStateValidators returns current state validators.
|
|
func (s *Module) GetStateValidators(height uint32) keys.PublicKeys {
|
|
s.mtx.RLock()
|
|
defer s.mtx.RUnlock()
|
|
return s.getKeyCacheForHeight(height).validatorsKeys.Copy()
|
|
}
|