Skip to content
This repository was archived by the owner on Jul 4, 2022. It is now read-only.

Commit 27b815f

Browse files
Improve consortium permission: Added permissioned count (#128)
* Added a new function in the consortium-permission module that counts the number of claims made on a topic with a specific value. * Added a unit test for the new permissioned count function * Fixed bug for granted_permission_count() where the closure inside map isn't run. Updated the unit test accordingly. * minor clean up for the pr * minor formatting changes
1 parent 8e4cdcd commit 27b815f

File tree

3 files changed

+97
-23
lines changed

3 files changed

+97
-23
lines changed

prml/consortium-permission/src/lib.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ mod mock;
6262
#[cfg(test)]
6363
mod tests;
6464

65-
use frame_support::{decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get};
65+
use frame_support::{
66+
decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get,
67+
storage::{StorageMap, IterableStorageMap}
68+
};
6669
use frame_system::{ensure_root, ensure_signed};
6770
use sp_runtime::DispatchResult;
6871
use sp_std::prelude::*;
@@ -302,6 +305,15 @@ impl<T: Trait> Module<T> {
302305
}
303306
}
304307

308+
/// Counts the number of accounts that have been granted a specific permission.
309+
/// Takes a topic and value, iterate through all existing claims, and count the
310+
/// numbers of claims with matching topic and value.
311+
pub fn granted_permission_count(topic: &Topic, value: &Value) -> u32 {
312+
Claim::<T>::iter().filter(
313+
|((_holder, t), (_issuer, v))| t == topic && v == value
314+
).count() as u32
315+
}
316+
305317
/// Performs all storage changes to make a claim by an issuer on a topic about a holder.
306318
pub fn do_make_claim(
307319
issuer: &T::AccountId,

prml/consortium-permission/src/mock.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,18 @@ impl ExtBuilder {
164164
.unwrap()
165165
.into();
166166
t.execute_with(|| {
167-
for i in self.issuers.into_iter() {
168-
<crate::Issuers<Test>>::insert(i.0, i.1);
167+
if !self.genesis_topics.is_empty() {
168+
ConsortiumPermission::initialise_topics(&self.genesis_topics)
169169
}
170-
<crate::Topics>::put(&self.topics.0);
171170
for i in 0..self.topics.0.len() {
172-
<crate::TopicEnabled>::insert(&self.topics.0[i], self.topics.1[i]);
171+
let _ = ConsortiumPermission::insert_topic(&self.topics.0[i]);
172+
let _ = ConsortiumPermission::update_topic(&self.topics.0[i], self.topics.1[i]);
173173
}
174174
if !self.genesis_issuers.is_empty() {
175175
ConsortiumPermission::initialise_issuers(&self.genesis_issuers)
176176
}
177-
if !self.genesis_topics.is_empty() {
178-
ConsortiumPermission::initialise_topics(&self.genesis_topics)
177+
for i in self.issuers.into_iter() {
178+
<crate::Issuers<Test>>::insert(i.0, i.1);
179179
}
180180
});
181181
t

prml/consortium-permission/src/tests.rs

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ const ALICE: AccountId = 0;
2323
const BOB: AccountId = 1;
2424
const CHARLIE: AccountId = 2;
2525

26+
const PERMISSION_GRANTED: u8 = 0x01;
27+
2628
// Issuers
2729

2830
#[test]
@@ -410,7 +412,7 @@ fn claim_extrinsics_must_be_signed() {
410412
.execute_with(|| {
411413
let topic = String::from("access").into_bytes();
412414
assert_noop!(
413-
ConsortiumPermission::make_claim(Origin::NONE, CHARLIE, topic.clone(), vec![0x1]),
415+
ConsortiumPermission::make_claim(Origin::NONE, CHARLIE, topic.clone(), vec![PERMISSION_GRANTED]),
414416
BadOrigin
415417
);
416418
assert_noop!(
@@ -432,7 +434,7 @@ fn claim_cannot_be_made_by_unauthorized_issuer() {
432434
Origin::signed(BOB),
433435
CHARLIE,
434436
ACCESS_TOPIC.to_vec(),
435-
vec![0x1]
437+
vec![PERMISSION_GRANTED]
436438
),
437439
Error::<Test>::IssuerNotAuthorizedOnTopic
438440
);
@@ -441,7 +443,7 @@ fn claim_cannot_be_made_by_unauthorized_issuer() {
441443
Origin::signed(ALICE),
442444
CHARLIE,
443445
vec![1, 2, 3, 4, 5],
444-
vec![0x1]
446+
vec![PERMISSION_GRANTED]
445447
),
446448
Error::<Test>::IssuerNotAuthorizedOnTopic
447449
);
@@ -456,7 +458,7 @@ fn claim_cannot_be_made_by_non_existent_topics() {
456458
Origin::signed(ALICE),
457459
CHARLIE,
458460
String::from("fake-topic").into_bytes(),
459-
vec![0x1]
461+
vec![PERMISSION_GRANTED]
460462
),
461463
Error::<Test>::IssuerNotAuthorizedOnTopic
462464
);
@@ -475,7 +477,7 @@ fn claim_cannot_be_made_by_disabled_topics() {
475477
Origin::signed(ALICE),
476478
CHARLIE,
477479
String::from("disabled-topic").into_bytes(),
478-
vec![0x1]
480+
vec![PERMISSION_GRANTED]
479481
),
480482
Error::<Test>::DisabledTopic
481483
);
@@ -494,11 +496,11 @@ fn make_simple_claim() {
494496
Origin::signed(ALICE),
495497
CHARLIE,
496498
topic.clone(),
497-
vec![0x1]
499+
vec![PERMISSION_GRANTED]
498500
));
499501
assert_eq!(
500502
ConsortiumPermission::claim((CHARLIE, &topic)),
501-
(ALICE, vec![0x1])
503+
(ALICE, vec![PERMISSION_GRANTED])
502504
);
503505
assert_eq!(
504506
ConsortiumPermission::issuer_claims(ALICE),
@@ -515,7 +517,7 @@ fn make_simple_claim() {
515517
ALICE,
516518
CHARLIE,
517519
topic,
518-
vec![0x1]
520+
vec![PERMISSION_GRANTED]
519521
))
520522
);
521523
});
@@ -536,7 +538,7 @@ fn reissue_simple_claim() {
536538
Origin::signed(ALICE),
537539
CHARLIE,
538540
topic.clone(),
539-
vec![0x1]
541+
vec![PERMISSION_GRANTED]
540542
));
541543
// Reissue
542544
assert_ok!(ConsortiumPermission::make_claim(
@@ -583,7 +585,7 @@ fn claim_value_is_too_damn_long() {
583585
Origin::signed(ALICE),
584586
CHARLIE,
585587
String::from("access").into_bytes(),
586-
vec![0x1; <mock::Test as Trait>::MaximumValueSize::get() + 1]
588+
vec![PERMISSION_GRANTED; <mock::Test as Trait>::MaximumValueSize::get() + 1]
587589
),
588590
Error::<Test>::ValueExceedsAllowableSize
589591
);
@@ -601,7 +603,7 @@ fn claim_value_is_just_right() {
601603
Origin::signed(ALICE),
602604
CHARLIE,
603605
String::from("access").into_bytes(),
604-
vec![0x1; <mock::Test as Trait>::MaximumValueSize::get()]
606+
vec![PERMISSION_GRANTED; <mock::Test as Trait>::MaximumValueSize::get()]
605607
));
606608
});
607609
}
@@ -635,7 +637,7 @@ fn claim_revocation_fails_with_unauthorized_issuer() {
635637
Origin::signed(ALICE),
636638
CHARLIE,
637639
String::from("access").into_bytes(),
638-
vec![0x1]
640+
vec![PERMISSION_GRANTED]
639641
));
640642
assert_noop!(
641643
ConsortiumPermission::revoke_claim(
@@ -660,7 +662,7 @@ fn revoke_simple_claim() {
660662
Origin::signed(ALICE),
661663
CHARLIE,
662664
topic.clone(),
663-
vec![0x1]
665+
vec![PERMISSION_GRANTED]
664666
));
665667
assert_ok!(ConsortiumPermission::revoke_claim(
666668
Origin::signed(ALICE),
@@ -700,7 +702,7 @@ fn revoke_someone_elses_claim() {
700702
Origin::signed(ALICE),
701703
CHARLIE,
702704
topic.clone(),
703-
vec![0x1]
705+
vec![PERMISSION_GRANTED]
704706
));
705707
assert_ok!(ConsortiumPermission::revoke_claim(
706708
Origin::signed(BOB),
@@ -737,7 +739,7 @@ fn sudo_claim_revocation_fails_without_sudo() {
737739
Origin::signed(ALICE),
738740
CHARLIE,
739741
String::from("access").into_bytes(),
740-
vec![0x1]
742+
vec![PERMISSION_GRANTED]
741743
));
742744
assert_noop!(
743745
ConsortiumPermission::sudo_revoke_claim(
@@ -780,7 +782,7 @@ fn sudo_revoke_a_claim() {
780782
Origin::signed(ALICE),
781783
CHARLIE,
782784
topic.clone(),
783-
vec![0x1]
785+
vec![PERMISSION_GRANTED]
784786
));
785787
assert_ok!(ConsortiumPermission::sudo_revoke_claim(
786788
Origin::ROOT,
@@ -1000,3 +1002,63 @@ fn disable_topic_emits_events() {
10001002
);
10011003
});
10021004
}
1005+
1006+
1007+
#[test]
1008+
fn can_count_permissioned_accounts() {
1009+
ExtBuilder::default()
1010+
.topic(b"access", true)
1011+
.topic(b"can_mint_burn", true)
1012+
.build()
1013+
.execute_with(|| {
1014+
let topic = String::from("can_mint_burn").into_bytes();
1015+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, ALICE, ACCESS_TOPIC.to_vec()));
1016+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
1017+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, CHARLIE, ACCESS_TOPIC.to_vec()));
1018+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, ALICE, topic.clone()));
1019+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, topic.clone()));
1020+
1021+
// Since "access" is automatically granted to its issuers,
1022+
// 3 people should have the "access" permission
1023+
assert_eq!(
1024+
ConsortiumPermission::granted_permission_count(
1025+
&ACCESS_TOPIC.to_vec(),
1026+
&vec![PERMISSION_GRANTED]
1027+
), 3);
1028+
1029+
1030+
assert_ok!(ConsortiumPermission::make_claim(
1031+
Origin::signed(ALICE),
1032+
ALICE,
1033+
topic.clone(),
1034+
vec![PERMISSION_GRANTED]
1035+
));
1036+
assert_ok!(ConsortiumPermission::make_claim(
1037+
Origin::signed(ALICE),
1038+
CHARLIE,
1039+
topic.clone(),
1040+
vec![PERMISSION_GRANTED]
1041+
));
1042+
1043+
assert_eq!(
1044+
ConsortiumPermission::granted_permission_count(
1045+
&topic.clone(),
1046+
&vec![PERMISSION_GRANTED]
1047+
), 2);
1048+
1049+
// This should replace the claim with a different issuer, the total count should
1050+
// stay unchanged.
1051+
assert_ok!(ConsortiumPermission::make_claim(
1052+
Origin::signed(BOB),
1053+
CHARLIE,
1054+
topic.clone(),
1055+
vec![PERMISSION_GRANTED]
1056+
));
1057+
assert_eq!(
1058+
ConsortiumPermission::granted_permission_count(
1059+
&topic.clone(),
1060+
&vec![PERMISSION_GRANTED]
1061+
), 2);
1062+
});
1063+
}
1064+

0 commit comments

Comments
 (0)