Class: Bitcoin::PartialTree::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/bitcoin/partial_tree.rb

Overview

node of merkle tree

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value = nil) ⇒ Node

Returns a new instance of Node.



65
66
67
# File 'lib/bitcoin/partial_tree.rb', line 65

def initialize(value = nil)
  @value = value
end

Instance Attribute Details

#flagObject

Returns the value of attribute flag.



59
60
61
# File 'lib/bitcoin/partial_tree.rb', line 59

def flag
  @flag
end

#leftObject

Returns the value of attribute left.



62
63
64
# File 'lib/bitcoin/partial_tree.rb', line 62

def left
  @left
end

#parentObject

Returns the value of attribute parent.



61
62
63
# File 'lib/bitcoin/partial_tree.rb', line 61

def parent
  @parent
end

#rightObject

Returns the value of attribute right.



63
64
65
# File 'lib/bitcoin/partial_tree.rb', line 63

def right
  @right
end

#valueObject

Returns the value of attribute value.



60
61
62
# File 'lib/bitcoin/partial_tree.rb', line 60

def value
  @value
end

Instance Method Details

#depthObject

calculate the depth of this node in the tree.



106
107
108
109
110
111
112
113
114
# File 'lib/bitcoin/partial_tree.rb', line 106

def depth
  d = 0
  current_node = self
  until current_node.root? do
    current_node = current_node.parent
    d += 1
  end
  d
end

#find_node(target) ⇒ Object

Returns node which has same value as target. nil if this node and any children don’t have same value.

Parameters:

  • target

    value to be found

Returns:

  • node which has same value as target. nil if this node and any children don’t have same value.



118
119
120
121
122
# File 'lib/bitcoin/partial_tree.rb', line 118

def find_node(target)
  return self if value == target
  return nil if flag && flag.zero?
  return left&.find_node(target) || right&.find_node(target)
end

#indexObject



124
125
126
127
128
129
130
131
132
133
134
# File 'lib/bitcoin/partial_tree.rb', line 124

def index
  i = 0
  d = 1
  current_node = self
  until current_node.root? do
    i += d if current_node.parent.right == current_node
    current_node = current_node.parent
    d *= 2
  end
  i
end

#leaf?Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/bitcoin/partial_tree.rb', line 89

def leaf?
  right.nil? && left.nil?
end

#next_partialObject



97
98
99
100
101
102
103
# File 'lib/bitcoin/partial_tree.rb', line 97

def next_partial
  return nil if root? && (flag.zero? || (left.nil? && right.nil?) || (left.partial? && right.partial?))
  return parent.next_partial if flag.zero? || leaf?
  return left unless left.partial?
  self.right = left.dup unless right
  right.partial? ? parent.next_partial : right
end

#partial?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/bitcoin/partial_tree.rb', line 93

def partial?
  !flag.nil?
end

#root?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/bitcoin/partial_tree.rb', line 85

def root?
  parent.nil?
end