fullnode.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package trie
  2. type FullNode struct {
  3. trie *Trie
  4. nodes [17]Node
  5. dirty bool
  6. }
  7. func NewFullNode(t *Trie) *FullNode {
  8. return &FullNode{trie: t}
  9. }
  10. func (self *FullNode) Dirty() bool { return self.dirty }
  11. func (self *FullNode) Value() Node {
  12. self.nodes[16] = self.trie.trans(self.nodes[16])
  13. return self.nodes[16]
  14. }
  15. func (self *FullNode) Branches() []Node {
  16. return self.nodes[:16]
  17. }
  18. func (self *FullNode) Copy(t *Trie) Node {
  19. nnode := NewFullNode(t)
  20. for i, node := range self.nodes {
  21. if node != nil {
  22. nnode.nodes[i] = node
  23. }
  24. }
  25. nnode.dirty = true
  26. return nnode
  27. }
  28. // Returns the length of non-nil nodes
  29. func (self *FullNode) Len() (amount int) {
  30. for _, node := range self.nodes {
  31. if node != nil {
  32. amount++
  33. }
  34. }
  35. return
  36. }
  37. func (self *FullNode) Hash() interface{} {
  38. return self.trie.store(self)
  39. }
  40. func (self *FullNode) RlpData() interface{} {
  41. t := make([]interface{}, 17)
  42. for i, node := range self.nodes {
  43. if node != nil {
  44. t[i] = node.Hash()
  45. } else {
  46. t[i] = ""
  47. }
  48. }
  49. return t
  50. }
  51. func (self *FullNode) set(k byte, value Node) {
  52. self.nodes[int(k)] = value
  53. self.dirty = true
  54. }
  55. func (self *FullNode) branch(i byte) Node {
  56. if self.nodes[int(i)] != nil {
  57. self.nodes[int(i)] = self.trie.trans(self.nodes[int(i)])
  58. return self.nodes[int(i)]
  59. }
  60. return nil
  61. }
  62. func (self *FullNode) setDirty(dirty bool) {
  63. self.dirty = dirty
  64. }