electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 1635bc8cb3aa217668c3ed60a9b6b60b98909eaf
parent a9197236a2a63014555c755e62b7495c1b809446
Author: SomberNight <somber.night@protonmail.com>
Date:   Sun, 16 Sep 2018 03:05:39 +0200

blockchain: use HEADER_SIZE named constant instead of magic numbers

Diffstat:
Melectrum/blockchain.py | 43++++++++++++++++++++++++-------------------
1 file changed, 24 insertions(+), 19 deletions(-)

diff --git a/electrum/blockchain.py b/electrum/blockchain.py @@ -30,6 +30,7 @@ from . import constants from .util import bfh, bh2u +HEADER_SIZE = 80 # bytes MAX_TARGET = 0x00000000FFFF0000000000000000000000000000000000000000000000000000 @@ -51,7 +52,7 @@ def serialize_header(header_dict: dict) -> str: def deserialize_header(s: bytes, height: int) -> dict: if not s: raise InvalidHeader('Invalid header: {}'.format(s)) - if len(s) != 80: + if len(s) != HEADER_SIZE: raise InvalidHeader('Invalid header length: {}'.format(len(s))) hex_to_int = lambda s: int('0x' + bh2u(s[::-1]), 16) h = {} @@ -97,7 +98,7 @@ class Blockchain(util.PrintError): Manages blockchain headers and their verification """ - def __init__(self, config, forkpoint, parent_id): + def __init__(self, config, forkpoint: int, parent_id: int): self.config = config self.forkpoint = forkpoint self.checkpoints = constants.net.CHECKPOINTS @@ -113,7 +114,7 @@ class Blockchain(util.PrintError): return func(self, *args, **kwargs) return func_wrapper - def parent(self): + def parent(self) -> 'Blockchain': return blockchains[self.parent_id] def get_max_child(self) -> Optional[int]: @@ -138,7 +139,7 @@ class Blockchain(util.PrintError): except MissingHeader: return False - def fork(parent, header: dict): + def fork(parent, header: dict) -> 'Blockchain': forkpoint = header.get('block_height') self = Blockchain(parent.config, forkpoint, parent.forkpoint) open(self.path(), 'w+').close() @@ -154,7 +155,7 @@ class Blockchain(util.PrintError): def update_size(self) -> None: p = self.path() - self._size = os.path.getsize(p)//80 if os.path.exists(p) else 0 + self._size = os.path.getsize(p)//HEADER_SIZE if os.path.exists(p) else 0 def verify_header(self, header: dict, prev_hash: str, target: int, expected_header_hash: str=None) -> None: _hash = hash_header(header) @@ -171,7 +172,7 @@ class Blockchain(util.PrintError): raise Exception("insufficient proof of work: %s vs target %s" % (int('0x' + _hash, 16), target)) def verify_chunk(self, index: int, data: bytes) -> None: - num = len(data) // 80 + num = len(data) // HEADER_SIZE start_height = index * 2016 prev_hash = self.get_hash(start_height - 1) target = self.get_target(index-1) @@ -181,14 +182,18 @@ class Blockchain(util.PrintError): expected_header_hash = self.get_hash(height) except MissingHeader: expected_header_hash = None - raw_header = data[i*80:(i+1) * 80] + raw_header = data[i*HEADER_SIZE : (i+1)*HEADER_SIZE] header = deserialize_header(raw_header, index*2016 + i) self.verify_header(header, prev_hash, target, expected_header_hash) prev_hash = hash_header(header) def path(self): d = util.get_headers_dir(self.config) - filename = 'blockchain_headers' if self.parent_id is None else os.path.join('forks', 'fork_%d_%d'%(self.parent_id, self.forkpoint)) + if self.parent_id is None: + filename = 'blockchain_headers' + else: + basename = 'fork_%d_%d' % (self.parent_id, self.forkpoint) + filename = os.path.join('forks', basename) return os.path.join(d, filename) @with_lock @@ -201,7 +206,7 @@ class Blockchain(util.PrintError): return delta_height = (index * 2016 - self.forkpoint) - delta_bytes = delta_height * 80 + delta_bytes = delta_height * HEADER_SIZE # if this chunk contains our forkpoint, only save the part after forkpoint # (the part before is the responsibility of the parent) if delta_bytes < 0: @@ -227,10 +232,10 @@ class Blockchain(util.PrintError): my_data = f.read() self.assert_headers_file_available(parent.path()) with open(parent.path(), 'rb') as f: - f.seek((forkpoint - parent.forkpoint)*80) - parent_data = f.read(parent_branch_size*80) + f.seek((forkpoint - parent.forkpoint)*HEADER_SIZE) + parent_data = f.read(parent_branch_size*HEADER_SIZE) self.write(parent_data, 0) - parent.write(my_data, (forkpoint - parent.forkpoint)*80) + parent.write(my_data, (forkpoint - parent.forkpoint)*HEADER_SIZE) # store file path for b in blockchains.values(): b.old_path = b.path() @@ -261,7 +266,7 @@ class Blockchain(util.PrintError): with self.lock: self.assert_headers_file_available(filename) with open(filename, 'rb+') as f: - if truncate and offset != self._size*80: + if truncate and offset != self._size * HEADER_SIZE: f.seek(offset) f.truncate() f.seek(offset) @@ -276,8 +281,8 @@ class Blockchain(util.PrintError): data = bfh(serialize_header(header)) # headers are only _appended_ to the end: assert delta == self.size() - assert len(data) == 80 - self.write(data, delta*80) + assert len(data) == HEADER_SIZE + self.write(data, delta*HEADER_SIZE) self.swap_with_parent() def read_header(self, height: int) -> Optional[dict]: @@ -292,11 +297,11 @@ class Blockchain(util.PrintError): name = self.path() self.assert_headers_file_available(name) with open(name, 'rb') as f: - f.seek(delta * 80) - h = f.read(80) - if len(h) < 80: + f.seek(delta * HEADER_SIZE) + h = f.read(HEADER_SIZE) + if len(h) < HEADER_SIZE: raise Exception('Expected to read a full header. This was only {} bytes'.format(len(h))) - if h == bytes([0])*80: + if h == bytes([0])*HEADER_SIZE: return None return deserialize_header(h, height)