github.com/ethereum/go-ethereum@v1.16.1/trie/node_enc.go (about) 1 // Copyright 2022 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package trie 18 19 import ( 20 "github.com/ethereum/go-ethereum/rlp" 21 ) 22 23 func nodeToBytes(n node) []byte { 24 w := rlp.NewEncoderBuffer(nil) 25 n.encode(w) 26 result := w.ToBytes() 27 w.Flush() 28 return result 29 } 30 31 func (n *fullNode) encode(w rlp.EncoderBuffer) { 32 offset := w.List() 33 for _, c := range n.Children { 34 if c != nil { 35 c.encode(w) 36 } else { 37 w.Write(rlp.EmptyString) 38 } 39 } 40 w.ListEnd(offset) 41 } 42 43 func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) { 44 offset := w.List() 45 for _, c := range n.Children { 46 if c == nil { 47 w.Write(rlp.EmptyString) 48 } else if len(c) < 32 { 49 w.Write(c) // rawNode 50 } else { 51 w.WriteBytes(c) // hashNode 52 } 53 } 54 w.ListEnd(offset) 55 } 56 57 func (n *shortNode) encode(w rlp.EncoderBuffer) { 58 offset := w.List() 59 w.WriteBytes(n.Key) 60 if n.Val != nil { 61 n.Val.encode(w) 62 } else { 63 w.Write(rlp.EmptyString) 64 } 65 w.ListEnd(offset) 66 } 67 68 func (n *extNodeEncoder) encode(w rlp.EncoderBuffer) { 69 offset := w.List() 70 w.WriteBytes(n.Key) 71 72 if n.Val == nil { 73 w.Write(rlp.EmptyString) 74 } else if len(n.Val) < 32 { 75 w.Write(n.Val) // rawNode 76 } else { 77 w.WriteBytes(n.Val) // hashNode 78 } 79 w.ListEnd(offset) 80 } 81 82 func (n *leafNodeEncoder) encode(w rlp.EncoderBuffer) { 83 offset := w.List() 84 w.WriteBytes(n.Key) // Compact format key 85 w.WriteBytes(n.Val) // Value node, must be non-nil 86 w.ListEnd(offset) 87 } 88 89 func (n hashNode) encode(w rlp.EncoderBuffer) { 90 w.WriteBytes(n) 91 } 92 93 func (n valueNode) encode(w rlp.EncoderBuffer) { 94 w.WriteBytes(n) 95 }