from pybtc.functions.tools import rh2s from pybtc.functions.tools import var_int_to_int, var_int_len from pybtc.functions.tools import read_var_int from pybtc.functions.hash import double_sha256 from pybtc.transaction import Transaction from pybtc.functions.block import bits_to_target, target_to_difficulty from struct import unpack, pack import io import time import sys from collections import OrderedDict def get_stream(stream): if not isinstance(stream, io.BytesIO): if isinstance(stream, str): stream = bytes.fromhex(stream) if isinstance(stream, bytes): stream = io.BytesIO(stream) else: raise TypeError("object should be bytes or HEX encoded string") return stream def decode_block_tx(block): s = get_stream(block) b = dict() b["amount"] = 0 b["size"] = len(block) b["strippedSize"] = 80 b["version"] = unpack("L", b["version"]).hex() b["previousBlockHash"] = rh2s(s.read(32)) b["merkleRoot"] = rh2s(s.read(32)) b["time"] = unpack("= self._max_size: self.clear_tail = True if self.clear_tail and self.clear_tail_auto: if self._store_size >= int(self._max_size * 0.75): try: [self.pop_last() for i in range(20)] except: pass else: self.clear_tail = False def get(self, key): self._requests += 1 try: i = self._store[key] self._hit += 1 return i except: return None def pop(self, key): self._requests += 1 try: data = self._store.pop(key) self._store_size -= sys.getsizeof(data) + sys.getsizeof(key) self._hit += 1 return data except: return None def remove(self, key): try: data = self._store.pop(key) self._store_size -= sys.getsizeof(data) + sys.getsizeof(key) except: pass def pop_last(self): try: i = next(reversed(self._store)) data = self._store[i] del self._store[i] self._store_size -= sys.getsizeof(data) + sys.getsizeof(i) return data except: return None def get_last_key(self): try: i = next(reversed(self._store)) return i except: return None def len(self): return len(self._store) def hitrate(self): if self._requests: return self._hit / self._requests else: return 0