Ejemplo n.º 1
0
    def on_post(self, req, resp):

        block_hash = None

        if 'block_id' in req.media:
            block = Block.query(self.session).filter(
                Block.id == req.media.get('block_id')).first()
        elif req.media.get('block_hash'):
            block_hash = req.media.get('block_hash')
            block = Block.query(
                self.session).filter(Block.hash == block_hash).first()
        else:
            block = None
            resp.status = falcon.HTTP_BAD_REQUEST
            resp.media = {
                'errors': ['Either block_hash or block_id should be supplied']
            }

        if block:
            print('Sequencing #{} ...'.format(block.id))

            harvester = PolkascanHarvesterService(self.session,
                                                  type_registry=TYPE_REGISTRY)

            if block.id == 1:
                # Add genesis block
                parent_block = harvester.add_block(block.parent_hash)

            block_total = BlockTotal.query(
                self.session).filter_by(id=block.id).first()
            parent_block = Block.query(
                self.session).filter(Block.id == block.id - 1).first()
            parent_block_total = BlockTotal.query(
                self.session).filter_by(id=block.id - 1).first()

            if block_total:
                resp.status = falcon.HTTP_200
                resp.media = {'result': 'already exists', 'blockId': block.id}
            else:

                if parent_block_total:
                    parent_block_total = parent_block_total.asdict()

                if parent_block:
                    parent_block = parent_block.asdict()

                harvester.sequence_block(block, parent_block,
                                         parent_block_total)

                self.session.commit()

                resp.status = falcon.HTTP_201
                resp.media = {
                    'result': 'added',
                    'parentHash': block.parent_hash
                }

        else:
            resp.status = falcon.HTTP_404
            resp.media = {'result': 'Block not found'}
Ejemplo n.º 2
0
    def on_post(self, req, resp):

        msg = "TODO"
        if req.media.get('start_hash'):
            block = Block.query(self.session).filter(Block.hash == req.media.get('start_hash')).first()
        else:
            block = Block.query(self.session).order_by(Block.id.asc()).first()

        if block and block.id != 1:
            harvester = PolkascanHarvesterService(self.session, type_registry=TYPE_REGISTRY)
            block_hash = block.parent_hash
            for nr in range(0, block.id - 1):
                try:
                    block = harvester.add_block(block_hash)
                except BlockAlreadyAdded as e:
                    print('Skipping {}'.format(block_hash))
                block_hash = block.parent_hash
                if block.id == 0:
                    break

            self.session.commit()

            resp.media = {
                'status': 'success',
                'data': {
                    'message': msg
                }
            }
        else:
            resp.status = falcon.HTTP_404
            resp.media = {'result': 'Block not found'}
Ejemplo n.º 3
0
    def on_post(self, req, resp):

        block_hash = None

        if req.media.get('block_id'):
            substrate = SubstrateInterface(
                url=SUBSTRATE_RPC_URL,
                runtime_config=RuntimeConfiguration(),
                type_registry_preset=settings.TYPE_REGISTRY)
            block_hash = substrate.get_block_hash(req.media.get('block_id'))
        elif req.media.get('block_hash'):
            block_hash = req.media.get('block_hash')
        else:
            resp.status = falcon.HTTP_BAD_REQUEST
            resp.media = {
                'errors': ['Either block_hash or block_id should be supplied']
            }

        if block_hash:
            print('Processing {} ...'.format(block_hash))
            harvester = PolkascanHarvesterService(
                db_session=self.session,
                type_registry=TYPE_REGISTRY,
                type_registry_file=TYPE_REGISTRY_FILE + '-mst')

            block = Block.query(
                self.session).filter(Block.hash == block_hash).first()

            if block:
                resp.status = falcon.HTTP_200
                resp.media = {
                    'result': 'already exists',
                    'parentHash': block.parent_hash
                }
            else:

                amount = req.media.get('amount', 1)

                for nr in range(0, amount):
                    try:
                        block = harvester.add_block(block_hash)
                    except BlockAlreadyAdded as e:
                        print('Skipping {}'.format(block_hash))
                    block_hash = block.parent_hash
                    if block.id == 0:
                        break

                self.session.commit()

                resp.status = falcon.HTTP_201
                resp.media = {
                    'result': 'added',
                    'parentHash': block.parent_hash
                }

        else:
            resp.status = falcon.HTTP_404
            resp.media = {'result': 'Block not found'}
