Exemple #1
0
 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())
Exemple #2
0
 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
Exemple #3
0
 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()
Exemple #4
0
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