github.com/jonasnick/go-ethereum@v0.7.12-0.20150216215225-22176f05d387/trie/fullnode.go (about) 1 package trie 2 3 import "fmt" 4 5 type FullNode struct { 6 trie *Trie 7 nodes [17]Node 8 } 9 10 func NewFullNode(t *Trie) *FullNode { 11 return &FullNode{trie: t} 12 } 13 14 func (self *FullNode) Dirty() bool { return true } 15 func (self *FullNode) Value() Node { 16 self.nodes[16] = self.trie.trans(self.nodes[16]) 17 return self.nodes[16] 18 } 19 func (self *FullNode) Branches() []Node { 20 return self.nodes[:16] 21 } 22 23 func (self *FullNode) Copy(t *Trie) Node { 24 nnode := NewFullNode(t) 25 for i, node := range self.nodes { 26 if node != nil { 27 nnode.nodes[i] = node.Copy(t) 28 } 29 } 30 31 return nnode 32 } 33 34 // Returns the length of non-nil nodes 35 func (self *FullNode) Len() (amount int) { 36 for _, node := range self.nodes { 37 if node != nil { 38 amount++ 39 } 40 } 41 42 return 43 } 44 45 func (self *FullNode) Hash() interface{} { 46 return self.trie.store(self) 47 } 48 49 func (self *FullNode) RlpData() interface{} { 50 t := make([]interface{}, 17) 51 for i, node := range self.nodes { 52 if node != nil { 53 t[i] = node.Hash() 54 } else { 55 t[i] = "" 56 } 57 } 58 59 return t 60 } 61 62 func (self *FullNode) set(k byte, value Node) { 63 if _, ok := value.(*ValueNode); ok && k != 16 { 64 fmt.Println(value, k) 65 } 66 67 self.nodes[int(k)] = value 68 } 69 70 func (self *FullNode) branch(i byte) Node { 71 if self.nodes[int(i)] != nil { 72 self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)]) 73 74 return self.nodes[int(i)] 75 } 76 return nil 77 }