Ejemplo n.º 4
0
def sequence_block_recursive(self,
                             parent_block_data,
                             parent_sequenced_block_data=None):

    harvester = PolkascanHarvesterService(self.session,
                                          type_registry=TYPE_REGISTRY)
    harvester.metadata_store = self.metadata_store
    for nr in range(0, 10):
        if not parent_sequenced_block_data:
            # No block ever sequenced, check if chain is at genesis state

            block = Block.query(self.session).order_by('id').first()

            if block.id == 1:
                # Add genesis block
                block = harvester.add_block(block.parent_hash)

            if block.id != 0:
                return {'error': 'Chain not at genesis'}

            harvester.process_genesis(block)
            block_id = 0
        else:
            block_id = parent_sequenced_block_data['id'] + 1

            block = Block.query(self.session).get(block_id)

        if block:
            try:
                sequenced_block = harvester.sequence_block(
                    block, parent_block_data, parent_sequenced_block_data)
                self.session.commit()

                parent_block_data = block.asdict()
                parent_sequenced_block_data = sequenced_block.asdict()

                if nr == 9 or not sequenced_block:

                    if sequenced_block:
                        if nr == 9:
                            sequence_block_recursive.delay(
                                parent_block_data, parent_sequenced_block_data)

                    return {'processedBlockId': block.id, 'amount': nr + 1}

            except IntegrityError as e:
                return {
                    'error': 'Sequencer already started',
                    'exception': str(e)
                }
        else:
            return {'error': 'Block {} not found'.format(block_id)}
Ejemplo n.º 5
0
def dealWithForks(self, shard_num, bid=None, substrate_url=None):
    shard_num = str(shard_num)
    if len(shard_num) == 2:
        shard_num = int(shard_num[1:2])
        print(shard_num)
    else:
        shard_num = int(shard_num)
    print(
        '== dealWithForks  substrate_url* {} *shardnum=*{} *==start_block_num=*{}*'
        .format(substrate_url, shard_num, bid))
    substrate = SubstrateInterface(substrate_url)
    # self.session.execute('delete  from data_block where shard_num = %(shard_num)s ',shard_num=shard_num)
    harvester = PolkascanHarvesterService(self.session,
                                          type_registry=TYPE_REGISTRY)
    harvester.metadata_store = self.metadata_store
    try:
        nr = 0
        min_bid = find(bid, shard_num, substrate)
        # min_bid = 5
        # bid = 7
        if (bid - min_bid) <= 1:
            return {
                'result':
                'dealWithForks from {} to {} blocks check by shardnum of {}'.
                format(min_bid, bid, shard_num),
                'status':
                '(bid - min_bid) <= 1,do nothing!'
            }
        self.session.query(Block).filter(Block.shard_num == shard_num,
                                         Block.bid > min_bid,
                                         Block.bid < bid).delete()
        self.session.query(Extrinsic).filter(
            Extrinsic.shard_num == shard_num, Extrinsic.block_id > min_bid,
            Extrinsic.block_id < bid).delete()
        self.session.query(Log).filter(Log.shard_num == shard_num,
                                       Log.block_id > min_bid,
                                       Log.block_id < bid).delete()
        self.session.query(Event).filter(Event.shard_num == shard_num,
                                         Event.block_id > min_bid,
                                         Event.block_id < bid).delete()

        for nr in range(min_bid + 1, bid):
            blocka = harvester.add_block(substrate.get_block_hash(nr),
                                         substrate_url)
            if blocka:
                print(
                    '== Added sucess dealWithForks  substrate_url* {} *shardnum=*{} *==start_block_num=*{}*'
                    .format(substrate_url, shard_num, nr))
                self.session.commit()

    except BlockAlreadyAdded as e:
        print('. dealWithForks Skipped {} '.format(nr))
    except IntegrityError as e:
        print('.dealWithForks Skipped duplicate {}=={} '.format(nr, e))
    except Exception as exc:
        print('!dealWithForks ERROR adding {}'.format(nr))
        raise self.retry(exc=exc, countdown=60, max_retries=5)

    return {
        'result':
        'dealWithForks from {} to {} blocks check by shardnum of {}'.format(
            min_bid, bid, shard_num),
        'dealWithForks_status':
        'true'
    }
Ejemplo n.º 6
0
def start_harvester(self, check_gaps=False, shard=None):
    shard = self.request.args[0]
    if shard is None:
        raise HarvesterNotshardParamsError(
            'params shard is missing.. stopping harvester ')

    print("start_harvester")
    substrate_url = SHARDS_TABLE[shard]
    print('== start_harvester substrate_url {} =='.format(substrate_url))
    substrate = SubstrateInterface(substrate_url)

    n = Block.query(self.session).filter_by(bid=1).count()

    if n < 4:
        print('waiting init task completed! count().n: {} '.format(n))

        return {'result': 'waiting init task completed! '}

    block_sets = []

    harvester = PolkascanHarvesterService(self.session,
                                          type_registry=TYPE_REGISTRY)
    harvester.metadata_store = self.metadata_store

    start_block_hash = substrate.get_chain_head()
    end_block_hash = None
    r = 10
    block_nr = substrate.get_block_number(start_block_hash)

    max_block = Block.query(self.session).filter_by(
        shard_num=shard.split(".")[1]).order_by(Block.bid.desc()).first()

    print('start block_nr  {} =='.format(block_nr))
    print('start max_block  {} =='.format(max_block.bid))
    if block_nr - max_block.bid < 10:
        r = block_nr - max_block.bid

    print('current range r: {} =='.format(max_block.bid))

    try:
        for nr in range(1, r + 1):
            block_hash = substrate.get_block_hash(max_block.bid + nr)

            if harvester.add_block(block_hash, substrate_url):
                print('start_harvester+ Added {} '.format(block_hash))
                self.session.commit()

        # Update persistent metadata store in Celery task
        self.metadata_store = harvester.metadata_store

    except BlockAlreadyAdded as e:
        print('. Skipped {} '.format(block_hash))
    except IntegrityError as e:
        print('. Skipped duplicate {}=={} '.format(block_hash, e))
    except Exception as exc:
        print('! ERROR adding {}'.format(block_hash))
        raise HarvesterCouldNotAddBlock(block_hash) from exc

    block_sets.append({
        'start_block_hash': start_block_hash,
        'end_block_hash': end_block_hash
    })

    return {
        'result':
        'Yee data Synchronization job SUCCESS',
        'block_sets':
        block_sets,
        'result':
        'Synch data  from {} to {} blocks check by shardnum of {}'.format(
            max_block.bid + 1, r + max_block.bid + 1, shard)
    }
