Skip to content

Commit 9032b11

Browse files
feat(platform): get identities by non-unique public key hashes (#2507)
Co-authored-by: Lukasz Klimek <[email protected]>
1 parent 5460f4d commit 9032b11

File tree

62 files changed

+1463
-113
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+1463
-113
lines changed

Cargo.lock

Lines changed: 0 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/dapi-grpc/build.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig {
7373
// Derive features for versioned messages
7474
//
7575
// "GetConsensusParamsRequest" is excluded as this message does not support proofs
76-
const VERSIONED_REQUESTS: [&str; 40] = [
76+
const VERSIONED_REQUESTS: [&str; 41] = [
7777
"GetDataContractHistoryRequest",
7878
"GetDataContractRequest",
7979
"GetDataContractsRequest",
@@ -85,6 +85,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig {
8585
"GetIdentityContractNonceRequest",
8686
"GetIdentityBalanceAndRevisionRequest",
8787
"GetIdentityBalanceRequest",
88+
"GetIdentityByNonUniquePublicKeyHashRequest",
8889
"GetIdentityByPublicKeyHashRequest",
8990
"GetIdentityKeysRequest",
9091
"GetIdentityRequest",
@@ -120,6 +121,9 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig {
120121
// - "GetConsensusParamsResponse"
121122
// - "GetStatusResponse"
122123
//
124+
// The following responses are excluded as they need custom proof handling:
125+
// - "GetIdentityByNonUniquePublicKeyHashResponse"
126+
//
123127
// "GetEvonodesProposedEpochBlocksResponse" is used for 2 Requests
124128
const VERSIONED_RESPONSES: [&str; 39] = [
125129
"GetDataContractHistoryResponse",

packages/dapi-grpc/protos/platform/v0/platform.proto

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ service Platform {
3737
rpc getDocuments(GetDocumentsRequest) returns (GetDocumentsResponse);
3838
rpc getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest)
3939
returns (GetIdentityByPublicKeyHashResponse);
40+
rpc getIdentityByNonUniquePublicKeyHash(GetIdentityByNonUniquePublicKeyHashRequest)
41+
returns (GetIdentityByNonUniquePublicKeyHashResponse);
4042
rpc waitForStateTransitionResult(WaitForStateTransitionResultRequest)
4143
returns (WaitForStateTransitionResultResponse);
4244
rpc getConsensusParams(GetConsensusParamsRequest)
@@ -592,6 +594,35 @@ message GetIdentityByPublicKeyHashResponse {
592594
oneof version { GetIdentityByPublicKeyHashResponseV0 v0 = 1; }
593595
}
594596

597+
message GetIdentityByNonUniquePublicKeyHashRequest {
598+
message GetIdentityByNonUniquePublicKeyHashRequestV0 {
599+
bytes public_key_hash = 1;
600+
optional bytes start_after = 2; // Give one result after a previous result
601+
bool prove = 3;
602+
}
603+
oneof version { GetIdentityByNonUniquePublicKeyHashRequestV0 v0 = 1; }
604+
}
605+
606+
message GetIdentityByNonUniquePublicKeyHashResponse {
607+
message GetIdentityByNonUniquePublicKeyHashResponseV0 {
608+
message IdentityResponse {
609+
optional bytes identity = 1;
610+
}
611+
612+
message IdentityProvedResponse {
613+
Proof grovedb_identity_public_key_hash_proof = 1;
614+
optional bytes identity_proof_bytes = 2; // A hack, we return 2 proofs
615+
}
616+
oneof result {
617+
IdentityResponse identity = 1;
618+
IdentityProvedResponse proof = 2;
619+
}
620+
621+
ResponseMetadata metadata = 3; // Metadata about the blockchain state
622+
}
623+
oneof version { GetIdentityByNonUniquePublicKeyHashResponseV0 v0 = 1; }
624+
}
625+
595626
message WaitForStateTransitionResultRequest {
596627
message WaitForStateTransitionResultRequestV0 {
597628
bytes state_transition_hash =

packages/rs-dapi-client/src/transport/grpc.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,15 @@ impl_transport_request_grpc!(
490490
get_status
491491
);
492492

493+
// rpc getIdentityByNonUniquePublicKeyHash(GetIdentityByNonUniquePublicKeyHashRequest) returns (GetIdentityByNonUniquePublicKeyHashResponse);
494+
impl_transport_request_grpc!(
495+
platform_proto::GetIdentityByNonUniquePublicKeyHashRequest,
496+
platform_proto::GetIdentityByNonUniquePublicKeyHashResponse,
497+
PlatformGrpcClient,
498+
RequestSettings::default(),
499+
get_identity_by_non_unique_public_key_hash
500+
);
501+
493502
// rpc getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse);
494503
impl_transport_request_grpc!(
495504
platform_proto::GetIdentityTokenBalancesRequest,

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::state_transition::StateTransition;
3232
use crate::tokens::emergency_action::TokenEmergencyAction;
3333
#[cfg(feature = "state-transition-signing")]
3434
use crate::tokens::token_payment_info::TokenPaymentInfo;
35+
#[cfg(feature = "state-transition-signing")]
3536
use crate::tokens::token_pricing_schedule::TokenPricingSchedule;
3637
#[cfg(feature = "state-transition-signing")]
3738
use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote};

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::state_transition::batch_transition::accessors::DocumentsBatchTransiti
1919
use crate::state_transition::StateTransition;
2020
#[cfg(feature = "state-transition-signing")]
2121
use crate::tokens::emergency_action::TokenEmergencyAction;
22+
#[cfg(feature = "state-transition-signing")]
2223
use crate::tokens::token_pricing_schedule::TokenPricingSchedule;
2324
#[cfg(feature = "state-transition-signing")]
2425
use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote};

packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v1_methods.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1+
#[cfg(feature = "state-transition-signing")]
12
use crate::fee::Credits;
23
#[cfg(feature = "state-transition-signing")]
34
use crate::identity::signer::Signer;
45
#[cfg(feature = "state-transition-signing")]
56
use crate::identity::SecurityLevel;
7+
#[cfg(feature = "state-transition-signing")]
68
use crate::prelude::IdentityNonce;
79
#[cfg(feature = "state-transition-signing")]
810
use crate::prelude::IdentityPublicKey;
911
#[cfg(feature = "state-transition-signing")]
1012
use crate::prelude::UserFeeIncrease;
13+
#[cfg(feature = "state-transition-signing")]
1114
use crate::state_transition::batch_transition::batched_transition::BatchedTransition;
12-
use crate::state_transition::batch_transition::{BatchTransitionV1, TokenDirectPurchaseTransition, TokenSetPriceForDirectPurchaseTransition};
15+
use crate::state_transition::batch_transition::BatchTransitionV1;
16+
#[cfg(feature = "state-transition-signing")]
17+
use crate::state_transition::batch_transition::{TokenDirectPurchaseTransition, TokenSetPriceForDirectPurchaseTransition};
1318
#[cfg(feature = "state-transition-signing")]
1419
use crate::state_transition::batch_transition::{TokenClaimTransition, TokenBurnTransition, TokenConfigUpdateTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, TokenFreezeTransition, TokenMintTransition, TokenTransferTransition, TokenUnfreezeTransition};
1520
#[cfg(feature = "state-transition-signing")]
1621
use crate::state_transition::batch_transition::BatchTransition;
1722
#[cfg(feature = "state-transition-signing")]
1823
use crate::state_transition::StateTransition;
24+
#[cfg(feature = "state-transition-signing")]
1925
use crate::ProtocolError;
2026
#[cfg(feature = "state-transition-signing")]
2127
use platform_value::Identifier;
@@ -48,13 +54,15 @@ use crate::state_transition::batch_transition::token_claim_transition::TokenClai
4854
use crate::state_transition::batch_transition::token_config_update_transition::TokenConfigUpdateTransitionV0;
4955
#[cfg(feature = "state-transition-signing")]
5056
use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransitionV0;
57+
#[cfg(feature = "state-transition-signing")]
5158
use crate::state_transition::batch_transition::token_direct_purchase_transition::TokenDirectPurchaseTransitionV0;
5259
#[cfg(feature = "state-transition-signing")]
5360
use crate::state_transition::batch_transition::token_emergency_action_transition::TokenEmergencyActionTransitionV0;
5461
#[cfg(feature = "state-transition-signing")]
5562
use crate::state_transition::batch_transition::token_freeze_transition::TokenFreezeTransitionV0;
5663
#[cfg(feature = "state-transition-signing")]
5764
use crate::state_transition::batch_transition::token_mint_transition::TokenMintTransitionV0;
65+
#[cfg(feature = "state-transition-signing")]
5866
use crate::state_transition::batch_transition::token_set_price_for_direct_purchase_transition::TokenSetPriceForDirectPurchaseTransitionV0;
5967
#[cfg(feature = "state-transition-signing")]
6068
use crate::state_transition::batch_transition::token_transfer_transition::TokenTransferTransitionV0;
@@ -64,6 +72,7 @@ use crate::state_transition::batch_transition::token_unfreeze_transition::TokenU
6472
use crate::tokens::emergency_action::TokenEmergencyAction;
6573
#[cfg(feature = "state-transition-signing")]
6674
use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote};
75+
#[cfg(feature = "state-transition-signing")]
6776
use crate::tokens::token_pricing_schedule::TokenPricingSchedule;
6877

6978
impl DocumentsBatchTransitionMethodsV1 for BatchTransitionV1 {

packages/rs-drive-abci/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ assert_matches = "1.5.0"
103103
drive-abci = { path = ".", features = ["testing-config", "mocks"] }
104104
bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" }
105105
mockall = { version = "0.13" }
106+
106107
# For tests of grovedb verify
107108
rocksdb = { version = "0.23.0" }
108109
integer-encoding = { version = "4.0.0" }
109-
serial_test = { version = "3.2.0" }
110110

111111
[features]
112112
default = []

packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/test/tokens.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,20 @@ impl<C> Platform<C> {
153153
transaction: TransactionArg,
154154
platform_version: &PlatformVersion,
155155
) -> Result<(), Error> {
156+
let mut rng = StdRng::seed_from_u64(0u64);
157+
let non_unique_key =
158+
IdentityPublicKey::random_voting_key_with_rng(11, &mut rng, platform_version)?;
159+
156160
for id in [IDENTITY_ID_1, IDENTITY_ID_2, IDENTITY_ID_3] {
157161
// Create identity without keys
158162
let mut identity = Identity::create_basic_identity(id, platform_version)?;
159163

160164
// Generate keys
161165
let seed = id.to_buffer()[0];
162166
let mut rng = StdRng::seed_from_u64(seed as u64);
163-
let keys = IdentityPublicKey::main_keys_with_random_authentication_keys_with_private_keys_with_rng(3, &mut rng, platform_version)?;
167+
let mut keys = IdentityPublicKey::main_keys_with_random_authentication_keys_with_private_keys_with_rng(3, &mut rng, platform_version)?;
168+
// every identity has the same non-unique key
169+
keys.push(non_unique_key.clone());
164170

165171
for (key, private_key) in keys.iter() {
166172
let private_key = hex::encode(private_key);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
use crate::error::query::QueryError;
2+
use crate::error::Error;
3+
use crate::platform_types::platform::Platform;
4+
use crate::platform_types::platform_state::PlatformState;
5+
use crate::query::QueryValidationResult;
6+
use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_request::Version as RequestVersion;
7+
use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_response::Version as ResponseVersion;
8+
use dapi_grpc::platform::v0::{
9+
GetIdentityByNonUniquePublicKeyHashRequest, GetIdentityByNonUniquePublicKeyHashResponse,
10+
};
11+
use dpp::version::PlatformVersion;
12+
13+
mod v0;
14+
15+
impl<C> Platform<C> {
16+
/// Querying of an identity by a public key hash
17+
pub fn query_identity_by_non_unique_public_key_hash(
18+
&self,
19+
GetIdentityByNonUniquePublicKeyHashRequest { version }: GetIdentityByNonUniquePublicKeyHashRequest,
20+
platform_state: &PlatformState,
21+
platform_version: &PlatformVersion,
22+
) -> Result<QueryValidationResult<GetIdentityByNonUniquePublicKeyHashResponse>, Error> {
23+
let Some(version) = version else {
24+
return Ok(QueryValidationResult::new_with_error(
25+
QueryError::DecodingError(
26+
"could not decode identity by public key non unique hash query".to_string(),
27+
),
28+
));
29+
};
30+
31+
let feature_version_bounds = &platform_version
32+
.drive_abci
33+
.query
34+
.identity_based_queries
35+
.identity_by_non_unique_public_key_hash;
36+
37+
let feature_version = match &version {
38+
RequestVersion::V0(_) => 0,
39+
};
40+
41+
if !feature_version_bounds.check_version(feature_version) {
42+
return Ok(QueryValidationResult::new_with_error(
43+
QueryError::UnsupportedQueryVersion(
44+
"identity_by_non_unique_public_key_hash".to_string(),
45+
feature_version_bounds.min_version,
46+
feature_version_bounds.max_version,
47+
platform_version.protocol_version,
48+
feature_version,
49+
),
50+
));
51+
}
52+
53+
match version {
54+
RequestVersion::V0(request_v0) => {
55+
let request = self.query_identity_by_non_unique_public_key_hash_v0(
56+
request_v0,
57+
platform_state,
58+
platform_version,
59+
)?;
60+
61+
Ok(
62+
request.map(|response_v0| GetIdentityByNonUniquePublicKeyHashResponse {
63+
version: Some(ResponseVersion::V0(response_v0)),
64+
}),
65+
)
66+
}
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)