Skip to content

Commit f34af2b

Browse files
author
vlad
committed
defined separate whitelist and parameters for emergency upgrade
1 parent 8bcc087 commit f34af2b

File tree

3 files changed

+96
-65
lines changed

3 files changed

+96
-65
lines changed

cosmwasm/enclaves/execute/src/registration/offchain.rs

+85-58
Original file line numberDiff line numberDiff line change
@@ -772,36 +772,18 @@ pub unsafe extern "C" fn ecall_onchain_approve_upgrade(
772772
sgx_types::sgx_status_t::SGX_SUCCESS
773773
}
774774

775-
fn is_export_approved_offchain(mut f_in: File, report: &sgx_report_body_t) -> bool {
775+
fn load_offchain_signers(
776+
mut f_in: File,
777+
report: &sgx_report_body_t,
778+
) -> std::collections::HashSet<[u8; 20]> {
776779
let mut json_data = String::new();
777780
f_in.read_to_string(&mut json_data).unwrap();
778781

779782
// Deserialize the JSON string into a HashMap<String, String>
780783
let signatures: HashMap<String, (String, String)> =
781784
serde_json::from_str(&json_data).expect("Failed to deserialize JSON");
782785

783-
// Build the not-yet-voted validators map
784-
let mut not_yet_voted_validators: HashMap<[u8; 20], u64> = HashMap::new();
785-
let mut total_voting_power: u64 = 0;
786-
787-
let validator_set = {
788-
let extra = KEY_MANAGER.extra_data.lock().unwrap();
789-
extra.decode_validator_set().unwrap()
790-
};
791-
792-
for validator in validator_set.validators() {
793-
//println!("Address: {}", validator.address);
794-
//println!("Voting Power: {}", validator.power);
795-
let power: u64 = validator.power.value();
796-
if power > 0 {
797-
total_voting_power += power;
798-
let addr: [u8; 20] = validator.address.as_bytes().try_into().unwrap();
799-
not_yet_voted_validators.insert(addr, power);
800-
}
801-
}
802-
803-
let mut approved_power: u64 = 0;
804-
let mut approved_whitelisted: usize = 0;
786+
let mut signers = std::collections::HashSet::new();
805787

806788
for (addr_str, (pubkey_str, sig_str)) in &signatures {
807789
let pubkey_bytes = base64::decode(pubkey_str).unwrap();
@@ -838,60 +820,105 @@ fn is_export_approved_offchain(mut f_in: File, report: &sgx_report_body_t) -> bo
838820
panic!("Incorrect signature for address: {}", addr_str);
839821
}
840822

841-
let (voter_power, is_whitelisted) =
842-
if let Some((_, power)) = not_yet_voted_validators.remove_entry(&addr) {
843-
//not_yet_voted_validators.remove(&addr);
823+
if signers.insert(addr) {
824+
println!(" Approved by {}", addr_str);
825+
}
826+
}
844827

845-
#[cfg(feature = "verify-validator-whitelist")]
846-
let is_whitelisted = validator_whitelist::VALIDATOR_WHITELIST.contains(addr_str);
828+
signers
829+
}
847830

848-
#[cfg(not(feature = "verify-validator-whitelist"))]
849-
let is_whitelisted = false;
831+
#[cfg(feature = "verify-validator-whitelist")]
832+
fn count_included_addresses(
833+
signers: &std::collections::HashSet<[u8; 20]>,
834+
list: &validator_whitelist::ValidatorList,
835+
) -> usize {
836+
let mut res: usize = 0;
837+
838+
for addr_str in &list.0 {
839+
let addr_vec = hex::decode(addr_str).unwrap();
840+
let addr: [u8; 20] = addr_vec.try_into().unwrap();
841+
842+
if signers.contains(&addr) {
843+
res += 1;
844+
}
845+
}
850846

851-
approved_power += power;
852-
if is_whitelisted {
853-
approved_whitelisted += 1;
854-
}
847+
res
848+
}
855849

856-
(power, is_whitelisted)
857-
} else {
858-
(0, false)
859-
};
850+
fn is_standard_consensus_reached(signers: &std::collections::HashSet<[u8; 20]>) -> bool {
851+
let mut total_voting_power: u64 = 0;
852+
let mut approved_power: u64 = 0;
860853

861-
println!(
862-
" Approved by {}, power = {}, whitelisted = {}",
863-
addr_str, voter_power, is_whitelisted
864-
);
854+
let validator_set = {
855+
let extra = KEY_MANAGER.extra_data.lock().unwrap();
856+
extra.decode_validator_set().unwrap()
857+
};
858+
859+
for validator in validator_set.validators() {
860+
let power: u64 = validator.power.value();
861+
total_voting_power += power;
862+
863+
let addr: [u8; 20] = validator.address.as_bytes().try_into().unwrap();
864+
if signers.contains(&addr) {
865+
approved_power += power;
866+
}
865867
}
866868

867869
println!(
868-
"Total Power = {}, Approved Power = {}, Total whitelisted = {}",
869-
total_voting_power, approved_power, approved_whitelisted
870+
"Total Power = {}, Approved Power = {}",
871+
total_voting_power, approved_power
870872
);
871873

872-
#[cfg(feature = "verify-validator-whitelist")]
873-
if approved_whitelisted < validator_whitelist::VALIDATOR_THRESHOLD {
874-
error!("not enogh whitelisted validators");
874+
if approved_power * 3 < total_voting_power * 2 {
875+
println!(" not enogh voting power");
875876
return false;
876877
}
877878

878-
if approved_power * 3 < total_voting_power * 2 {
879-
#[cfg(feature = "verify-validator-whitelist")]
880-
let emergency_threshold_reached =
881-
approved_whitelisted >= validator_whitelist::VALIDATOR_THRESHOLD_EMERGENCY;
882-
883-
#[cfg(not(feature = "verify-validator-whitelist"))]
884-
let emergency_threshold_reached = false;
885-
886-
if !emergency_threshold_reached {
887-
error!("not enough voting power, emergency threshold not reached");
879+
#[cfg(feature = "verify-validator-whitelist")]
880+
{
881+
let approved_whitelisted =
882+
count_included_addresses(signers, &validator_whitelist::VALIDATOR_WHITELIST);
883+
if approved_whitelisted < validator_whitelist::VALIDATOR_THRESHOLD {
884+
println!(
885+
" not enogh whitelisted validators: {}",
886+
approved_whitelisted
887+
);
888888
return false;
889889
}
890890
}
891-
892891
true
893892
}
894893

894+
fn is_export_approved_offchain(f_in: File, report: &sgx_report_body_t) -> bool {
895+
let signers = load_offchain_signers(f_in, report);
896+
897+
let b1 = is_standard_consensus_reached(&signers);
898+
println!("Standard consensus reached: {}", b1);
899+
900+
#[cfg(not(feature = "verify-validator-whitelist"))]
901+
let b2 = false;
902+
903+
#[cfg(feature = "verify-validator-whitelist")]
904+
let b2 = {
905+
let approved_whitelisted = count_included_addresses(
906+
&signers,
907+
&validator_whitelist::VALIDATOR_WHITELIST_EMERGENCY,
908+
);
909+
println!(
910+
" Emergency whitelisted validators: {}",
911+
approved_whitelisted
912+
);
913+
914+
approved_whitelisted >= validator_whitelist::VALIDATOR_THRESHOLD_EMERGENCY
915+
};
916+
917+
println!("Emergency threshold reached: {}", b2);
918+
919+
b1 || b2
920+
}
921+
895922
fn is_export_approved(report: &sgx_report_body_t) -> bool {
896923
// Current policy: we demand the same mr_signer
897924

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
90D3EAB32E1A7BDD4BCEB233D9BB49D07EBD32C9,E937690E72C1B4FDB08403B05EE820CF74C4D69D,E855109B212B9EB65C982FD44EE13E77E9E33C4A,3199A17457ADAED098B8EB1DC932CC7DFBDC54E7,BEACB43688A1BD8B61E27CAC56218282E502DA36,2E76AE6E453395F35D6C0728D44FB6147CE5B5A0,186ED967212C36E398521B2EFF12C510E71180F6,4CCE562B1E2BC571751DB512222CED5A082470EA,70668F4E3B7617E68ADBA53E6046A070270968B1,2C8E9639ADE5D341E8FB26106940FC97DB518AA4,1F4A4BFA289E55D13ED370E49F53ACC5CDD29B75,93163CAF1597772C427DC32EAEF23F01DCA69E02,84BC2C72491187FAB144F628166E10D592786616,2DD098C8ECAF04DFE31BBC59799C786AC09BF53F,73D9DDC9EBB5BDB44ADA9FF2051610B75CB31A8D,C48710DB80EA8538C8E8BA17035D62630AF5C216,AE0226C471CD72E7472C4757B09749452F233337,61698CC93DE528E25201B117A607F0334EDF4FFA,CA3F5240708BCF13B5384F14D0E3262ECDDA90BB,81EBCE2FFC29820351C086E9EDA6A220098FF41C,F28CB422A38A6BBA98DA3344DDF8D6FBC3413319,45521282C12E0EC1691495FCA714947DCA072745,214F7EE52D4EEABD8D82AFBE84DEF724BE70013F,531AB764AF24CB94A20019C152C8CA685F11DB11,71C48CE361D456D7D24CC02D37736F4868B3B881

cosmwasm/enclaves/shared/block-verifier/src/validator_whitelist.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
use std::collections::HashSet;
22
use tendermint_light_client_verifier::types::UntrustedBlockState;
33

4-
#[cfg(not(feature = "production"))]
5-
const WHITELIST_FROM_FILE: &str = include_str!("../fixtures/validator_whitelist.txt");
6-
#[cfg(feature = "production")]
7-
const WHITELIST_FROM_FILE: &str = include_str!("../fixtures/validator_whitelist_prod.txt");
8-
94
#[cfg(not(feature = "production"))]
105
pub const VALIDATOR_THRESHOLD: usize = 1;
116
#[cfg(not(feature = "production"))]
@@ -14,10 +9,18 @@ pub const VALIDATOR_THRESHOLD_EMERGENCY: usize = 2;
149
#[cfg(feature = "production")]
1510
pub const VALIDATOR_THRESHOLD: usize = 5;
1611
#[cfg(feature = "production")]
17-
pub const VALIDATOR_THRESHOLD_EMERGENCY: usize = 25;
12+
pub const VALIDATOR_THRESHOLD_EMERGENCY: usize = 11;
13+
14+
#[cfg(not(feature = "production"))]
15+
lazy_static::lazy_static! {
16+
pub static ref VALIDATOR_WHITELIST: ValidatorList = ValidatorList::from_str("../fixtures/validator_whitelist.txt");
17+
pub static ref VALIDATOR_WHITELIST_EMERGENCY: ValidatorList = ValidatorList::from_str("../fixtures/validator_whitelist.txt");
18+
}
1819

20+
#[cfg(feature = "production")]
1921
lazy_static::lazy_static! {
20-
pub static ref VALIDATOR_WHITELIST: ValidatorList = ValidatorList::from_str(WHITELIST_FROM_FILE);
22+
pub static ref VALIDATOR_WHITELIST: ValidatorList = ValidatorList::from_str("../fixtures/validator_whitelist_prod.txt");
23+
pub static ref VALIDATOR_WHITELIST_EMERGENCY: ValidatorList = ValidatorList::from_str("../fixtures/validator_whitelist_emergency_prod.txt");
2124
}
2225

2326
#[derive(Debug, Clone)]

0 commit comments

Comments
 (0)