6a04880b49
Some kind of marker is needed to check whether node has been collapsed or not. So introduce (HashNode).Collapsed
79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package mpt
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
)
|
|
|
|
// HashNode represents MPT's hash node.
|
|
type HashNode struct {
|
|
BaseNode
|
|
Collapsed bool
|
|
}
|
|
|
|
var _ Node = (*HashNode)(nil)
|
|
|
|
// NewHashNode returns hash node with the specified hash.
|
|
func NewHashNode(h util.Uint256) *HashNode {
|
|
return &HashNode{
|
|
BaseNode: BaseNode{
|
|
hash: h,
|
|
hashValid: true,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Type implements Node interface.
|
|
func (h *HashNode) Type() NodeType { return HashT }
|
|
|
|
// Size implements Node interface.
|
|
func (h *HashNode) Size() int {
|
|
return util.Uint256Size
|
|
}
|
|
|
|
// Hash implements Node interface.
|
|
func (h *HashNode) Hash() util.Uint256 {
|
|
if !h.hashValid {
|
|
panic("can't get hash of an empty HashNode")
|
|
}
|
|
return h.hash
|
|
}
|
|
|
|
// Bytes returns serialized HashNode.
|
|
func (h *HashNode) Bytes() []byte {
|
|
return h.getBytes(h)
|
|
}
|
|
|
|
// DecodeBinary implements io.Serializable.
|
|
func (h *HashNode) DecodeBinary(r *io.BinReader) {
|
|
if h.hashValid {
|
|
h.hash.DecodeBinary(r)
|
|
}
|
|
}
|
|
|
|
// EncodeBinary implements io.Serializable.
|
|
func (h HashNode) EncodeBinary(w *io.BinWriter) {
|
|
if !h.hashValid {
|
|
return
|
|
}
|
|
w.WriteBytes(h.hash[:])
|
|
}
|
|
|
|
// MarshalJSON implements json.Marshaler.
|
|
func (h *HashNode) MarshalJSON() ([]byte, error) {
|
|
return []byte(`{"hash":"` + h.hash.StringLE() + `"}`), nil
|
|
}
|
|
|
|
// UnmarshalJSON implements json.Unmarshaler.
|
|
func (h *HashNode) UnmarshalJSON(data []byte) error {
|
|
var obj NodeObject
|
|
if err := obj.UnmarshalJSON(data); err != nil {
|
|
return err
|
|
} else if u, ok := obj.Node.(*HashNode); ok {
|
|
*h = *u
|
|
return nil
|
|
}
|
|
return errors.New("expected hash node")
|
|
}
|