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
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
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
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
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')
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")
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
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
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
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