if share_hash not in self.shares:
raise KeyError()
share = self.shares[share_hash]
+ children = self.reverse_shares.get(share_hash, set())
del share_hash
if share.hash in self.heads and share.previous_hash in self.tails:
self.tails[tail].add(share.previous_hash)
self.heads[share.previous_hash] = tail
elif share.previous_hash in self.tails:
- raise NotImplementedError() # will break other things..
+ #raise NotImplementedError() # will break other things..
heads = self.tails[share.previous_hash]
if len(self.reverse_shares[share.previous_hash]) > 1:
raise NotImplementedError()
else:
raise NotImplementedError()
+ for share_hash2 in self.heights:
+ height_to, other_share_hash, work_inc = self.heights[share_hash2]
+ if other_share_hash != share.previous_hash:
+ continue
+ assert children
+ if len(children) == 1:
+ height_to -= 1
+ other_share_hash = share.hash
+ work_inc -= target_to_average_attempts(share.target)
+ self.heights[share_hash2] = height_to, other_share_hash, work_inc
+ else:
+ del self.heights[share_hash2]
+ if share.hash in self.heights:
+ del self.heights[share.hash]
+
'''
height, tail = self.get_height_and_last(share.hash)
)
# eat away at heads
- for share_hash in list(self.heads):
- if share_hash in scores[-5:]:
- continue
- if self.shares[share_hash].time_seen > time.time() - 30:
- continue
- self.remove(share_hash)
- if share_hash in self.verified.shares:
- self.verified.remove(share_hash)
+ while True:
+ removed = False
+ for share_hash in list(self.heads):
+ if share_hash in scores[-5:]:
+ continue
+ if self.shares[share_hash].time_seen > time.time() - 30:
+ continue
+ self.remove(share_hash)
+ if share_hash in self.verified.shares:
+ self.verified.remove(share_hash)
+ removed = True
+ if not removed:
+ break
- for tail, heads in list(self.tails.iteritems()):
- continue
- if min(self.get_height(head) for head in heads) > 2*self.net.CHAIN_LENGTH + 10:
- print "removing!"
- self.remove(tail)
- self.verified.remove(tail)
+ # drop tails
+ while True:
+ removed = False
+ # if removed from this, it must be removed from verified
+ for tail, heads in list(self.tails.iteritems()):
+ if min(self.get_height(head) for head in heads) < 2*self.net.CHAIN_LENGTH + 10:
+ continue
+ start = time.time()
+ for aftertail in list(self.reverse_shares.get(tail, set())):
+ self.remove(aftertail)
+ if tail in self.verified.shares:
+ self.verified.remove(aftertail)
+ removed = True
+ end = time.time()
+ print "removed! %x %f" % (tail, end - start)
+ if not removed:
+ break
best = scores[-1] if scores else None