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  }