2015-07-06 19:54:22 -05:00
|
|
|
// Copyright 2014 The go-ethereum Authors
|
|
|
|
// This file is part of go-ethereum.
|
|
|
|
//
|
|
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// go-ethereum is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2015-01-08 04:47:04 -06:00
|
|
|
package trie
|
2014-11-18 05:02:13 -06:00
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"}
|
|
|
|
|
|
|
|
type Node interface {
|
|
|
|
Value() Node
|
2015-02-02 21:58:34 -06:00
|
|
|
Copy(*Trie) Node // All nodes, for now, return them self
|
2014-11-18 05:02:13 -06:00
|
|
|
Dirty() bool
|
|
|
|
fstring(string) string
|
|
|
|
Hash() interface{}
|
|
|
|
RlpData() interface{}
|
2015-07-01 08:38:32 -05:00
|
|
|
setDirty(dirty bool)
|
2014-11-18 05:02:13 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Value node
|
|
|
|
func (self *ValueNode) String() string { return self.fstring("") }
|
|
|
|
func (self *FullNode) String() string { return self.fstring("") }
|
|
|
|
func (self *ShortNode) String() string { return self.fstring("") }
|
2014-12-24 07:47:50 -06:00
|
|
|
func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.data) }
|
2015-02-02 21:58:34 -06:00
|
|
|
|
|
|
|
//func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("< %x > ", self.key) }
|
|
|
|
func (self *HashNode) fstring(ind string) string {
|
|
|
|
return fmt.Sprintf("%v", self.trie.trans(self))
|
|
|
|
}
|
2014-11-18 05:02:13 -06:00
|
|
|
|
|
|
|
// Full node
|
|
|
|
func (self *FullNode) fstring(ind string) string {
|
|
|
|
resp := fmt.Sprintf("[\n%s ", ind)
|
|
|
|
for i, node := range self.nodes {
|
|
|
|
if node == nil {
|
|
|
|
resp += fmt.Sprintf("%s: <nil> ", indices[i])
|
|
|
|
} else {
|
|
|
|
resp += fmt.Sprintf("%s: %v", indices[i], node.fstring(ind+" "))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return resp + fmt.Sprintf("\n%s] ", ind)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Short node
|
|
|
|
func (self *ShortNode) fstring(ind string) string {
|
2014-12-24 07:47:50 -06:00
|
|
|
return fmt.Sprintf("[ %x: %v ] ", self.key, self.value.fstring(ind+" "))
|
2014-11-18 05:02:13 -06:00
|
|
|
}
|