Skip to content

Commit c70e94b

Browse files
fix(drive): ignore time based update fields in proof verification of data contract updates (#2634)
1 parent eacc5f8 commit c70e94b

File tree

3 files changed

+29
-2
lines changed
  • packages
    • rs-dpp/src/data_contract/serialized_version
    • rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update
    • rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0

3 files changed

+29
-2
lines changed

packages/rs-dpp/src/data_contract/serialized_version/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ impl DataContractInSerializationFormat {
130130
&& v1_self.document_schemas == v1_other.document_schemas
131131
&& v1_self.groups == v1_other.groups
132132
&& v1_self.tokens == v1_other.tokens
133+
&& v1_self.keywords == v1_other.keywords
134+
&& v1_self.description == v1_other.description
133135
}
134136
// Cross-version comparisons return false
135137
(

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,8 @@ mod tests {
12271227
use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
12281228
use dpp::data_contract::change_control_rules::ChangeControlRules;
12291229
use dpp::data_contract::change_control_rules::v0::ChangeControlRulesV0;
1230+
use dpp::state_transition::proof_result::StateTransitionProofResult;
1231+
use drive::drive::Drive;
12301232

12311233
#[test]
12321234
fn test_data_contract_update_can_add_new_token() {
@@ -1288,7 +1290,7 @@ mod tests {
12881290

12891291
let data_contract_update_transition =
12901292
DataContractUpdateTransition::new_from_data_contract(
1291-
updated_data_contract,
1293+
updated_data_contract.clone(),
12921294
&identity.into_partial_identity_info(),
12931295
key.id(),
12941296
2,
@@ -1328,6 +1330,27 @@ mod tests {
13281330
.commit_transaction(transaction)
13291331
.unwrap()
13301332
.expect("expected to commit transaction");
1333+
1334+
// Prove & verify
1335+
let proof = platform
1336+
.drive
1337+
.prove_state_transition(&data_contract_update_transition, None, platform_version)
1338+
.expect("expect to prove state transition");
1339+
let (_root_hash, result) = Drive::verify_state_transition_was_executed_with_proof(
1340+
&data_contract_update_transition,
1341+
&BlockInfo::default(),
1342+
proof.data.as_ref().expect("expected data"),
1343+
&|_| Ok(None),
1344+
platform_version,
1345+
)
1346+
.unwrap_or_else(|e| {
1347+
panic!(
1348+
"expect to verify state transition proof {}, error is {}",
1349+
hex::encode(proof.data.expect("expected data")),
1350+
e
1351+
)
1352+
});
1353+
assert_matches!(result, StateTransitionProofResult::VerifiedDataContract(_));
13311354
}
13321355

13331356
#[test]

packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ impl Drive {
103103
let contract_for_serialization: DataContractInSerializationFormat = contract
104104
.clone()
105105
.try_into_platform_versioned(platform_version)?;
106-
if &contract_for_serialization != data_contract_update.data_contract() {
106+
if !contract_for_serialization
107+
.eq_without_auto_fields(data_contract_update.data_contract())
108+
{
107109
return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected contract after update with id {}", data_contract_update.data_contract().id()))));
108110
}
109111
Ok((root_hash, VerifiedDataContract(contract)))

0 commit comments

Comments
 (0)