return gentx # only used by as_block
def get_other_tx_hashes(self, tracker):
+ parents_needed = max(x['share_count'] for x in self.share_info['transaction_hash_refs']) if self.share_info['transaction_hash_refs'] else 0
parents = tracker.get_height(self.hash) - 1
- if not all(x['share_count'] <= parents for x in self.share_info['transaction_hash_refs']):
+ if parents < parents_needed:
return None
- return [tracker.items[tracker.get_nth_parent_hash(self.hash, x['share_count'])].share_info['new_transaction_hashes'][x['tx_count']] for x in self.share_info['transaction_hash_refs']]
+ last_shares = list(tracker.get_chain(self.hash, parents_needed + 1))
+ return [last_shares[x['share_count']].share_info['new_transaction_hashes'][x['tx_count']] for x in self.share_info['transaction_hash_refs']]
def _get_other_txs(self, tracker, known_txs):
other_tx_hashes = self.get_other_tx_hashes(tracker)
def from_element(cls, item):
return cls(item.hash, item.previous_hash, **dict((k, v(item)) for k, v in attrs.iteritems()))
+ @staticmethod
+ def get_head(item):
+ return item.hash
+
+ @staticmethod
+ def get_tail(item):
+ return item.previous_hash
+
def __init__(self, head, tail, **kwargs):
self.head, self.tail = head, tail
for k, v in kwargs.iteritems():
ref = self._reverse_delta_refs[delta.tail]
cur_delta = self._delta_refs[ref]
assert cur_delta.tail == delta.tail
- self._delta_refs[ref] = cur_delta - self._delta_type.from_element(item)
+ self._delta_refs[ref] = cur_delta - delta
assert self._delta_refs[ref].tail == delta.head
del self._reverse_delta_refs[delta.tail]
self._reverse_delta_refs[delta.head] = ref
def get_chain(self, start_hash, length):
assert length <= self.get_height(start_hash)
for i in xrange(length):
- yield self.items[start_hash]
- start_hash = self._delta_type.from_element(self.items[start_hash]).tail
+ item = self.items[start_hash]
+ yield item
+ start_hash = self._delta_type.get_tail(item)
def is_child_of(self, item_hash, possible_child_hash):
height, last = self.get_height_and_last(item_hash)
self._subset_of = subset_of
def add(self, item):
- delta = self._delta_type.from_element(item)
if self._subset_of is not None:
- assert delta.head in self._subset_of.items
+ assert self._delta_type.get_head(item) in self._subset_of.items
Tracker.add(self, item)
def remove(self, item_hash):