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