def issue(app_config, certificate_batch_handler, transaction_handler): unsigned_certs_dir = app_config.unsigned_certificates_dir signed_certs_dir = app_config.signed_certificates_dir blockchain_certificates_dir = app_config.blockchain_certificates_dir work_dir = app_config.work_dir certificates_metadata = helpers.prepare_issuance_batch( unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir, work_dir) num_certificates = len(certificates_metadata) if num_certificates < 1: logging.warning('No certificates to process') return None logging.info('Processing %d certificates under work path=%s', num_certificates, work_dir) certificate_batch_handler.set_certificates_in_batch(certificates_metadata) transaction_handler.ensure_balance() issuer = Issuer(certificate_batch_handler=certificate_batch_handler, transaction_handler=transaction_handler, max_retry=app_config.max_retry) tx_id = issuer.issue(app_config.bitcoin_chain) helpers.copy_output(certificates_metadata) logging.info('Your Blockchain Certificates are in %s', blockchain_certificates_dir) return tx_id
def issue(app_config, certificate_batch_handler, transaction_handler): unsigned_certs_dir = app_config.unsigned_certificates_dir signed_certs_dir = app_config.signed_certificates_dir blockchain_certificates_dir = app_config.blockchain_certificates_dir work_dir = app_config.work_dir certificates_metadata = helpers.prepare_issuance_batch(unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir, work_dir) num_certificates = len(certificates_metadata) if num_certificates < 1: logging.warning('No certificates to process') return None logging.info('Processing %d certificates under work path=%s', num_certificates, work_dir) certificate_batch_handler.set_certificates_in_batch(certificates_metadata) transaction_handler.ensure_balance() issuer = Issuer( certificate_batch_handler=certificate_batch_handler, transaction_handler=transaction_handler, max_retry=app_config.max_retry) tx_id = issuer.issue(app_config.bitcoin_chain) helpers.copy_output(certificates_metadata) logging.info('Your Blockchain Certificates are in %s', blockchain_certificates_dir) return tx_id
def _process_directories(self, config): unsigned_certs_dir = config.unsigned_certificates_dir signed_certs_dir = config.signed_certificates_dir blockchain_certificates_dir = config.blockchain_certificates_dir work_dir = config.work_dir certificates_metadata = helpers.prepare_issuance_batch( unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir, work_dir) num_certificates = len(certificates_metadata) if num_certificates < 1: return None logging.info('Processing %d certificates under work path=%s', num_certificates, work_dir) self.set_certificates_in_batch(certificates_metadata)
def main(app_config): unsigned_certs_dir = app_config.unsigned_certificates_dir signed_certs_dir = app_config.signed_certificates_dir blockcerts_dir = app_config.blockchain_certificates_dir work_dir = app_config.work_dir # find certificates to issue certificates = helpers.find_certificates_to_process( unsigned_certs_dir, signed_certs_dir) if not certificates: logging.warning('No certificates to process') raise NoCertificatesFoundError('No certificates to process') certificates, batch_metadata = helpers.prepare_issuance_batch( unsigned_certs_dir, signed_certs_dir, work_dir) logging.info('Processing %d certificates under work path=%s', len(certificates), work_dir) issuing_address = app_config.issuing_address revocation_address = app_config.revocation_address if app_config.wallet_connector_type == 'blockchain.info': wallet_credentials = { 'wallet_guid': app_config.wallet_guid, 'wallet_password': app_config.wallet_password, 'api_key': app_config.api_key, } else: wallet_credentials = {} connector = ServiceProviderConnector(app_config.netcode, app_config.wallet_connector_type, wallet_credentials) path_to_secret = os.path.join(app_config.usb_name, app_config.key_file) signer = Signer( FileSecretManager(path_to_secret=path_to_secret, disable_safe_mode=app_config.safe_mode)) tx_constants = TransactionCostConstants(app_config.tx_fee, app_config.dust_threshold, app_config.satoshi_per_byte) issuer = BatchIssuer(netcode=app_config.netcode, issuing_address=issuing_address, certificates_to_issue=certificates, connector=connector, signer=signer, tx_cost_constants=tx_constants, batch_metadata=batch_metadata) issuer.validate_schema() # verify signed certs are signed with issuing key [ verify_signature(uid, cert.signed_cert_file_name, issuing_address) for uid, cert in certificates.items() ] logging.info('Hashing signed certificates.') issuer.hash_certificates() # calculate transaction cost transaction_cost = issuer.calculate_cost_for_certificate_batch() logging.info('Total cost will be %d satoshis', transaction_cost) # ensure the issuing address has sufficient balance balance = connector.get_balance(issuing_address) if transaction_cost > balance: error_message = 'Please add {} satoshis to the address {}'.format( transaction_cost - balance, issuing_address) logging.error(error_message) raise InsufficientFundsError(error_message) # issue the certificates on the blockchain logging.info('Issuing the certificates on the blockchain') issuer.issue_on_blockchain(revocation_address=revocation_address) blockcerts_tmp_dir = os.path.join(work_dir, helpers.BLOCKCHAIN_CERTIFICATES_DIR) if not os.path.exists(blockcerts_dir): os.makedirs(blockcerts_dir) for item in os.listdir(blockcerts_tmp_dir): s = os.path.join(blockcerts_tmp_dir, item) d = os.path.join(blockcerts_dir, item) shutil.copy2(s, d) logging.info('Your Blockchain Certificates are in %s', blockcerts_dir) return blockcerts_dir
def main(app_config, secure_signer=None): unsigned_certs_dir = app_config.unsigned_certificates_dir signed_certs_dir = app_config.signed_certificates_dir blockchain_certificates_dir = app_config.blockchain_certificates_dir work_dir = app_config.work_dir v2 = app_config.v2 issuing_address = app_config.issuing_address revocation_address = app_config.revocation_address # not needed for v2 certificates, batch_metadata = helpers.prepare_issuance_batch( unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir, work_dir) logging.info('Processing %d certificates under work path=%s', len(certificates), work_dir) logging.info('Signing certificates...') if not secure_signer: secure_signer = secure_signer_helper.initialize_secure_signer( app_config) connector = ServiceProviderConnector(app_config.bitcoin_chain) tx_constants = TransactionCostConstants(app_config.tx_fee, app_config.dust_threshold, app_config.satoshi_per_byte) if v2: certificate_handler = CertificateV2Handler() transaction_handler = TransactionV2Handler( tx_cost_constants=tx_constants, issuing_address=issuing_address) else: certificate_handler = CertificateV1_2Handler() transaction_handler = TransactionV1_2Handler( tx_cost_constants=tx_constants, issuing_address=issuing_address, certificates_to_issue=certificates, revocation_address=revocation_address) certificate_batch_handler = CertificateBatchHandler( certificates_to_issue=certificates, certificate_handler=certificate_handler) issuer = Issuer(issuing_address=issuing_address, connector=connector, secure_signer=secure_signer, certificate_batch_handler=certificate_batch_handler, transaction_handler=transaction_handler) transaction_cost = issuer.calculate_cost_for_certificate_batch() logging.info('Total cost will be %d satoshis', transaction_cost) # ensure the issuing address has sufficient balance balance = connector.get_balance(issuing_address) if transaction_cost > balance: error_message = 'Please add {} satoshis to the address {}'.format( transaction_cost - balance, issuing_address) logging.error(error_message) raise InsufficientFundsError(error_message) tx_id = issuer.issue_certificates() blockcerts_tmp_dir = os.path.join(work_dir, helpers.BLOCKCHAIN_CERTIFICATES_DIR) if not os.path.exists(blockchain_certificates_dir): os.makedirs(blockchain_certificates_dir) for item in os.listdir(blockcerts_tmp_dir): s = os.path.join(blockcerts_tmp_dir, item) d = os.path.join(blockchain_certificates_dir, item) shutil.copy2(s, d) logging.info('Your Blockchain Certificates are in %s', blockchain_certificates_dir) return tx_id