Beispiel #1
0
    def GetEthValidatorsSignature(self, val_msg, context):
        """Get a vote(signature) from the validator to update the set of
        validators in the Aergo bridge contract bridging to Ethereum

        """
        if not (self.auto_update and self.oracle_update):
            return Approval(error="Validators update not enabled")
        err_msg = self.data_sources.is_valid_eth_validators(val_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\U0001f58b validator set", self.aergo_net, err_msg)
            return Approval(error=err_msg)

        # sign validators
        data = ""
        for val in val_msg.validators:
            data += val
        data += str(val_msg.destination_nonce) + self.aergo_oracle_id + "V"
        data_bytes = bytes(data, 'utf-8')
        h = hashlib.sha256(data_bytes).digest()
        sig = self.aergo_signer.sign(h)
        approval = Approval(address=self.aergo_signer.address, sig=sig)
        logger.info(success_log_template, self.validator_index, "true",
                    "\U0001f58b validator set", self.aergo_net,
                    val_msg.validators, val_msg.destination_nonce)
        return approval
Beispiel #2
0
    def GetAergoOracleSignature(self, oracle_msg, context):
        """Get a vote(signature) from the validator to update the
        oracle controlling the Ethereum bridge contract bridging to Aergo

        """
        if not (self.auto_update and self.oracle_update):
            return Approval(error="Oracle update not enabled")
        err_msg = self.data_sources.is_valid_aergo_oracle(oracle_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\U0001f58b oracle change", self.eth_net, err_msg)
            return Approval(error=err_msg)

        # sign oracle
        oracle = bytes.fromhex(oracle_msg.oracle[2:])
        msg_bytes = oracle \
            + oracle_msg.destination_nonce.to_bytes(32, byteorder='big') \
            + self.eth_oracle_id \
            + bytes("O", 'utf-8')
        h = keccak(msg_bytes)
        sig = self.eth_signer.sign(h)
        approval = Approval(address=self.eth_signer.address,
                            sig=bytes(sig.signature))
        logger.info(success_log_template, self.validator_index, "true",
                    "\U0001f58b oracle change", self.eth_net,
                    oracle_msg.oracle, oracle_msg.destination_nonce)
        return approval
Beispiel #3
0
    def GetAergoValidatorsSignature(self, val_msg, context):
        """Get a vote(signature) from the validator to update the set of
        validators in the Ethereum bridge contract bridging to Aergo

        """
        if not (self.auto_update and self.oracle_update):
            return Approval(error="Validators update not enabled")
        err_msg = self.data_sources.is_valid_aergo_validators(val_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\U0001f58b validator set", self.eth_net, err_msg)
            return Approval(error=err_msg)

        # sign validators
        concat_vals = b''
        for val in val_msg.validators:
            concat_vals += pad_bytes(b'\x00', 32, bytes.fromhex(val[2:]))
        msg_bytes = concat_vals \
            + val_msg.destination_nonce.to_bytes(32, byteorder='big') \
            + self.eth_oracle_id \
            + bytes("V", 'utf-8')
        h = keccak(msg_bytes)
        sig = self.eth_signer.sign(h)
        approval = Approval(address=self.eth_signer.address,
                            sig=bytes(sig.signature))
        logger.info(success_log_template, self.validator_index, "true",
                    "\U0001f58b validator set", self.eth_net,
                    val_msg.validators, val_msg.destination_nonce)
        return approval
Beispiel #4
0
    def GetEthAnchorSignature(self, anchor, context):
        """ Verifies an ethereum anchor and signs it to be broadcasted on aergo
            aergo and ethereum nodes must be trusted.

        Note:
            Anchoring service has priority over settings update because it can
            take time to gather signatures for settings update or a validator
            may not be aware settings have changed.
            So the current onchain bridge settings are queries every time.

        """
        if not self.anchoring_on:
            return Approval(error="Anchoring not enabled")
        err_msg = self.data_sources.is_valid_eth_anchor(anchor)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\u2693 anchor", self.aergo_net, err_msg)
            return Approval(error=err_msg)

        # sign anchor and return approval
        msg = bytes(
            anchor.root.hex() + ',' + str(anchor.height) +
            str(anchor.destination_nonce) + self.aergo_oracle_id + "R",
            'utf-8')
        h = hashlib.sha256(msg).digest()
        sig = self.aergo_signer.sign(h)
        approval = Approval(address=self.aergo_signer.address, sig=sig)
        logger.info(
            success_log_template, self.validator_index, "true",
            "\u2693 anchor", self.aergo_net,
            "{{\"root\": \"0x{}\", \"height\": {}}}".format(
                anchor.root.hex(), anchor.height), anchor.destination_nonce)
        return approval
Beispiel #5
0
    def GetAergoTFinalSignature(self, tempo_msg, context):
        """Get a vote(signature) from the validator to update the t_final
        setting in the Ethereum bridge contract bridging to Aergo

        """
        if not self.auto_update:
            return Approval(error="Setting update not enabled")
        err_msg = self.data_sources.is_valid_aergo_t_final(tempo_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\u231B t_final", self.eth_net, err_msg)
            return Approval(error=err_msg)
        return self.sign_aergo_tempo(tempo_msg, 't_final', 'F')
Beispiel #6
0
    def GetEthTAnchorSignature(self, tempo_msg, context):
        """Get a vote(signature) from the validator to update the t_anchor
        setting in the Aergo bridge contract bridging to Ethereum

        """
        if not self.auto_update:
            return Approval(error="Setting update not enabled")
        err_msg = self.data_sources.is_valid_eth_t_anchor(tempo_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\u231B t_anchor", self.aergo_net, err_msg)
            return Approval(error=err_msg)

        return self.sign_eth_tempo(tempo_msg, 't_anchor', "A")
Beispiel #7
0
 def sign_eth_tempo(self, tempo_msg, tempo_str, tempo_id):
     # sign anchor and return approval
     msg = bytes(
         str(tempo_msg.tempo) + str(tempo_msg.destination_nonce) +
         self.aergo_oracle_id + tempo_id, 'utf-8')
     h = hashlib.sha256(msg).digest()
     sig = self.aergo_signer.sign(h)
     approval = Approval(address=self.aergo_signer.address, sig=sig)
     logger.info(success_log_template, self.validator_index, "true",
                 "\u231B " + tempo_str, self.aergo_net, tempo_msg.tempo,
                 tempo_msg.destination_nonce)
     return approval
Beispiel #8
0
 def sign_aergo_tempo(self, tempo_msg, tempo_str, tempo_id):
     # sign anchor and return approval
     msg_bytes = tempo_msg.tempo.to_bytes(32, byteorder='big') \
         + tempo_msg.destination_nonce.to_bytes(32, byteorder='big') \
         + self.eth_oracle_id \
         + bytes(tempo_id, 'utf-8')
     h = keccak(msg_bytes)
     sig = self.eth_signer.sign(h)
     approval = Approval(address=self.eth_signer.address,
                         sig=bytes(sig.signature))
     logger.info(success_log_template, self.validator_index, "true",
                 "\u231B " + tempo_str, self.eth_net, tempo_msg.tempo,
                 tempo_msg.destination_nonce)
     return approval
Beispiel #9
0
    def GetEthOracleSignature(self, oracle_msg, context):
        """Get a vote(signature) from the validator to update the
        oracle controlling the Aergo bridge contract bridging to Ethereum

        """
        if not (self.auto_update and self.oracle_update):
            return Approval(error="Oracle update not enabled")
        err_msg = self.data_sources.is_valid_eth_oracle(oracle_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\U0001f58b oracle change", self.aergo_net, err_msg)
            return Approval(error=err_msg)

        # sign validators
        data = oracle_msg.oracle \
            + str(oracle_msg.destination_nonce) + self.aergo_oracle_id + "O"
        data_bytes = bytes(data, 'utf-8')
        h = hashlib.sha256(data_bytes).digest()
        sig = self.aergo_signer.sign(h)
        approval = Approval(address=self.aergo_signer.address, sig=sig)
        logger.info(success_log_template, self.validator_index, "true",
                    "\U0001f58b oracle change", self.aergo_net,
                    oracle_msg.oracle, oracle_msg.destination_nonce)
        return approval
Beispiel #10
0
    def GetAergoUnfreezeFeeSignature(self, new_fee_msg, context):
        """Get a vote(signature) from the validator to update the unfreezeFee
        setting in the Aergo bridge contract bridging to Ethereum

        """
        if not self.auto_update:
            return Approval(error="Unfreeze fee update not enabled")
        err_msg = self.data_sources.is_valid_unfreeze_fee(new_fee_msg)
        if err_msg is not None:
            logger.warning(error_log_template, self.validator_index, "false",
                           "\U0001f4a7 unfreeze fee", self.aergo_net, err_msg)
            return Approval(error=err_msg)

        # sign anchor and return approval
        msg = bytes(
            str(new_fee_msg.fee) + str(new_fee_msg.destination_nonce) +
            self.aergo_oracle_id + "UF", 'utf-8')
        h = hashlib.sha256(msg).digest()
        sig = self.aergo_signer.sign(h)
        approval = Approval(address=self.aergo_signer.address, sig=sig)
        logger.info(success_log_template, self.validator_index, "true",
                    "\U0001f4a7 unfreeze fee", self.aergo_net, new_fee_msg.fee,
                    new_fee_msg.destination_nonce)
        return approval