fullnode.go 1.3 KB

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