@@ -772,36 +772,18 @@ pub unsafe extern "C" fn ecall_onchain_approve_upgrade(
772
772
sgx_types:: sgx_status_t:: SGX_SUCCESS
773
773
}
774
774
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 ] > {
776
779
let mut json_data = String :: new ( ) ;
777
780
f_in. read_to_string ( & mut json_data) . unwrap ( ) ;
778
781
779
782
// Deserialize the JSON string into a HashMap<String, String>
780
783
let signatures: HashMap < String , ( String , String ) > =
781
784
serde_json:: from_str ( & json_data) . expect ( "Failed to deserialize JSON" ) ;
782
785
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 ( ) ;
805
787
806
788
for ( addr_str, ( pubkey_str, sig_str) ) in & signatures {
807
789
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
838
820
panic ! ( "Incorrect signature for address: {}" , addr_str) ;
839
821
}
840
822
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
+ }
844
827
845
- # [ cfg ( feature = "verify-validator-whitelist" ) ]
846
- let is_whitelisted = validator_whitelist :: VALIDATOR_WHITELIST . contains ( addr_str ) ;
828
+ signers
829
+ }
847
830
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
+ }
850
846
851
- approved_power += power;
852
- if is_whitelisted {
853
- approved_whitelisted += 1 ;
854
- }
847
+ res
848
+ }
855
849
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 ;
860
853
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
+ }
865
867
}
866
868
867
869
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
870
872
) ;
871
873
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" ) ;
875
876
return false ;
876
877
}
877
878
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
+ ) ;
888
888
return false ;
889
889
}
890
890
}
891
-
892
891
true
893
892
}
894
893
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
+
895
922
fn is_export_approved ( report : & sgx_report_body_t ) -> bool {
896
923
// Current policy: we demand the same mr_signer
897
924
0 commit comments