def nextblock_from_files(self): if not self.blockfiles: logger.debug('empty blockfiles') self.go = False return {'block': {'rnd': None}} #raise Exception("end of blockfiles") bf = self.blockfiles[0] logger.debug('block from file %s', bf) self.blockfiles = self.blockfiles[1:] with open(bf, 'rb') as fin: raw = fin.read() try: return unmsgpack(mloads(raw)) except Exception as e: logger.debug('%s: failed to msgpack decode, %s', bf, e) return json.loads(raw.decode())
def rawblock(self, xround): "if possible fetches and returns raw block msgpack including block and cert; otherwise None" algod = self.algod() if self.algod_has_block_raw or (self.algod_has_block_raw is None): response = algod.algod_request("GET", "/block/" + str(xround), params={'raw':1}, raw_response=True) contentType = response.getheader('Content-Type') if contentType == 'application/json': logger.debug('got json response, disabling rawblock') self.algod_has_block_raw = False return None if contentType == 'application/x-algorand-block-v1': self.algod_has_block_raw = True raw = response.read() block = unmsgpack(mloads(raw)) return block raise Exception('unknown response content type {!r}'.format(contentType)) logger.debug('rawblock passing out') return None
def fetchAndStoreBlock(self, xround): raw = self.rawblock(xround) if raw is None: raise Exception('could not get block {}'.format(xround)) # trivial check bl = mloads(raw) if xround == 0: blockround = bl[b'block'].get(b'rnd', 0) else: blockround = bl[b'block'][b'rnd'] if blockround != xround: raise Exception('fetching round {} retrieved block for round {}'.format(xround, bl[b'block'][b'rnd'])) blockpath = os.path.join(self.blockdir, str(xround)) with open(blockpath, 'wb') as fout: fout.write(raw) if xround % 100 == 0: logger.info('got block %s', blockpath) else: logger.debug('got block %s', blockpath) self.storedBlocks.add(xround) self.lastBlockOkTime = time.time()
def check_from_sqlite(args): genesispath = args.genesis or os.path.join(os.path.dirname(os.path.dirname(args.dbfile)), 'genesis.json') getGenesisVars(genesispath) db = sqlite3.connect(args.dbfile) cursor = db.cursor() tracker_round = None cursor.execute("SELECT rnd FROM acctrounds WHERE id = 'acctbase'") err = sys.stderr for row in cursor: tracker_round = row[0] if args.indexer: i2a = indexerAccounts(args.indexer, blockround=tracker_round, addrlist=(args.accounts and args.accounts.split(','))) i2a_checker = CheckContext(i2a, err) else: i2a_checker = None cursor.execute('''SELECT address, data FROM accountbase''') count = 0 #match = 0 #neq = 0 algosum = 0 acctset = args.accounts and args.accounts.split(',') for row in cursor: address, data = row niceaddr = algosdk.encoding.encode_address(address) if acctset and niceaddr not in acctset: continue adata = mloads(data) logger.debug('%s algod %r', niceaddr, sorted(adata.keys())) count += 1 rewardsbase = adata.get(b'ebase', 0) microalgos = adata[b'algo'] algosum += microalgos rawassetholdingmap = adata.get(b'asset') if rawassetholdingmap: assets = [] for assetid, rawassetholding in rawassetholdingmap.items(): apiholding = { 'asset-id':assetid, 'amount':rawassetholding.get(b'a', 0), 'is-frozen':rawassetholding.get(b'b', False), } assets.append(apiholding) else: assets = None rawAssetParams = adata.get(b'apar') if rawAssetParams: assetp = [] for assetid, ap in rawAssetParams.items(): params = { 'creator':niceaddr, 'decimals':ap.get(b'dc',0), 'default-frozen':ap.get(b'df',False), 'total':ap.get(b't', 0), } dmaybe(params, 'clawback', encode_addr_or_none(ap.get(b'c'))) dmaybe(params, 'freeze', encode_addr_or_none(ap.get(b'f'))) dmaybe(params, 'manager', encode_addr_or_none(ap.get(b'm'))) dmaybe(params, 'metadata-hash', encode_addr_or_none(ap.get(b'am'))) dmaybe(params, 'name', maybedecode(ap.get(b'an'))) dmaybe(params, 'reserve', encode_addr_or_none(ap.get(b'r'))) dmaybe(params, 'unit-name', maybedecode(ap.get(b'un'))) dmaybe(params, 'url', maybedecode(ap.get(b'url'))) assetp.append({ 'index':assetid, 'params':params }) else: assetp = None rawappparams = adata.get(b'appp',{}) appparams = [] for appid, ap in rawappparams.items(): appparams.append({ 'id':appid, 'params':{ 'approval-program':maybeb64(ap.get(b'approv')), 'clear-state-program':maybeb64(ap.get(b'clearp')), 'creator':niceaddr, 'global-state':tkvToTkvs(ap.get(b'gs')), 'global-state-schema':schemaDecode(ap.get(b'gsch')), 'local-state-schema':schemaDecode(ap.get(b'lsch')), }, }) rawapplocal = adata.get(b'appl',{}) applocal = [] for appid, als in rawapplocal.items(): applocal.append({ 'id':appid, 'state':{ 'schema':schemaDecode(ap.get(b'hsch')), 'key-value':tkvToTkvs(ap.get(b'tkv')), }, }) if i2a_checker: # TODO: assets created by this account i2a_checker.check(address, niceaddr, microalgos, assets, assetp, appparams, applocal) if args.limit and count > args.limit: break return i2a_checker