Skip to content

Commit db052be

Browse files
bgalloisHugo Trentesaux
authored and
Hugo Trentesaux
committedNov 8, 2024
Fix 244 coherence between identity next_schedule and membership expire_on (nodes/rust/duniter-v2s!275)
* add info about status * update metadata after autorevoke and deletion period change * clippy * add comments * refactore identity chain spec * add coherence test * fix https://git.duniter.org/nodes/rust/duniter-v2s/-/issues/244
1 parent f7d5ad4 commit db052be

File tree

11 files changed

+142
-117
lines changed

11 files changed

+142
-117
lines changed
 

‎Cargo.lock

+38-33
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎live-tests/tests/sanity_gdev.rs

+45-5
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,10 @@ mod verifier {
373373
names: &HashMap<IdtyIndex, IdtyName>,
374374
) {
375375
for (idty_index, idty_value) in identities {
376-
// Rule 1: each Status::Member should have a membership and a name.
376+
// Rule 1: each Status::Member
377+
// should have a membership and a name
378+
// membership should be set to expire
379+
// identity should have no scheduled action
377380
if let IdtyStatus::Member = idty_value.status {
378381
self.assert(
379382
memberships.get(idty_index).is_some(),
@@ -383,9 +386,23 @@ mod verifier {
383386
names.get(idty_index).is_some(),
384387
format!("identity number {idty_index} should have a name"),
385388
);
389+
self.assert(
390+
memberships.get(idty_index).unwrap().expire_on != 0,
391+
format!(
392+
"Member identity number {idty_index} should have a non-null expire_on value"
393+
),
394+
);
395+
self.assert(
396+
identities.get(idty_index).unwrap().next_scheduled == 0,
397+
format!(
398+
"Member identity number {idty_index} should have a null next_scheduled value"
399+
),
400+
);
386401
}
387402

388-
// Rule 2: each Status::NotMember should have a name but no membership.
403+
// Rule 2: each Status::NotMember
404+
// should have a name but no membership
405+
// should have a scheduled action (auto-revocation)
389406
if let IdtyStatus::NotMember = idty_value.status {
390407
self.assert(
391408
memberships.get(idty_index).is_none(),
@@ -395,9 +412,16 @@ mod verifier {
395412
names.get(idty_index).is_some(),
396413
format!("identity number {idty_index} should have a name"),
397414
);
415+
self.assert(
416+
identities.get(idty_index).unwrap().next_scheduled != 0,
417+
format!("NotMember identity number {idty_index} should have a non-null next_scheduled value"),
418+
);
398419
}
399420

400-
// Rule 3: each Status::Revoke should should have a name but no membership.
421+
// Rule 3: each Status::Revoked
422+
// should should have a name
423+
// no membership
424+
// should be scheduled for removal
401425
if let IdtyStatus::Revoked = idty_value.status {
402426
self.assert(
403427
memberships.get(idty_index).is_none(),
@@ -407,9 +431,15 @@ mod verifier {
407431
names.get(idty_index).is_some(),
408432
format!("identity number {idty_index} should have a name"),
409433
);
434+
self.assert(
435+
identities.get(idty_index).unwrap().next_scheduled != 0,
436+
format!("Revoked identity number {idty_index} should have a non-null next_scheduled value"),
437+
);
410438
}
411439

412-
// Rule 4: each Status::Unvalidaded should have a name but no membership.
440+
// Rule 4: each Status::Unvalidaded
441+
// should have a name but no membership.
442+
// should be scheduled for removal
413443
if let IdtyStatus::Unvalidated = idty_value.status {
414444
self.assert(
415445
memberships.get(idty_index).is_none(),
@@ -419,9 +449,15 @@ mod verifier {
419449
names.get(idty_index).is_some(),
420450
format!("identity number {idty_index} should have a name"),
421451
);
452+
self.assert(
453+
identities.get(idty_index).unwrap().next_scheduled != 0,
454+
format!("Unvalidated identity number {idty_index} should have a non-null next_scheduled value"),
455+
);
422456
}
423457

424-
// Rule 5: each Status::Unconfirmed should not have a name neither a membership.
458+
// Rule 5: each Status::Unconfirmed
459+
// should not have a name neither a membership.
460+
// should be scheduled for removal soon
425461
if let IdtyStatus::Unconfirmed = idty_value.status {
426462
self.assert(
427463
memberships.get(idty_index).is_none(),
@@ -431,6 +467,10 @@ mod verifier {
431467
names.get(idty_index).is_none(),
432468
format!("identity number {idty_index} should not have a name"),
433469
);
470+
self.assert(
471+
identities.get(idty_index).unwrap().next_scheduled != 0,
472+
format!("Unconfirmed identity number {idty_index} should have a non-null next_scheduled value"),
473+
);
434474
}
435475
}
436476
}

‎node/src/chain_spec/g1.rs

+6-14
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ use super::*;
1818
use crate::chain_spec::gen_genesis_data::{
1919
AuthorityKeys, CommonParameters, GenesisIdentity, SessionKeysProvider,
2020
};
21-
use common_runtime::{constants::*, entities::IdtyData, GenesisIdty, IdtyStatus};
21+
use common_runtime::{constants::*, entities::IdtyData, GenesisIdty};
2222
use g1_runtime::{
23-
opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, WASM_BINARY,
23+
opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, RuntimeGenesisConfig,
24+
WASM_BINARY,
2425
};
2526
use sc_service::ChainType;
2627
use serde::Deserialize;
@@ -73,6 +74,7 @@ fn get_parameters(_parameters_from_file: &Option<GenesisParameters>) -> CommonPa
7374
identity_change_owner_key_period: parameters::ChangeOwnerKeyPeriod::get(),
7475
identity_idty_creation_period: parameters::IdtyCreationPeriod::get(),
7576
identity_autorevocation_period: parameters::AutorevocationPeriod::get(),
77+
identity_deletion_period: parameters::DeletionPeriod::get(),
7678
membership_membership_period: parameters::MembershipPeriod::get(),
7779
membership_membership_renewal_period: parameters::MembershipRenewalPeriod::get(),
7880
cert_max_by_issuer: parameters::MaxByIssuer::get(),
@@ -191,8 +193,7 @@ fn genesis_data_to_g1_genesis_conf(
191193
name,
192194
owner_key,
193195
status,
194-
expires_on,
195-
revokes_on,
196+
next_scheduled,
196197
}| GenesisIdty {
197198
index: idty_index,
198199
name: common_runtime::IdtyName::from(name.as_str()),
@@ -201,16 +202,7 @@ fn genesis_data_to_g1_genesis_conf(
201202
next_creatable_identity_on: 0,
202203
old_owner_key: None,
203204
owner_key,
204-
next_scheduled: match status {
205-
IdtyStatus::Unconfirmed | IdtyStatus::Unvalidated => {
206-
panic!("Unconfirmed or Unvalidated identity in genesis")
207-
}
208-
IdtyStatus::Member => expires_on.expect("must have expires_on set"),
209-
IdtyStatus::Revoked => 0,
210-
IdtyStatus::NotMember => {
211-
revokes_on.expect("must have revokes_on set")
212-
}
213-
},
205+
next_scheduled,
214206
status,
215207
},
216208
},

0 commit comments

Comments
 (0)
Please sign in to comment.