Ejemplo n.º 7
0
def accumulate_block_recursive(self,
                               block_hash,
                               end_block_hash=None,
                               substrate_url=None):
    print(
        'start accumulate_block_recursive block_hash {} =='.format(block_hash))
    print('start accumulate_block_recursive substrate_url {} =='.format(
        substrate_url))

    harvester = PolkascanHarvesterService(self.session,
                                          type_registry=TYPE_REGISTRY)
    harvester.metadata_store = self.metadata_store

    # If metadata store isn't initialized yet, perform some tests
    if not substrate_url:
        return
        # shard_num = NUM[substrate_url]
        # print('start accumulate_block_recursive shard_num {} =='.format(shard_num))

    substrate = SubstrateInterface(substrate_url)
    block_nr = substrate.get_block_number(block_hash)

    block = None
    max_sequenced_block_id = False
    block_one = None
    add_count = 0

    try:
        for nr in range(0, block_nr + 1):
            if not block or block.bid > 0:
                # Process block
                blocka = harvester.add_block(block_hash, substrate_url)
                if blocka:
                    print('+ Added {} '.format(block_hash))
                    add_count += 1
                    self.session.commit()
                    block = blocka
                # Break loop if targeted end block hash is reached
                if block_hash == end_block_hash or block.bid == 0:
                    block_one = block
                    break
                # Continue with parent block hash
                block_hash = block.parent_hash

        # Update persistent metadata store in Celery task
        self.metadata_store = harvester.metadata_store
        harvester.process_shard_genesis(block_one, substrate_url)

        # if block_hash != end_block_hash and block and block.bid > 0:
        #     accumulate_block_recursive.delay(block.parent_hash, end_block_hash)

    except BlockAlreadyAdded as e:
        print('. Skipped {} '.format(block_hash))
    except IntegrityError as e:
        print('. Skipped duplicate {}=={} '.format(block_hash, e))
    except Exception as exc:
        print('! ERROR adding {}'.format(block_hash))
        raise HarvesterCouldNotAddBlock(block_hash) from exc

    return {
        'result': '{} blocks added'.format(add_count),
        'lastAddedBlockHash': block_hash,
        'sequencerStartedFrom': max_sequenced_block_id
    }
Ejemplo n.º 8
0
def accumulate_block_recursive(self, block_hash, end_block_hash=None):

    harvester = PolkascanHarvesterService(self.session,
                                          type_registry=TYPE_REGISTRY)
    harvester.metadata_store = self.metadata_store

    # If metadata store isn't initialized yet, perform some tests
    if not harvester.metadata_store:
        print('Init: create entrypoints')
        # Check if blocks exists
        max_block_id = self.session.query(func.max(Block.id)).one()[0]

        if not max_block_id:
            # Speed up accumulating by creating several entry points
            substrate = SubstrateInterface(SUBSTRATE_RPC_URL)
            block_nr = substrate.get_block_number(block_hash)
            if block_nr > 100:
                for entry_point in range(0, block_nr, block_nr // 4)[1:-1]:
                    entry_point_hash = substrate.get_block_hash(entry_point)
                    accumulate_block_recursive.delay(entry_point_hash)

    block = None
    max_sequenced_block_id = False

    add_count = 0

    try:

        for nr in range(0, 10):
            if not block or block.id > 0:
                # Process block
                block = harvester.add_block(block_hash)

                print('+ Added {} '.format(block_hash))

                add_count += 1

                self.session.commit()

                # Break loop if targeted end block hash is reached
                if block_hash == end_block_hash or block.id == 0:
                    break

                # Continue with parent block hash
                block_hash = block.parent_hash

        # Update persistent metadata store in Celery task
        self.metadata_store = harvester.metadata_store

        if block_hash != end_block_hash and block and block.id > 0:
            accumulate_block_recursive.delay(block.parent_hash, end_block_hash)

    except BlockAlreadyAdded as e:
        print('. Skipped {} '.format(block_hash))
        start_sequencer.delay()
    except IntegrityError as e:
        print('. Skipped duplicate {} '.format(block_hash))
    except Exception as exc:
        print('! ERROR adding {}'.format(block_hash))
        raise HarvesterCouldNotAddBlock(block_hash) from exc

    return {
        'result': '{} blocks added'.format(add_count),
        'lastAddedBlockHash': block_hash,
        'sequencerStartedFrom': max_sequenced_block_id
    }