51 lines
1 KiB
Go
51 lines
1 KiB
Go
package stateroot
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/core/blockchainer"
|
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
|
)
|
|
|
|
type (
|
|
// Service represents state root service.
|
|
Service interface {
|
|
blockchainer.StateRoot
|
|
OnPayload(p *payload.Extensible) error
|
|
}
|
|
|
|
service struct {
|
|
blockchainer.StateRoot
|
|
}
|
|
)
|
|
|
|
const (
|
|
// Category is message category for extensible payloads.
|
|
Category = "StateService"
|
|
)
|
|
|
|
// New returns new state root service instance using underlying module.
|
|
func New(mod blockchainer.StateRoot) (Service, error) {
|
|
return &service{
|
|
StateRoot: mod,
|
|
}, nil
|
|
}
|
|
|
|
// OnPayload implements Service interface.
|
|
func (s *service) OnPayload(ep *payload.Extensible) error {
|
|
m := new(Message)
|
|
r := io.NewBinReaderFromBuf(ep.Data)
|
|
m.DecodeBinary(r)
|
|
if r.Err != nil {
|
|
return r.Err
|
|
}
|
|
switch m.Type {
|
|
case RootT:
|
|
sr := m.Payload.(*state.MPTRoot)
|
|
if sr.Index == 0 {
|
|
return nil
|
|
}
|
|
return s.AddStateRoot(sr)
|
|
}
|
|
return nil
|
|
}
|