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)}
Example #2
0
    def on_post(self, req, resp):

        harvester = PolkascanHarvesterService(self.session,
                                              type_registry=TYPE_REGISTRY)
        block = Block.query(self.session).get(1)
        if block:
            result = harvester.process_genesis(block=block)
        else:
            result = 'Block #1 required to process genesis'

        self.session.commit()

        resp.media = {'result': result}