Browse Source

Merge pull request #1579 from fanatid/blockchain

Small blockchain.py changes
283
Neil 9 years ago
parent
commit
822260854f
  1. 20
      lib/blockchain.py

20
lib/blockchain.py

@ -28,7 +28,7 @@ class Blockchain(util.PrintError):
def __init__(self, config, network): def __init__(self, config, network):
self.config = config self.config = config
self.network = network self.network = network
self.headers_url = 'https://headers.electrum.org/blockchain_headers' self.headers_url = "https://headers.electrum.org/blockchain_headers"
self.local_height = 0 self.local_height = 0
self.set_local_height() self.set_local_height()
@ -40,7 +40,7 @@ class Blockchain(util.PrintError):
self.set_local_height() self.set_local_height()
self.print_error("%d blocks" % self.local_height) self.print_error("%d blocks" % self.local_height)
def verify_headers(self, header, prev_header, bits, target): def verify_header(self, header, prev_header, bits, target):
prev_hash = self.hash_header(prev_header) prev_hash = self.hash_header(prev_header)
assert prev_hash == header.get('prev_block_hash'), "prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash')) assert prev_hash == header.get('prev_block_hash'), "prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash'))
assert bits == header.get('bits'), "bits mismatch: %s vs %s" % (bits, header.get('bits')) assert bits == header.get('bits'), "bits mismatch: %s vs %s" % (bits, header.get('bits'))
@ -53,21 +53,21 @@ class Blockchain(util.PrintError):
for header in chain: for header in chain:
height = header.get('block_height') height = header.get('block_height')
bits, target = self.get_target(height / 2016, chain) bits, target = self.get_target(height / 2016, chain)
self.verify_headers(header, prev_header, bits, target) self.verify_header(header, prev_header, bits, target)
prev_header = header prev_header = header
def verify_chunk(self, index, hexdata): def verify_chunk(self, index, hexdata):
data = hexdata.decode('hex') data = hexdata.decode('hex')
num = len(data) / 80 num = len(data) / 80
prev_header = None if index == 0 else self.read_header(index*2016-1) prev_header = None
if index != 0:
prev_header = self.read_header(index*2016 - 1)
bits, target = self.get_target(index) bits, target = self.get_target(index)
for i in range(num): for i in range(num):
raw_header = data[i*80:(i+1) * 80] raw_header = data[i*80:(i+1) * 80]
header = self.deserialize_header(raw_header) header = self.deserialize_header(raw_header)
self.verify_headers(header, prev_header, bits, target) self.verify_header(header, prev_header, bits, target)
prev_header = header prev_header = header
self.save_chunk(index, data)
self.print_error("validated chunk %d" % index)
def serialize_header(self, res): def serialize_header(self, res):
s = int_to_hex(res.get('version'), 4) \ s = int_to_hex(res.get('version'), 4) \
@ -90,7 +90,9 @@ class Blockchain(util.PrintError):
return h return h
def hash_header(self, header): def hash_header(self, header):
return "0"*64 if header is None else rev_hex(Hash(self.serialize_header(header).decode('hex')).encode('hex')) if header is None:
return '0' * 64
return hash_encode(Hash(self.serialize_header(header).decode('hex')))
def path(self): def path(self):
return os.path.join(self.config.path, 'blockchain_headers') return os.path.join(self.config.path, 'blockchain_headers')
@ -213,6 +215,8 @@ class Blockchain(util.PrintError):
def connect_chunk(self, idx, chunk): def connect_chunk(self, idx, chunk):
try: try:
self.verify_chunk(idx, chunk) self.verify_chunk(idx, chunk)
self.print_error("validated chunk %d" % index)
self.save_chunk(index, data)
return idx + 1 return idx + 1
except BaseException as e: except BaseException as e:
self.print_error('verify_chunk failed', str(e)) self.print_error('verify_chunk failed', str(e))

Loading…
Cancel
Save