bridge: fix quorum (#56)

This commit is contained in:
Hendrik Hofstadt 2020-10-25 08:57:04 +01:00 committed by GitHub
parent c0882192da
commit 8d7a35683e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 5 deletions

View File

@ -99,7 +99,9 @@ contract Wormhole is ReentrancyGuard {
GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index]; GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index];
require(guardian_set.keys.length > 0, "invalid guardian set"); require(guardian_set.keys.length > 0, "invalid guardian set");
require(guardian_set.expiration_time == 0 || guardian_set.expiration_time > block.timestamp, "guardian set has expired"); require(guardian_set.expiration_time == 0 || guardian_set.expiration_time > block.timestamp, "guardian set has expired");
require(((guardian_set.keys.length / 4) * 3) + 1 <= len_signers, "no quorum"); // For guardian sets < 3, the division by 3 evaluates to 0 and the quorum would not be calculated correctly
// We fall back to the guardian set size as quorum for < 3, because 2/3+ for <3 is always the set size
require((guardian_set.keys.length < 3 && len_signers == guardian_set.keys.length) || (len_signers >= 3 && ((guardian_set.keys.length / 3) * 2) + 1 <= len_signers), "no quorum");
int16 last_index = - 1; int16 last_index = - 1;
for (uint i = 0; i < len_signers; i++) { for (uint i = 0; i < len_signers; i++) {

View File

@ -621,13 +621,17 @@ impl Bridge {
return Err(ProgramError::InvalidAccountData); return Err(ProgramError::InvalidAccountData);
} }
// Check quorum let signature_count = (sig_state
if (sig_state
.signatures .signatures
.iter() .iter()
.filter(|v| v.iter().filter(|v| **v != 0).count() != 0) .filter(|v| v.iter().filter(|v| **v != 0).count() != 0)
.count() as u8) .count() as u8);
< (((guardian_set.len_keys / 4) * 3) + 1) // Check quorum
// For guardian sets < 3, the division by 3 evaluates to 0 and the quorum would not be calculated correctly
// We fall back to the guardian set size as quorum for < 3, because 2/3+ for <3 is always the set size
if (guardian_set.len_keys < 3 && signature_count != guardian_set.len_keys)
|| (guardian_set.len_keys >= 3
&& signature_count < (((guardian_set.len_keys / 3) * 2) + 1))
{ {
return Err(ProgramError::InvalidArgument); return Err(ProgramError::InvalidArgument);
} }