Skip to content

Commit 07c820d

Browse files
outofxxx0xverin
andauthored
Refactor assertion jsonfile (#1400)
* add hash field to Proof * add CredentialFactory * add credential.json * update template * seperate vc proof * refactor A1 * update credential.json * refactor all assertions * remove a1~a11 json * make fmt & fix test * update ts-test * make clippy * refine codes * make fmt * using to_json * add credential_schema.json * update json * update hash * check vc json hash * update code * check vc * complete verify signature * update test workflow * make fmt * remove dup codes * update schema json * sign vc payload * add issuer attestation example --------- Co-authored-by: Verin1005 <[email protected]>
1 parent e48faf4 commit 07c820d

File tree

26 files changed

+491
-781
lines changed

26 files changed

+491
-781
lines changed

pallets/vc-management/src/tests.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn vc_issued_works() {
4242
1,
4343
VC_INDEX,
4444
VC_HASH,
45-
AesOutput::default()
45+
AesOutput::default(),
4646
));
4747
assert!(VCManagement::vc_registry(VC_INDEX).is_some());
4848
let context = VCManagement::vc_registry(VC_INDEX).unwrap();
@@ -60,7 +60,7 @@ fn vc_issued_with_unpriviledged_origin_fails() {
6060
1,
6161
H256::default(),
6262
H256::default(),
63-
AesOutput::default()
63+
AesOutput::default(),
6464
),
6565
sp_runtime::DispatchError::BadOrigin
6666
);
@@ -75,15 +75,15 @@ fn vc_issued_with_duplicated_index_fails() {
7575
1,
7676
VC_INDEX,
7777
VC_HASH,
78-
AesOutput::default()
78+
AesOutput::default(),
7979
));
8080
assert_noop!(
8181
VCManagement::vc_issued(
8282
RuntimeOrigin::signed(1),
8383
1,
8484
VC_INDEX,
8585
VC_HASH,
86-
AesOutput::default()
86+
AesOutput::default(),
8787
),
8888
Error::<Test>::VCAlreadyExists
8989
);
@@ -98,7 +98,7 @@ fn disable_vc_works() {
9898
2,
9999
VC_INDEX,
100100
VC_HASH,
101-
AesOutput::default()
101+
AesOutput::default(),
102102
));
103103
assert!(VCManagement::vc_registry(VC_INDEX).is_some());
104104
assert_ok!(VCManagement::disable_vc(RuntimeOrigin::signed(2), VC_INDEX));
@@ -127,7 +127,7 @@ fn disable_vc_with_other_subject_fails() {
127127
2,
128128
VC_INDEX,
129129
VC_HASH,
130-
AesOutput::default()
130+
AesOutput::default(),
131131
));
132132
assert_noop!(
133133
VCManagement::disable_vc(RuntimeOrigin::signed(1), VC_HASH),
@@ -146,7 +146,7 @@ fn revoke_vc_works() {
146146
2,
147147
VC_INDEX,
148148
VC_HASH,
149-
AesOutput::default()
149+
AesOutput::default(),
150150
));
151151
assert!(VCManagement::vc_registry(VC_INDEX).is_some());
152152
assert_ok!(VCManagement::revoke_vc(RuntimeOrigin::signed(2), VC_INDEX));
@@ -173,7 +173,7 @@ fn revoke_vc_with_other_subject_fails() {
173173
2,
174174
VC_INDEX,
175175
VC_HASH,
176-
AesOutput::default()
176+
AesOutput::default(),
177177
));
178178
assert_noop!(
179179
VCManagement::revoke_vc(RuntimeOrigin::signed(1), VC_HASH),

tee-worker/litentry/core/assertion-build/src/a1.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ use itp_types::AccountId;
2626
use itp_utils::stringify::account_id_to_string;
2727
use lc_credentials::Credential;
2828
use lc_stf_task_sender::MaxIdentityLength;
29-
use litentry_primitives::{Assertion, Identity, ParentchainBlockNumber, VCMPError};
29+
use litentry_primitives::{Identity, ParentchainBlockNumber, VCMPError};
3030
use log::*;
3131
use sp_runtime::BoundedVec;
3232

33+
const VC_SUBJECT_DESCRIPTION: &str = "Identity Linked And Verified";
34+
const VC_SUBJECT_TYPE: &str = "IdentityLinkedVerified";
35+
3336
pub fn build(
3437
identities: BoundedVec<Identity, MaxIdentityLength>,
3538
shard: &ShardIdentifier,
@@ -49,10 +52,15 @@ pub fn build(
4952
}
5053
}
5154

52-
match Credential::generate_unsigned_credential(&Assertion::A1, who, &shard.clone(), bn) {
55+
match Credential::new_default(who, &shard.clone(), bn) {
5356
Ok(mut credential_unsigned) => {
57+
// add subject info
58+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
59+
60+
// add assertion
5461
let flag = web2_cnt != 0 && web3_cnt != 0;
55-
credential_unsigned.credential_subject.values.push(flag);
62+
credential_unsigned.add_assertion_a1(flag);
63+
5664
Ok(credential_unsigned)
5765
},
5866
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a10.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ use lc_data_providers::graphql::{
2929
GraphQLClient, VerifiedCredentialsIsHodlerIn, VerifiedCredentialsNetwork,
3030
};
3131
use litentry_primitives::{
32-
Assertion, EvmNetwork, Identity, ParentchainBalance, ParentchainBlockNumber, VCMPError,
32+
EvmNetwork, Identity, ParentchainBalance, ParentchainBlockNumber, VCMPError,
3333
ASSERTION_FROM_DATE,
3434
};
3535
use log::*;
3636
use std::{str::from_utf8, string::ToString, vec, vec::Vec};
3737

3838
const WBTC_TOKEN_ADDRESS: &str = "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599";
39+
const VC_SUBJECT_DESCRIPTION: &str = "The user held Wrapped BTC every day from a specific date";
40+
const VC_SUBJECT_TYPE: &str = "BTC Hodler";
3941

4042
// WBTC holder
4143
pub fn build(
@@ -101,10 +103,11 @@ pub fn build(
101103
}
102104
}
103105

104-
let a10 = Assertion::A10(min_balance);
105-
match Credential::generate_unsigned_credential(&a10, who, &shard.clone(), bn) {
106+
match Credential::new_default(who, &shard.clone(), bn) {
106107
Ok(mut credential_unsigned) => {
108+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
107109
credential_unsigned.update_holder(from_date_index, min_balance);
110+
108111
return Ok(credential_unsigned)
109112
},
110113
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a11.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ use lc_data_providers::graphql::{
2929
GraphQLClient, VerifiedCredentialsIsHodlerIn, VerifiedCredentialsNetwork,
3030
};
3131
use litentry_primitives::{
32-
Assertion, EvmNetwork, Identity, ParentchainBalance, ParentchainBlockNumber,
33-
ASSERTION_FROM_DATE,
32+
EvmNetwork, Identity, ParentchainBalance, ParentchainBlockNumber, ASSERTION_FROM_DATE,
3433
};
3534
use log::*;
3635
use std::{
@@ -40,6 +39,9 @@ use std::{
4039
vec::Vec,
4140
};
4241

42+
const VC_SUBJECT_DESCRIPTION: &str = "The user held ETH before a specific date/year";
43+
const VC_SUBJECT_TYPE: &str = "ETH Hodler";
44+
4345
pub fn build(
4446
identities: Vec<Identity>,
4547
min_balance: ParentchainBalance,
@@ -103,10 +105,11 @@ pub fn build(
103105
}
104106
}
105107

106-
let a11 = Assertion::A11(min_balance);
107-
match Credential::generate_unsigned_credential(&a11, who, &shard.clone(), bn) {
108+
match Credential::new_default(who, &shard.clone(), bn) {
108109
Ok(mut credential_unsigned) => {
110+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
109111
credential_unsigned.update_holder(from_date_index, min_balance);
112+
110113
return Ok(credential_unsigned)
111114
},
112115
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a2.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@ use itp_utils::stringify::account_id_to_string;
2727
use lc_credentials::Credential;
2828
use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string};
2929
use litentry_primitives::{
30-
Assertion, Identity, ParameterString, ParentchainBlockNumber, VCMPError, Web2Network,
30+
Identity, ParameterString, ParentchainBlockNumber, VCMPError, Web2Network,
3131
};
3232
use log::*;
3333
use std::vec::Vec;
3434

35+
const VC_SUBJECT_DESCRIPTION: &str =
36+
"Becoming an ID-Hubber: if user has a Discord account verified and joined Litentry guild";
37+
const VC_SUBJECT_TYPE: &str = "ID-Hubber";
38+
3539
pub fn build(
3640
identities: Vec<Identity>,
3741
guild_id: ParameterString,
@@ -77,19 +81,12 @@ pub fn build(
7781
}
7882
}
7983

80-
match Credential::generate_unsigned_credential(
81-
&Assertion::A2(guild_id),
82-
who,
83-
&shard.clone(),
84-
bn,
85-
) {
84+
match Credential::new_default(who, &shard.clone(), bn) {
8685
Ok(mut credential_unsigned) => {
87-
if discord_cnt > 0 && has_joined {
88-
credential_unsigned.credential_subject.values.push(true);
89-
} else {
90-
credential_unsigned.credential_subject.values.push(false);
91-
}
92-
credential_unsigned.add_assertion_a2(guild_id_s);
86+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
87+
88+
let value = discord_cnt > 0 && has_joined;
89+
credential_unsigned.add_assertion_a2(value, guild_id_s);
9390
return Ok(credential_unsigned)
9491
},
9592
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a3.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@ use itp_utils::stringify::account_id_to_string;
2727
use lc_credentials::Credential;
2828
use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string};
2929
use litentry_primitives::{
30-
Assertion, Identity, ParameterString, ParentchainBlockNumber, VCMPError, Web2Network,
30+
Identity, ParameterString, ParentchainBlockNumber, VCMPError, Web2Network,
3131
};
3232
use log::*;
3333
use std::vec::Vec;
3434

35+
const VC_SUBJECT_DESCRIPTION: &str = "User has commented on Discord channel with ID-Hubber role";
36+
const VC_SUBJECT_TYPE: &str = "ID-Hubber";
37+
3538
pub fn build(
3639
identities: Vec<Identity>,
3740
guild_id: ParameterString,
@@ -73,19 +76,16 @@ pub fn build(
7376
}
7477
}
7578

76-
match Credential::generate_unsigned_credential(
77-
&Assertion::A3(guild_id, channel_id, role_id),
78-
who,
79-
&shard.clone(),
80-
bn,
81-
) {
79+
match Credential::new_default(who, &shard.clone(), bn) {
8280
Ok(mut credential_unsigned) => {
83-
if has_commented {
84-
credential_unsigned.credential_subject.values.push(true);
85-
} else {
86-
credential_unsigned.credential_subject.values.push(false);
87-
}
88-
credential_unsigned.add_assertion_a3(guild_id_s, channel_id_s, role_id_s);
81+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
82+
credential_unsigned.add_assertion_a3(
83+
has_commented,
84+
guild_id_s,
85+
channel_id_s,
86+
role_id_s,
87+
);
88+
8989
Ok(credential_unsigned)
9090
},
9191
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a4.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use lc_data_providers::graphql::{
2929
GraphQLClient, VerifiedCredentialsIsHodlerIn, VerifiedCredentialsNetwork,
3030
};
3131
use litentry_primitives::{
32-
Assertion, Identity, ParentchainBalance, ParentchainBlockNumber, ASSERTION_FROM_DATE,
32+
Identity, ParentchainBalance, ParentchainBlockNumber, ASSERTION_FROM_DATE,
3333
};
3434
use log::*;
3535
use std::{
@@ -41,6 +41,9 @@ use std::{
4141

4242
// ERC20 LIT token address
4343
const LIT_TOKEN_ADDRESS: &str = "0xb59490aB09A0f526Cc7305822aC65f2Ab12f9723";
44+
const VC_SUBJECT_DESCRIPTION: &str =
45+
"Check whether any of the linked accounts hold a minimum amount of LIT NOW";
46+
const VC_SUBJECT_TYPE: &str = "LIT Holder";
4447

4548
pub fn build(
4649
identities: Vec<Identity>,
@@ -139,10 +142,11 @@ pub fn build(
139142
}
140143
}
141144

142-
let a4 = Assertion::A4(min_balance);
143-
match Credential::generate_unsigned_credential(&a4, who, &shard.clone(), bn) {
145+
match Credential::new_default(who, &shard.clone(), bn) {
144146
Ok(mut credential_unsigned) => {
147+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
145148
credential_unsigned.update_holder(from_date_index, min_balance);
149+
146150
return Ok(credential_unsigned)
147151
},
148152
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a6.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ use itp_types::AccountId;
2626
use itp_utils::stringify::account_id_to_string;
2727
use lc_credentials::Credential;
2828
use lc_data_providers::twitter_official::TwitterOfficialClient;
29-
use litentry_primitives::{Assertion, Identity, ParentchainBlockNumber, VCMPError, Web2Network};
29+
use litentry_primitives::{Identity, ParentchainBlockNumber, VCMPError, Web2Network};
3030
use log::*;
3131
use std::vec::Vec;
3232

33+
const VC_SUBJECT_DESCRIPTION: &str = "User has at least X amount of followers";
34+
const VC_SUBJECT_TYPE: &str = "Total Twitter Followers";
35+
3336
/// Following ranges:
3437
///
3538
/// * 1+ follower
@@ -102,10 +105,11 @@ pub fn build(
102105
},
103106
}
104107

105-
match Credential::generate_unsigned_credential(&Assertion::A6, who, &shard.clone(), bn) {
108+
match Credential::new_default(who, &shard.clone(), bn) {
106109
Ok(mut credential_unsigned) => {
110+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
107111
credential_unsigned.add_assertion_a6(min, max);
108-
credential_unsigned.credential_subject.values.push(true);
112+
109113
return Ok(credential_unsigned)
110114
},
111115
Err(e) => {

tee-worker/litentry/core/assertion-build/src/a7.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ use lc_data_providers::graphql::{
2929
GraphQLClient, VerifiedCredentialsIsHodlerIn, VerifiedCredentialsNetwork,
3030
};
3131
use litentry_primitives::{
32-
Assertion, Identity, ParentchainBalance, ParentchainBlockNumber, SubstrateNetwork,
33-
ASSERTION_FROM_DATE,
32+
Identity, ParentchainBalance, ParentchainBlockNumber, SubstrateNetwork, ASSERTION_FROM_DATE,
3433
};
3534
use log::*;
3635
use std::{
@@ -40,6 +39,9 @@ use std::{
4039
vec::Vec,
4140
};
4241

42+
const VC_SUBJECT_DESCRIPTION: &str = "The user held DOT every day from a specific date";
43+
const VC_SUBJECT_TYPE: &str = "DOT Hodler";
44+
4345
pub fn build(
4446
identities: Vec<Identity>,
4547
min_balance: ParentchainBalance,
@@ -102,9 +104,9 @@ pub fn build(
102104
}
103105
}
104106

105-
let a7 = Assertion::A7(min_balance);
106-
match Credential::generate_unsigned_credential(&a7, who, &shard.clone(), bn) {
107+
match Credential::new_default(who, &shard.clone(), bn) {
107108
Ok(mut credential_unsigned) => {
109+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
108110
credential_unsigned.update_holder(from_date_index, min_balance);
109111
return Ok(credential_unsigned)
110112
},

tee-worker/litentry/core/assertion-build/src/a8.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ use lc_data_providers::graphql::{
3030
GraphQLClient, VerifiedCredentialsNetwork, VerifiedCredentialsTotalTxs,
3131
};
3232
use litentry_primitives::{
33-
Assertion, AssertionNetworks, EvmNetwork, Identity, ParentchainBlockNumber, SubstrateNetwork,
33+
AssertionNetworks, EvmNetwork, Identity, ParentchainBlockNumber, SubstrateNetwork,
3434
ASSERTION_NETWORKS,
3535
};
3636
use log::*;
3737
use std::{collections::HashSet, str::from_utf8, string::ToString, vec, vec::Vec};
3838

39+
const VC_SUBJECT_DESCRIPTION: &str = "User has over X number of transactions";
40+
const VC_SUBJECT_TYPE: &str = "Total EVM and Substrate Transactions";
41+
3942
lazy_static! {
4043
pub static ref NETWORK_HASHSET: HashSet<VerifiedCredentialsNetwork> = {
4144
let mut m = HashSet::new();
@@ -266,11 +269,11 @@ pub fn build(
266269
},
267270
}
268271

269-
let a8 = Assertion::A8(networks);
270-
match Credential::generate_unsigned_credential(&a8, who, &shard.clone(), bn) {
272+
match Credential::new_default(who, &shard.clone(), bn) {
271273
Ok(mut credential_unsigned) => {
274+
credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE);
272275
credential_unsigned.add_assertion_a8(vc_network_to_vec(target_networks?), min, max);
273-
credential_unsigned.credential_subject.values.push(true);
276+
274277
return Ok(credential_unsigned)
275278
},
276279
Err(e) => {

0 commit comments

Comments
 (0)