Skip to content

Commit 4ee70b7

Browse files
author
Ivo Georgiev
authored
Merge pull request #272 from AdExNetwork/validator-worker
Validator worker: quick fixes
2 parents b893bbd + f2598f1 commit 4ee70b7

File tree

2 files changed

+33
-29
lines changed

2 files changed

+33
-29
lines changed

adapter/src/ethereum.rs

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ impl Adapter for EthereumAdapter {
115115

116116
fn sign(&self, state_root: &str) -> AdapterResult<String> {
117117
if let Some(wallet) = &self.wallet {
118-
let message = Message::from_slice(&hash_message(state_root));
118+
let state_root = hex::decode(state_root)
119+
.map_err(|_| AdapterError::Signature("invalid state_root".to_string()))?;
120+
let message = Message::from_slice(&hash_message(&state_root));
119121
let wallet_sign = wallet
120122
.sign(&self.keystore_pwd, &message)
121123
.map_err(|_| map_error("failed to sign messages"))?;
@@ -130,11 +132,16 @@ impl Adapter for EthereumAdapter {
130132
}
131133

132134
fn verify(&self, signer: &ValidatorId, state_root: &str, sig: &str) -> AdapterResult<bool> {
133-
let decoded_signature = hex::decode(sig)
135+
if !sig.starts_with("0x") {
136+
return Err(AdapterError::Signature("not 0x prefixed hex".to_string()));
137+
}
138+
let decoded_signature = hex::decode(&sig[2..])
134139
.map_err(|_| AdapterError::Signature("invalid signature".to_string()))?;
135140
let address = Address::from_slice(signer.inner());
136141
let signature = Signature::from_electrum(&decoded_signature);
137-
let message = Message::from_slice(&hash_message(state_root));
142+
let state_root = hex::decode(state_root)
143+
.map_err(|_| AdapterError::Signature("invalid state_root".to_string()))?;
144+
let message = Message::from_slice(&hash_message(&state_root));
138145

139146
verify_address(&address, &signature, &message).or_else(|_| Ok(false))
140147
}
@@ -314,14 +321,13 @@ impl RelayerClient {
314321
}
315322
}
316323

317-
fn hash_message(message: &str) -> [u8; 32] {
324+
fn hash_message(message: &[u8]) -> [u8; 32] {
318325
let eth = "\x19Ethereum Signed Message:\n";
319326
let message_length = message.len();
320327

321-
let encoded = format!("{}{}{}", eth, message_length, message);
322-
323328
let mut result = Keccak::new_keccak256();
324-
result.update(&encoded.as_bytes());
329+
result.update(&format!("{}{}", eth, message_length).as_bytes());
330+
result.update(&message);
325331

326332
let mut res: [u8; 32] = [0; 32];
327333
result.finalize(&mut res);
@@ -371,10 +377,9 @@ pub fn ewt_sign(
371377

372378
let payload_encoded =
373379
base64::encode_config(&serde_json::to_string(payload)?, base64::URL_SAFE_NO_PAD);
374-
let message = Message::from_slice(&hash_message(&format!(
375-
"{}.{}",
376-
header_encoded, payload_encoded
377-
)));
380+
let message = Message::from_slice(&hash_message(
381+
&format!("{}.{}", header_encoded, payload_encoded).as_bytes(),
382+
));
378383
let signature: Signature = signer
379384
.sign(password, &message)
380385
.map_err(|_| map_error("sign message"))?
@@ -394,10 +399,9 @@ pub fn ewt_verify(
394399
payload_encoded: &str,
395400
token: &str,
396401
) -> Result<VerifyPayload, Box<dyn Error>> {
397-
let message = Message::from_slice(&hash_message(&format!(
398-
"{}.{}",
399-
header_encoded, payload_encoded
400-
)));
402+
let message = Message::from_slice(&hash_message(
403+
&format!("{}.{}", header_encoded, payload_encoded).as_bytes(),
404+
));
401405

402406
let decoded_signature = base64::decode_config(&token, base64::URL_SAFE_NO_PAD)?;
403407
let signature = Signature::from_electrum(&decoded_signature);
@@ -466,19 +470,19 @@ mod test {
466470

467471
// Sign
468472
let expected_response =
469-
"0xce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b";
473+
"0x625fd46f82c4cfd135ea6a8534e85dbf50beb157046dce59d2e97aacdf4e38381d1513c0e6f002b2f05c05458038b187754ff38cc0658dfc9ba854cccfb6e13e1b";
470474
let message = "2bdeafae53940669daa6f519373f686c";
471475
let response = eth_adapter.sign(message).expect("failed to sign message");
472476
assert_eq!(expected_response, response, "invalid signature");
473477

474478
// Verify
475479
let signature =
476-
"ce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b";
480+
"0x9e07f12958ce7c5eb1362eb9461e4745dd9d74a42b921391393caea700bfbd6e1ad876a7d8f9202ef1fe6110dbfe87840c5676ca5c4fda9f3330694a1ac2a1fc1b";
477481
let verify = eth_adapter
478482
.verify(
479-
&ValidatorId::try_from("2bDeAFAE53940669DaA6F519373f686c1f3d3393")
483+
&ValidatorId::try_from("2892f6C41E0718eeeDd49D98D648C789668cA67d")
480484
.expect("Failed to parse id"),
481-
"2bdeafae53940669daa6f519373f686c",
485+
"8bc45d8eb27f4c98cab35d17b0baecc2a263d6831ef0800f4c190cbfac6d20a3",
482486
&signature,
483487
)
484488
.expect("Failed to verify signatures");

validator_worker/src/main.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,16 +202,16 @@ async fn validator_tick<A: Adapter + 'static>(
202202
let duration = Duration::from_millis(config.validator_tick_timeout as u64);
203203

204204
match channel.spec.validators.find(&whoami) {
205-
SpecValidator::Leader(_) => {
206-
if let Err(e) = timeout(duration, leader::tick(&sentry)).await {
207-
return Err(ValidatorWorkerError::Failed(e.to_string()));
208-
}
209-
}
210-
SpecValidator::Follower(_) => {
211-
if let Err(e) = timeout(duration, follower::tick(&sentry)).await {
212-
return Err(ValidatorWorkerError::Failed(e.to_string()));
213-
}
214-
}
205+
SpecValidator::Leader(_) => match timeout(duration, leader::tick(&sentry)).await {
206+
Err(e) => return Err(ValidatorWorkerError::Failed(e.to_string())),
207+
Ok(Err(e)) => return Err(ValidatorWorkerError::Failed(e.to_string())),
208+
_ => (),
209+
},
210+
SpecValidator::Follower(_) => match timeout(duration, follower::tick(&sentry)).await {
211+
Err(e) => return Err(ValidatorWorkerError::Failed(e.to_string())),
212+
Ok(Err(e)) => return Err(ValidatorWorkerError::Failed(e.to_string())),
213+
_ => (),
214+
},
215215
SpecValidator::None => {
216216
return Err(ValidatorWorkerError::Failed(
217217
"validatorTick: processing a channel where we are not validating".to_string(),

0 commit comments

Comments
 (0)