Skip to content

Commit 88a57ab

Browse files
feat(platform): allow new tokens on contract update and refactor contract struct validations (#2542)
Co-authored-by: QuantumExplorer <[email protected]>
1 parent 2a854e6 commit 88a57ab

File tree

17 files changed

+1051
-468
lines changed

17 files changed

+1051
-468
lines changed

packages/rs-dpp/src/data_contract/methods/validate_update/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::block::block_info::BlockInfo;
12
use crate::prelude::DataContract;
23
use platform_version::version::PlatformVersion;
34

@@ -10,6 +11,7 @@ impl DataContractUpdateValidationMethodsV0 for DataContract {
1011
fn validate_update(
1112
&self,
1213
data_contract: &DataContract,
14+
block_info: &BlockInfo,
1315
platform_version: &PlatformVersion,
1416
) -> Result<SimpleConsensusValidationResult, ProtocolError> {
1517
match platform_version
@@ -18,7 +20,7 @@ impl DataContractUpdateValidationMethodsV0 for DataContract {
1820
.methods
1921
.validate_update
2022
{
21-
0 => self.validate_update_v0(data_contract, platform_version),
23+
0 => self.validate_update_v0(data_contract, block_info, platform_version),
2224
version => Err(ProtocolError::UnknownVersionMismatch {
2325
method: "DataContract::validate_update".to_string(),
2426
known_versions: vec![0],

packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs

Lines changed: 135 additions & 40 deletions
Large diffs are not rendered by default.

packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC
6464
}
6565

6666
// Only Data contract update does not have basic structure validation
67-
if state_transition.has_basic_structure_validation() {
67+
if state_transition.has_basic_structure_validation(platform_version) {
6868
// First we validate the basic structure
6969
let result = state_transition.validate_basic_structure(platform_version)?;
7070

packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ use drive::grovedb::TransactionArg;
2121
use drive::state_transition_action::StateTransitionAction;
2222
use std::collections::BTreeMap;
2323

24-
use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext};
24+
use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext;
2525
use crate::execution::validation::state_transition::common::validate_simple_pre_check_balance::ValidateSimplePreCheckBalance;
26-
use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature};
26+
use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::ValidateStateTransitionIdentitySignature;
2727
use crate::execution::validation::state_transition::identity_create::{StateTransitionStateValidationForIdentityCreateTransitionV0, StateTransitionStructureKnownInStateValidationForIdentityCreateTransitionV0};
2828
use crate::execution::validation::state_transition::identity_top_up::StateTransitionIdentityTopUpTransitionActionTransformer;
2929
use crate::execution::validation::state_transition::state_transitions::identity_update::advanced_structure::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0;
@@ -105,7 +105,7 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>(
105105
}
106106

107107
// Only Data contract state transitions and Masternode vote do not have basic structure validation
108-
if state_transition.has_basic_structure_validation() {
108+
if state_transition.has_basic_structure_validation(platform_version) {
109109
// We validate basic structure validation after verifying the identity,
110110
// this is structure validation that does not require state and is already checked on check_tx
111111
let consensus_result = state_transition.validate_basic_structure(platform_version)?;
@@ -333,7 +333,7 @@ pub(crate) trait StateTransitionBasicStructureValidationV0 {
333333

334334
/// True if the state transition has basic structure validation.
335335
/// Currently only data contract update does not
336-
fn has_basic_structure_validation(&self) -> bool {
336+
fn has_basic_structure_validation(&self, _platform_version: &PlatformVersion) -> bool {
337337
true
338338
}
339339
}
@@ -516,9 +516,7 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition {
516516
platform_version: &PlatformVersion,
517517
) -> Result<SimpleConsensusValidationResult, Error> {
518518
match self {
519-
StateTransition::DataContractCreate(_)
520-
| StateTransition::DataContractUpdate(_)
521-
| StateTransition::MasternodeVote(_) => {
519+
StateTransition::MasternodeVote(_) => {
522520
// no basic structure validation
523521
Ok(SimpleConsensusValidationResult::new())
524522
}
@@ -532,15 +530,66 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition {
532530
StateTransition::IdentityCreditTransfer(st) => {
533531
st.validate_basic_structure(platform_version)
534532
}
533+
StateTransition::DataContractCreate(st) => {
534+
if platform_version
535+
.drive_abci
536+
.validation_and_processing
537+
.state_transitions
538+
.contract_create_state_transition
539+
.basic_structure
540+
.is_some()
541+
{
542+
st.validate_basic_structure(platform_version)
543+
} else {
544+
Ok(SimpleConsensusValidationResult::new())
545+
}
546+
}
547+
StateTransition::DataContractUpdate(st) => {
548+
if platform_version
549+
.drive_abci
550+
.validation_and_processing
551+
.state_transitions
552+
.contract_update_state_transition
553+
.basic_structure
554+
.is_some()
555+
{
556+
st.validate_basic_structure(platform_version)
557+
} else {
558+
Ok(SimpleConsensusValidationResult::new())
559+
}
560+
}
535561
}
536562
}
537-
fn has_basic_structure_validation(&self) -> bool {
538-
!matches!(
539-
self,
540-
StateTransition::DataContractCreate(_)
541-
| StateTransition::DataContractUpdate(_)
542-
| StateTransition::MasternodeVote(_)
543-
)
563+
fn has_basic_structure_validation(&self, platform_version: &PlatformVersion) -> bool {
564+
match self {
565+
StateTransition::DataContractCreate(_) => {
566+
// Added in protocol version 9 (version 2.0)
567+
platform_version
568+
.drive_abci
569+
.validation_and_processing
570+
.state_transitions
571+
.contract_create_state_transition
572+
.basic_structure
573+
.is_some()
574+
}
575+
StateTransition::DataContractUpdate(_) => {
576+
// Added in protocol version 9 (version 2.0)
577+
platform_version
578+
.drive_abci
579+
.validation_and_processing
580+
.state_transitions
581+
.contract_update_state_transition
582+
.basic_structure
583+
.is_some()
584+
}
585+
StateTransition::Batch(_)
586+
| StateTransition::IdentityCreate(_)
587+
| StateTransition::IdentityTopUp(_)
588+
| StateTransition::IdentityCreditWithdrawal(_)
589+
| StateTransition::IdentityUpdate(_)
590+
| StateTransition::IdentityCreditTransfer(_) => true,
591+
StateTransition::MasternodeVote(_) => false,
592+
}
544593
}
545594
}
546595

Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub(crate) mod v0;
2+
pub(crate) mod v1;

0 commit comments

Comments
 (0)