Small blockchain changes
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user