class FlaskWorker():
    def __init__(self, privateKey):
        self.app = Flask(__name__)
        self.cryptor = NooCrypto()
        self.cryptor.setPrivateKey(privateKey)
        self.dataFieldsMas = <%FIELDS%>
        self.stemIP = "<%STEMIP%>"
        self.stemPK = "<%STEMPK%>"
        self.redis_host = os.getenv("REDIS_PORT_6379_TCP_ADDR") or 'localhost'
        self.redis_port = os.getenv("REDIS_PORT_6379_TCP_PORT") or '6379'
        self.redis = redis.StrictRedis(self.redis_host, self.redis_port, db=2)

        @self.app.route('/shard/getStatData', methods=['GET','POST'])
        def saveMapElement():
            if not request:
                abort(400)

            jsond = {}
            for field in self.dataFieldsMas:
                if self.redis.get(field) is not None:
                    jsond.update({field: self.redis.get(field)})

            jsonstr = json.dumps(jsond)
            sign = self.cryptor.signMessage(jsonstr)

            return json.dumps({"DATA": jsond,"SIGNATURE": sign}, separators=(',', ':'))

    def run(self):
        self.app.run(host='0.0.0.0', port=5005)
    def createPrecommitBlock(cryptor:NooCrypto, ver:str, transactions:set, bheight):
        jtransactions = []
        for tran in transactions:
            jtransactions.append(json.loads(tran))

        block = json.dumps({'TT': 'BL', 'SENDER': cryptor.getPublicKey(), 'VERSION': ver, 'TCOUNT': len(jtransactions), "BHEIGHT": bheight, 'TRANSACTIONS':jtransactions}, separators=(',', ':'))
        sign = cryptor.signMessage(block)
        jblock = json.loads(block)
        jblock.update({'SIGNATURE':sign})

        return json.dumps(jblock, separators=(',', ':'))
 def createPurifierBlock(cryptor:NooCrypto, addressList:list, keyList:list, bheight:int):
     temp = json.dumps({'TT': 'PURIFIER', 'SENDER': cryptor.getPublicKey(), 'CLEAN_LIST': addressList, 'CLEAN_KEY_LIST': keyList, "BHEIGHT": bheight}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def giveAllSizeBlock(cryptor:NooCrypto, NBH:int):
     temp = json.dumps({'TT': 'ASB', 'SENDER': cryptor.getPublicKey(), "NBH": NBH}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def chooserTransaction(cryptor:NooCrypto, blockchain_height): # Транзакция выбора ноды для работы
     temp = json.dumps({'TT': 'CT', 'SENDER': cryptor.getPublicKey(), "NBH": blockchain_height, "TST": str(int(time.time()))}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def createSignaturePrecommitedBlock(cryptor:NooCrypto, pblock:str, hash:str):
     temp = json.dumps({'TT': 'SG', 'SENDER': cryptor.getPublicKey(), 'HASH': hash,'SIGNPB': cryptor.signMessage(pblock)}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def createCommitBlockForResendHash(cryptor:NooCrypto, block:str, bheight:int):
     block = json.dumps({'TT': 'CBRH', 'SENDER': cryptor.getPublicKey(), "HASH":NooTree.hash(block), "STEM_SIGNATURE": cryptor.signMessage(block), "BHEIGHT": bheight}, separators=(',', ':'))
     sign = cryptor.signMessage(block)
     jblock = json.loads(block)
     jblock.update({'SIGNATURE':sign})
     return json.dumps(jblock, separators=(',', ':'))
 def createCommitBlockForResend(cryptor:NooCrypto, block:str):
     block = json.dumps({'TT': 'CBR', 'SENDER': cryptor.getPublicKey(), "BLOCK" :json.loads(block)}, separators=(',', ':'))
     sign = cryptor.signMessage(block)
     jblock = json.loads(block)
     jblock.update({'SIGNATURE':sign})
     return json.dumps(jblock, separators=(',', ':'))
 def createCommitBlock(cryptor:NooCrypto, preCommitedBlock:str, signs:list):
     block = json.dumps({'TT': 'CB', 'SENDER': cryptor.getPublicKey(), "BLOCK" :json.loads(preCommitedBlock), "SIGNATURES":signs}, separators=(',', ':'))
     sign = cryptor.signMessage(block)
     jblock = json.loads(block)
     jblock.update({'SIGNATURE':sign})
     return json.dumps(jblock, separators=(',', ':'))
 def standartTransacton(cryptor:NooCrypto, reciever:str, token_count:int, token_type:str): # Стандартная транзакция перевода средств
     temp = json.dumps({'TT': 'ST', 'SENDER': cryptor.getPublicKey(), 'RECEIVER': reciever, 'TTOKEN':token_type, 'CTOKEN': str(token_count), "TST": str(int(time.time()))}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def applicantTransacton(cryptor:NooCrypto, ip:str): # Транзакция заявка на участие в следующем туре валидации
     temp = json.dumps({'TT': 'AT', 'SENDER': cryptor.getPublicKey(), 'IPADR': ip, "TST": str(int(time.time()))}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def universalPacket(cryptor:NooCrypto, type:str, value):
     temp = json.dumps({'TT': type, 'DATA': value, 'SENDER': cryptor.getPublicKey()}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def badAnswer(cryptor:NooCrypto):
     temp = json.dumps({'TT': 'BAN', 'SENDER': cryptor.getPublicKey()}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def myBenchmarkResult(cryptor:NooCrypto, result:str, start:str):
     temp = json.dumps({'TT': 'MBR', 'SENDER': cryptor.getPublicKey(), 'RESULT': result, 'START': start}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def benchmarkTesting(cryptor:NooCrypto, uuid:str):
     temp = json.dumps({'TT': 'BT', 'SENDER': cryptor.getPublicKey(), 'START': uuid}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))
 def createСomplaint(cryptor:NooCrypto, evidence_block:str, evidence_transaction:str):
     temp = json.dumps({'TT': 'COMPLAINT', 'SENDER': cryptor.getPublicKey(), 'EVIDENCE_BLOCK': evidence_block, 'EVIDENCE_TRANSACTION': evidence_transaction}, separators=(',', ':'))
     sign = cryptor.signMessage(temp)
     jtemp = json.loads(temp)
     jtemp.update({'SIGNATURE':sign})
     return json.dumps(jtemp, separators=(',', ':'))