示例#1
0
 def masternode_image_upload_request_mn0(self, data, *args, **kwargs):
     # parse inputs
     upload_code = data['upload_code']
     image_data = data['image_data']
     mn_ticket_logger.info(
         'Masternode image upload received, upload_code: {}'.format(
             upload_code))
     sender_id = kwargs.get('sender_id')
     db.connect(reuse_if_open=True)
     try:
         regticket_db = Regticket.get(upload_code=upload_code)
         regticket = RegistrationTicket(serialized=regticket_db.regticket)
         if regticket.author != sender_id:
             raise Exception(
                 'Given upload code was created by other public key')
         mn_ticket_logger.info(
             'Given upload code exists with required public key')
     except DoesNotExist:
         mn_ticket_logger.warn(
             'Given upload code DOES NOT exists with required public key')
         raise
     result = self.__chainwrapper.getlocalfee()
     fee = result['localfee']
     regticket_db.image_data = image_data
     regticket_db.localfee = fee
     regticket_db.save()
     return fee
示例#2
0
    def masternode_validate_registration_ticket(self, data, *args, **kwargs):
        # parse inputs
        artist_pk = kwargs.get('sender_id')
        mn_ticket_logger.info(
            'Masternode validate regticket, data: {}'.format(data))
        regticket_serialized, regticket_signature_serialized = data
        regticket = RegistrationTicket(serialized=regticket_serialized)
        signed_regticket = Signature(serialized=regticket_signature_serialized)
        require_true(signed_regticket.pubkey == regticket.author)
        signed_regticket.validate(regticket)

        # validate registration ticket
        regticket.validate(self.__chainwrapper)
        upload_code = uuid.uuid4().bytes

        # TODO: clean upload code and regticket from local db when ticket was placed on the blockchain
        # TODO: clean upload code and regticket from local db if they're old enough
        db.connect(reuse_if_open=True)
        Regticket.create(
            regticket=regticket_serialized,
            upload_code=upload_code,
            created=datetime.now(),
            artists_signature_ticket=regticket_signature_serialized,
            artist_pk=artist_pk,
            image_hash=regticket.imagedata_hash)
        return upload_code
示例#3
0
 def regticket_status(self, data, *args, **kwargs):
     # verify identity - return status only to regticket creator
     sender_id = kwargs.get('sender_id')
     upload_code = data.get('upload_code')
     db.connect(reuse_if_open=True)
     try:
         regticket_db = Regticket.get(artist_pk=sender_id,
                                      upload_code=upload_code)
     except DoesNotExist:
         raise Exception(
             'Given upload code DOES NOT exists with required public key')
     return {'status': regticket_db.status, 'error': regticket_db.error}
示例#4
0
from core_modules.database import db, Regticket

db.connect(reuse_if_open=True)
db.create_tables([Regticket])
示例#5
0
    def masternode_mn0_confirm(self, data, *args, **kwargs):
        # parse inputs
        artist_pk, image_hash, serialized_signature = data
        sender_id = kwargs.get('sender_id')
        db.connect(reuse_if_open=True)
        mn_ticket_logger.info(
            'masternode_mn0_confirm: received confirmation from {}'.format(
                sender_id))
        try:
            # Verify that given upload_code exists
            # !!!! - regticket with same artists_pk and image_hash may already exists
            regticket_db_set = Regticket.select().where(
                Regticket.artist_pk == artist_pk,
                Regticket.image_hash == image_hash)
            if len(regticket_db_set) == 0:
                raise Exception(
                    'Regticket not found for given artist ID and image hash')

            if len(regticket_db_set) > 2:
                regticket_db = regticket_db_set[-1]
                Regticket.delete().where(Regticket.id < regticket_db.id)
            else:
                regticket_db = regticket_db_set[0]

            if regticket_db.is_valid_mn1 is None:
                # first confirmation has came
                regticket_db.is_valid_mn1 = True
                regticket_db.mn1_pk = sender_id
                regticket_db.mn1_serialized_signature = serialized_signature
                regticket_db.save()
            else:
                if regticket_db.is_valid_mn2 is None:
                    if regticket_db.mn1_pk == sender_id:
                        raise Exception(
                            'I already have confirmation from this masternode')
                    # second confirmation has came
                    regticket_db.is_valid_mn2 = True
                    regticket_db.mn2_pk = sender_id
                    regticket_db.mn2_serialized_signature = serialized_signature
                    regticket_db.save()
                    regticket = RegistrationTicket(
                        serialized=regticket_db.regticket)
                    current_block = self.__chainwrapper.get_last_block_number()
                    # verify if confirmation receive for 5 blocks or less from regticket creation.
                    if current_block - regticket.blocknum > 5:
                        regticket_db.status = REGTICKET_STATUS_ERROR
                        error_msg = 'Second confirmation received too late - current block {}, regticket block: {}'. \
                            format(current_block, regticket.blocknum)
                        regticket_db.error = error_msg
                        raise Exception(error_msg)
                    # Tcreate final ticket
                    final_ticket = generate_final_regticket(
                        regticket,
                        Signature(
                            serialized=regticket_db.artists_signature_ticket),
                        (Signature(
                            dictionary={
                                "signature":
                                pastel_id_write_signature_on_data_func(
                                    regticket_db.regticket, self.__priv,
                                    self.__pub),
                                "pubkey":
                                self.__pub
                            }),
                         Signature(
                             serialized=regticket_db.mn1_serialized_signature),
                         Signature(
                             serialized=regticket_db.mn2_serialized_signature)
                         ))
                    # write final ticket into blockchain
                    # TODO: process errors
                    txid = self.__chainwrapper.store_ticket(final_ticket)
                    mn_ticket_logger.warn(
                        'Final ticket is stored, txid: {}'.format(txid))
                    return txid
                    # TODO: store image into chunkstorage - later, when activation happens
                    # TODO: extract all this into separate function
                else:
                    raise Exception(
                        'All 2 confirmations received for a given ticket')
        except DoesNotExist:
            mn_ticket_logger.warn(
                'Given upload code DOES NOT exists with required public key')
            raise Exception(
                'Given upload code DOES NOT exists with required public key')
        mn_ticket_logger.info('Confirmation from MN received')
        return 'Ok'