Merge pull request #1579 from fanatid/blockchain

Small blockchain.py changes
This commit is contained in:
Neil 2015-12-13 11:35:17 +09:00
commit 822260854f
1 changed files with 41 additions and 37 deletions

View File

@ -28,7 +28,7 @@ class Blockchain(util.PrintError):
def __init__(self, config, network):
self.config = config
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.set_local_height()
@ -40,7 +40,7 @@ class Blockchain(util.PrintError):
self.set_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)
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'))
@ -53,21 +53,21 @@ class Blockchain(util.PrintError):
for header in chain:
height = header.get('block_height')
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
def verify_chunk(self, index, hexdata):
data = hexdata.decode('hex')
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)
for i in range(num):
raw_header = data[i*80:(i+1) * 80]
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
self.save_chunk(index, data)
self.print_error("validated chunk %d" % index)
def serialize_header(self, res):
s = int_to_hex(res.get('version'), 4) \
@ -90,7 +90,9 @@ class Blockchain(util.PrintError):
return h
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):
return os.path.join(self.config.path, 'blockchain_headers')
@ -213,6 +215,8 @@ class Blockchain(util.PrintError):
def connect_chunk(self, idx, chunk):
try:
self.verify_chunk(idx, chunk)
self.print_error("validated chunk %d" % index)
self.save_chunk(index, data)
return idx + 1
except BaseException as e:
self.print_error('verify_chunk failed', str(e))