neoneo-go/pkg/core/state/mpt_root.go
Roman Khimov 5f7ec6e784 state: fix MPTRoot JSONization
Match C# implementation. It's easier to do this by changing the structure
itself.
2021-03-26 13:45:18 +03:00

49 lines
1.3 KiB
Go

package state
import (
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
"github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/util"
)
// MPTRoot represents storage state root together with sign info.
type MPTRoot struct {
Version byte `json:"version"`
Index uint32 `json:"index"`
Root util.Uint256 `json:"roothash"`
Witness []transaction.Witness `json:"witnesses"`
}
// Hash returns hash of s.
func (s *MPTRoot) Hash() util.Uint256 {
buf := io.NewBufBinWriter()
s.EncodeBinaryUnsigned(buf.BinWriter)
return hash.Sha256(buf.Bytes())
}
// DecodeBinaryUnsigned decodes hashable part of state root.
func (s *MPTRoot) DecodeBinaryUnsigned(r *io.BinReader) {
s.Version = r.ReadB()
s.Index = r.ReadU32LE()
s.Root.DecodeBinary(r)
}
// EncodeBinaryUnsigned encodes hashable part of state root..
func (s *MPTRoot) EncodeBinaryUnsigned(w *io.BinWriter) {
w.WriteB(s.Version)
w.WriteU32LE(s.Index)
s.Root.EncodeBinary(w)
}
// DecodeBinary implements io.Serializable.
func (s *MPTRoot) DecodeBinary(r *io.BinReader) {
s.DecodeBinaryUnsigned(r)
r.ReadArray(&s.Witness, 1)
}
// EncodeBinary implements io.Serializable.
func (s *MPTRoot) EncodeBinary(w *io.BinWriter) {
s.EncodeBinaryUnsigned(w)
w.WriteArray(s.Witness)
}