52 lines
1 KiB
Go
52 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
|
||
|
}
|