requested_merkle = []
requested_chunks = []
requested_headers = []
+ pending_headers_changed = False
# subscribe to block headers
self.interface.send([ ('blockchain.headers.subscribe',[])], 'verifier')
elif method == 'blockchain.headers.subscribe':
self.height = result.get('block_height')
self.pending_headers.append(result)
+ pending_headers_changed = True
elif method == 'blockchain.block.get_header':
height = result.get('block_height')
requested_headers.remove(height)
self.pending_headers.append(result)
+ pending_headers_changed = True
# process pending headers
- # todo: sort them first
- for header in self.pending_headers:
- self.verify_header(header)
- self.pending_headers = []
+ if pending_headers_changed:
+ self.pending_headers.sort(key=lambda x: x.get('block_height'))
+ print "pending headers", map(lambda x: x.get('block_height'), self.pending_headers)
+ for header in self.pending_headers:
+ if self.verify_header(header):
+ self.pending_headers.remove(header)
+ else:
+ break
+ pending_headers_changed = False
prev_header = self.read_header(height -1)
if not prev_header:
- raise "no previous header", height
+ print "no previous header", height
return
#prev_hash = prev_header.get('block_height')
if ok:
self.save_header(header)
print "verify header: ok", height
+ return True