fullnode.go 1.3 KB
Newer Older
O
obscuren 已提交
1
package trie
O
obscuren 已提交
2

O
obscuren 已提交
3 4
import "fmt"

O
obscuren 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18
type FullNode struct {
	trie  *Trie
	nodes [17]Node
}

func NewFullNode(t *Trie) *FullNode {
	return &FullNode{trie: t}
}

func (self *FullNode) Dirty() bool { return true }
func (self *FullNode) Value() Node {
	self.nodes[16] = self.trie.trans(self.nodes[16])
	return self.nodes[16]
}
O
obscuren 已提交
19 20 21
func (self *FullNode) Branches() []Node {
	return self.nodes[:16]
}
O
obscuren 已提交
22

23 24
func (self *FullNode) Copy(t *Trie) Node {
	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 32
	}

	return nnode
}
O
obscuren 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

// Returns the length of non-nil nodes
func (self *FullNode) Len() (amount int) {
	for _, node := range self.nodes {
		if node != nil {
			amount++
		}
	}

	return
}

func (self *FullNode) Hash() interface{} {
	return self.trie.store(self)
}

func (self *FullNode) RlpData() interface{} {
	t := make([]interface{}, 17)
	for i, node := range self.nodes {
		if node != nil {
			t[i] = node.Hash()
		} else {
			t[i] = ""
		}
	}

	return t
}

func (self *FullNode) set(k byte, value Node) {
O
obscuren 已提交
63 64 65 66
	if _, ok := value.(*ValueNode); ok && k != 16 {
		fmt.Println(value, k)
	}

O
obscuren 已提交
67 68 69
	self.nodes[int(k)] = value
}

O
obscuren 已提交
70
func (self *FullNode) branch(i byte) Node {
O
obscuren 已提交
71 72 73 74 75 76 77
	if self.nodes[int(i)] != nil {
		self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)])

		return self.nodes[int(i)]
	}
	return nil
}