|
|
|
@ -104,8 +104,8 @@ func (n valueNode) fstring(ind string) string { |
|
|
|
|
return fmt.Sprintf("%x ", []byte(n)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func mustDecodeNode(hash, buf []byte) node { |
|
|
|
|
n, err := decodeNode(hash, buf) |
|
|
|
|
func mustDecodeNode(hash, buf []byte, cachegen uint16) node { |
|
|
|
|
n, err := decodeNode(hash, buf, cachegen) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(fmt.Sprintf("node %x: %v", hash, err)) |
|
|
|
|
} |
|
|
|
@ -113,7 +113,7 @@ func mustDecodeNode(hash, buf []byte) node { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// decodeNode parses the RLP encoding of a trie node.
|
|
|
|
|
func decodeNode(hash, buf []byte) (node, error) { |
|
|
|
|
func decodeNode(hash, buf []byte, cachegen uint16) (node, error) { |
|
|
|
|
if len(buf) == 0 { |
|
|
|
|
return nil, io.ErrUnexpectedEOF |
|
|
|
|
} |
|
|
|
@ -123,22 +123,22 @@ func decodeNode(hash, buf []byte) (node, error) { |
|
|
|
|
} |
|
|
|
|
switch c, _ := rlp.CountValues(elems); c { |
|
|
|
|
case 2: |
|
|
|
|
n, err := decodeShort(hash, buf, elems) |
|
|
|
|
n, err := decodeShort(hash, buf, elems, cachegen) |
|
|
|
|
return n, wrapError(err, "short") |
|
|
|
|
case 17: |
|
|
|
|
n, err := decodeFull(hash, buf, elems) |
|
|
|
|
n, err := decodeFull(hash, buf, elems, cachegen) |
|
|
|
|
return n, wrapError(err, "full") |
|
|
|
|
default: |
|
|
|
|
return nil, fmt.Errorf("invalid number of list elements: %v", c) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func decodeShort(hash, buf, elems []byte) (node, error) { |
|
|
|
|
func decodeShort(hash, buf, elems []byte, cachegen uint16) (node, error) { |
|
|
|
|
kbuf, rest, err := rlp.SplitString(elems) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
flag := nodeFlag{hash: hash} |
|
|
|
|
flag := nodeFlag{hash: hash, gen: cachegen} |
|
|
|
|
key := compactDecode(kbuf) |
|
|
|
|
if key[len(key)-1] == 16 { |
|
|
|
|
// value node
|
|
|
|
@ -148,17 +148,17 @@ func decodeShort(hash, buf, elems []byte) (node, error) { |
|
|
|
|
} |
|
|
|
|
return &shortNode{key, append(valueNode{}, val...), flag}, nil |
|
|
|
|
} |
|
|
|
|
r, _, err := decodeRef(rest) |
|
|
|
|
r, _, err := decodeRef(rest, cachegen) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, wrapError(err, "val") |
|
|
|
|
} |
|
|
|
|
return &shortNode{key, r, flag}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func decodeFull(hash, buf, elems []byte) (*fullNode, error) { |
|
|
|
|
n := &fullNode{flags: nodeFlag{hash: hash}} |
|
|
|
|
func decodeFull(hash, buf, elems []byte, cachegen uint16) (*fullNode, error) { |
|
|
|
|
n := &fullNode{flags: nodeFlag{hash: hash, gen: cachegen}} |
|
|
|
|
for i := 0; i < 16; i++ { |
|
|
|
|
cld, rest, err := decodeRef(elems) |
|
|
|
|
cld, rest, err := decodeRef(elems, cachegen) |
|
|
|
|
if err != nil { |
|
|
|
|
return n, wrapError(err, fmt.Sprintf("[%d]", i)) |
|
|
|
|
} |
|
|
|
@ -176,7 +176,7 @@ func decodeFull(hash, buf, elems []byte) (*fullNode, error) { |
|
|
|
|
|
|
|
|
|
const hashLen = len(common.Hash{}) |
|
|
|
|
|
|
|
|
|
func decodeRef(buf []byte) (node, []byte, error) { |
|
|
|
|
func decodeRef(buf []byte, cachegen uint16) (node, []byte, error) { |
|
|
|
|
kind, val, rest, err := rlp.Split(buf) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, buf, err |
|
|
|
@ -189,7 +189,7 @@ func decodeRef(buf []byte) (node, []byte, error) { |
|
|
|
|
err := fmt.Errorf("oversized embedded node (size is %d bytes, want size < %d)", size, hashLen) |
|
|
|
|
return nil, buf, err |
|
|
|
|
} |
|
|
|
|
n, err := decodeNode(nil, buf) |
|
|
|
|
n, err := decodeNode(nil, buf, cachegen) |
|
|
|
|
return n, rest, err |
|
|
|
|
case kind == rlp.String && len(val) == 0: |
|
|
|
|
// empty node
|
|
|
|
|