def checkblocks(self, height, force=False): if force or height % 300 == 0: self.log.debug('Commit blocks') blocks = [] hashes = [] with self.db.write_batch(transaction=True) as deleteBatch: for key, value in self.db.iterator(prefix=b'pg_block:'): data = json.loads(value.decode('utf-8')) hashes.append(data['hash']) data['version'] = struct.pack('>i', data['version']) data['bits'] = struct.pack('>i', data['bits']) data['coinbase'] = base64.decodebytes(data['coinbase'].encode()) data['timestamp'] = datetime.fromtimestamp(data['timestamp']) data['chainwork'] = int_to_bytes(data['chainwork']) blocks.append(data) deleteBatch.delete(key) if blocks: if not self.initial_sync: for block in blocks: b = Block.create(**block) external_sio.emit('block', b.to_json(), room='inv') else: Block.insert_many(blocks).execute(None) with self.db.write_batch(transaction=True) as deleteBatch: with self.db.snapshot() as sn: wallets = [] walletsAddress = [] for key, value in sn.iterator(prefix=b'walletCreate:'): addr = key.decode().split(':')[1] uid = value.decode() wallets.append({ 'uid': uid }) walletsAddress.append({ 'wallet': uid, 'address': addr, }) deleteBatch.delete(key) self.log.info('PG wallet create %s for %s' % (uid, addr)) if wallets: WalletGroup.insert_many(wallets).on_conflict_ignore().execute(None) for key, value in sn.iterator(prefix=b'walletAdd:'): addr = key.decode().split(':')[1] walletsAddress.append({ 'wallet': value.decode(), 'address': addr, }) self.log.info('PG wallet add %s for %s' % (value.decode(), addr)) deleteBatch.delete(key) if walletsAddress: WalletGroupAddress.insert_many(walletsAddress).execute(None) for key, value in sn.iterator(prefix=b'walletMerge:'): existingWalletId = key.decode().split(':')[1] newWalletId = value.decode() deleteBatch.delete(key) res = WalletGroupAddress.update(wallet = newWalletId).where(WalletGroupAddress.wallet == existingWalletId).execute(None) self.log.info('PG wallet merge from %s to %s (%s)' % (existingWalletId, newWalletId, res))
def checkblocks(self, height, force=False): if force or height % 300 == 0: self.log.debug('Commit blocks') blocks = [] hashes = [] with self.db.write_batch(transaction=True) as deleteBatch: for key, value in self.db.iterator(prefix=b'pg_block:'): data = json.loads(value.decode('utf-8')) hashes.append(data['hash']) data['version'] = struct.pack('i', data['version']) data['bits'] = struct.pack('i', data['bits']) data['coinbase'] = base64.decodebytes(data['coinbase'].encode()) data['timestamp'] = datetime.fromtimestamp(data['timestamp']) blocks.append(data) deleteBatch.delete(key) if blocks: if not self.initial_sync: for block in blocks: b = Block.create(**block) # print(b.to_json()) external_sio.emit('block', b.to_json(), room='inv') else: Block.insert_many(blocks).execute(None)