From 43f11942689087b3cd9087706fe3f40ca4a376be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 11 May 2022 12:14:39 +0100 Subject: [PATCH] Parsing of dealer details --- validator-api/src/dkg/state/mod.rs | 57 +++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/validator-api/src/dkg/state/mod.rs b/validator-api/src/dkg/state/mod.rs index dcce52287a..91ad25f712 100644 --- a/validator-api/src/dkg/state/mod.rs +++ b/validator-api/src/dkg/state/mod.rs @@ -1,7 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use coconut_dkg_common::types::{Epoch, NodeIndex}; +use coconut_dkg_common::types::{Addr, BlockHeight, DealerDetails, Epoch, NodeIndex}; use crypto::asymmetric::identity; use dkg::{bte, Dealing}; use futures::lock::Mutex; @@ -16,14 +16,55 @@ pub(crate) use accessor::StateAccessor; type IdentityBytes = [u8; identity::PUBLIC_KEY_LENGTH]; -// TODO: some TryFrom impl to convert from encoded contract data // note: each dealer is also a receiver which simplifies some logic significantly -#[derive(Debug, Serialize, Deserialize)] -struct Dealer { - node_index: NodeIndex, - bte_public_key: bte::PublicKeyWithProof, - identity: identity::PublicKey, - remote_address: SocketAddr, +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(crate) struct Dealer { + pub(crate) chain_address: Addr, + pub(crate) node_index: NodeIndex, + pub(crate) bte_public_key: bte::PublicKeyWithProof, + pub(crate) identity: identity::PublicKey, + pub(crate) remote_address: SocketAddr, +} + +// TODO: move it elsewhere and propagate it to the contract +pub enum MalformedDealer { + MalformedEd25519PublicKey, + MalformedBTEPublicKey, + InvalidBTEPublicKey, + InvalidHostInformation, +} + +impl Dealer { + pub(crate) fn try_parse_from_raw( + contract_value: DealerDetails, + ) -> Result { + // this should be impossible as the contract must have used this key for signature verification + let identity = identity::PublicKey::from_base58_string(contract_value.ed25519_public_key) + .map_err(|_| MalformedDealer::MalformedEd25519PublicKey)?; + + let bte_public_key = bs58::decode(contract_value.bte_public_key_with_proof) + .into_vec() + .map(|bytes| bte::PublicKeyWithProof::try_from_bytes(&bytes)) + .map_err(|_| MalformedDealer::MalformedBTEPublicKey)? + .map_err(|_| MalformedDealer::MalformedBTEPublicKey)?; + + if !bte_public_key.verify() { + return Err(MalformedDealer::InvalidBTEPublicKey); + } + + let parsed_host = contract_value + .host + .parse() + .map_err(|_| MalformedDealer::InvalidHostInformation)?; + + Ok(Dealer { + chain_address: contract_value.address, + node_index: contract_value.assigned_index, + bte_public_key, + identity, + remote_address: parsed_host, + }) + } } #[derive(Debug, Clone)]