@ -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