Skip to content

Commit c47aed4

Browse files
feat(drive-abci)!: remove unnecessary validation from check tx and re-check (#1647)
Co-authored-by: Ivan Shumkov <ivan@shumkov.ru>
1 parent ea27d6a commit c47aed4

File tree

33 files changed

+840
-144
lines changed

33 files changed

+840
-144
lines changed

packages/rs-dpp/src/identity/state_transition/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,11 @@ pub trait AssetLockProved {
1616
/// Get asset lock proof
1717
fn asset_lock_proof(&self) -> &AssetLockProof;
1818
}
19+
20+
/// Only state transitions funded with Asset Lock Transactions have Asset Lock Proofs
21+
pub trait OptionallyAssetLockProved {
22+
/// Returns asset lock proof if state transition implements it
23+
fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> {
24+
None
25+
}
26+
}

packages/rs-dpp/src/state_transition/mod.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ use crate::consensus::ConsensusError;
3636

3737
use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0;
3838
use crate::identity::signer::Signer;
39+
use crate::identity::state_transition::OptionallyAssetLockProved;
3940
use crate::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel};
41+
use crate::prelude::AssetLockProof;
4042
pub use state_transitions::*;
4143

4244
use crate::serialization::Signable;
@@ -243,16 +245,13 @@ pub enum StateTransition {
243245
IdentityCreditTransfer(IdentityCreditTransferTransition),
244246
}
245247

246-
impl StateTransition {
247-
/// This means we should transform into the action before validation of the structure
248-
pub fn requires_state_to_validate_structure(&self) -> bool {
249-
matches!(self, StateTransition::DocumentsBatch(_))
250-
}
251-
/// This means we should transform into the action before validation of the identity and signatures
252-
pub fn requires_state_to_validate_identity_and_signatures(&self) -> bool {
253-
matches!(self, StateTransition::DocumentsBatch(_))
248+
impl OptionallyAssetLockProved for StateTransition {
249+
fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> {
250+
call_method!(self, optional_asset_lock_proof)
254251
}
252+
}
255253

254+
impl StateTransition {
256255
pub fn is_identity_signed(&self) -> bool {
257256
!matches!(
258257
self,

packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use platform_versioning::PlatformVersioned;
2727
use serde::{Deserialize, Serialize};
2828

2929
use crate::data_contract::created_data_contract::CreatedDataContract;
30+
use crate::identity::state_transition::OptionallyAssetLockProved;
3031
pub use v0::*;
3132

3233
pub type DataContractCreateTransitionLatest = DataContractCreateTransitionV0;
@@ -146,6 +147,8 @@ impl DataContractCreateTransition {
146147
}
147148
}
148149

150+
impl OptionallyAssetLockProved for DataContractCreateTransition {}
151+
149152
#[cfg(test)]
150153
mod test {
151154
use crate::data_contract::conversion::json::DataContractJsonConversionMethodsV0;
@@ -155,7 +158,6 @@ mod test {
155158
use crate::data_contract::accessors::v0::DataContractV0Getters;
156159
use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0;
157160
use crate::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0;
158-
use crate::state_transition::state_transitions::common_fields::property_names;
159161
use crate::state_transition::traits::StateTransitionLike;
160162
use crate::state_transition::{StateTransitionType, StateTransitionValueConvert};
161163
use crate::tests::fixtures::get_data_contract_fixture;
@@ -185,7 +187,7 @@ mod test {
185187
),
186188
),
187189
(
188-
property_names::ENTROPY,
190+
ENTROPY,
189191
Value::Bytes32(created_data_contract.entropy_used().to_buffer()),
190192
),
191193
(

packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned};
2727

2828
use crate::data_contract::DataContract;
2929

30+
use crate::identity::state_transition::OptionallyAssetLockProved;
3031
pub use v0::*;
3132

3233
pub type DataContractUpdateTransitionLatest = DataContractUpdateTransitionV0;
@@ -99,6 +100,8 @@ impl StateTransitionFieldTypes for DataContractUpdateTransition {
99100
}
100101
}
101102

103+
impl OptionallyAssetLockProved for DataContractUpdateTransition {}
104+
102105
#[cfg(test)]
103106
mod test {
104107
use crate::data_contract::DataContract;

packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use crate::state_transition::data_contract_update_transition::{
4141

4242
use crate::state_transition::documents_batch_transition::fields::property_names;
4343

44+
use crate::identity::state_transition::OptionallyAssetLockProved;
4445
pub use v0::*;
4546

4647
#[derive(
@@ -593,3 +594,4 @@ pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> Secu
593594
// assert_eq!(hex::encode(expected_bytes), hex::encode(bytes));
594595
// }
595596
// }
597+
impl OptionallyAssetLockProved for DocumentsBatchTransition {}

packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
use crate::identity::state_transition::AssetLockProved;
1+
use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved};
22
use crate::prelude::AssetLockProof;
33
use crate::state_transition::identity_create_transition::IdentityCreateTransition;
44
use crate::ProtocolError;
55

6+
impl OptionallyAssetLockProved for IdentityCreateTransition {
7+
fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> {
8+
Some(self.asset_lock_proof())
9+
}
10+
}
11+
612
impl AssetLockProved for IdentityCreateTransition {
713
fn set_asset_lock_proof(
814
&mut self,

packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCr
1515
use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0Signable;
1616
use crate::state_transition::StateTransitionFieldTypes;
1717

18+
use crate::identity::state_transition::OptionallyAssetLockProved;
1819
use crate::ProtocolError;
1920
use bincode::{Decode, Encode};
2021
use derive_more::From;
@@ -71,6 +72,8 @@ impl IdentityCreditTransferTransition {
7172
}
7273
}
7374

75+
impl OptionallyAssetLockProved for IdentityCreditTransferTransition {}
76+
7477
impl StateTransitionFieldTypes for IdentityCreditTransferTransition {
7578
fn signature_property_paths() -> Vec<&'static str> {
7679
vec![SIGNATURE]

packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ mod version;
1515
use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0Signable;
1616
use crate::state_transition::StateTransitionFieldTypes;
1717

18+
use crate::identity::state_transition::OptionallyAssetLockProved;
1819
use crate::ProtocolError;
1920
use bincode::{Decode, Encode};
2021
use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT;
@@ -65,3 +66,5 @@ impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransition {
6566
vec![SIGNATURE, OUTPUT_SCRIPT]
6667
}
6768
}
69+
70+
impl OptionallyAssetLockProved for IdentityCreditWithdrawalTransition {}

packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
use crate::identity::state_transition::AssetLockProved;
1+
use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved};
22
use crate::prelude::AssetLockProof;
33
use crate::state_transition::identity_topup_transition::IdentityTopUpTransition;
44
use crate::ProtocolError;
55

6+
impl OptionallyAssetLockProved for IdentityTopUpTransition {
7+
fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> {
8+
Some(self.asset_lock_proof())
9+
}
10+
}
11+
612
impl AssetLockProved for IdentityTopUpTransition {
713
fn set_asset_lock_proof(
814
&mut self,

packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::state_transition::identity_update_transition::v0::IdentityUpdateTrans
1717
use crate::state_transition::StateTransitionFieldTypes;
1818
use fields::*;
1919

20+
use crate::identity::state_transition::OptionallyAssetLockProved;
2021
use crate::ProtocolError;
2122
use bincode::{Decode, Encode};
2223
use derive_more::From;
@@ -70,6 +71,8 @@ impl IdentityUpdateTransition {
7071
}
7172
}
7273

74+
impl OptionallyAssetLockProved for IdentityUpdateTransition {}
75+
7376
impl StateTransitionFieldTypes for IdentityUpdateTransition {
7477
fn binary_property_paths() -> Vec<&'static str> {
7578
vec![SIGNATURE, ADD_PUBLIC_KEYS_SIGNATURE]

packages/rs-drive-abci/src/abci/handler/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -753,8 +753,8 @@ where
753753
) -> Result<ResponseCheckTx, proto::ResponseException> {
754754
let _timer = crate::metrics::abci_request_duration("check_tx");
755755

756-
let RequestCheckTx { tx, .. } = request;
757-
match self.platform.check_tx(tx.as_slice()) {
756+
let RequestCheckTx { tx, r#type } = request;
757+
match self.platform.check_tx(tx.as_slice(), r#type.try_into()?) {
758758
Ok(validation_result) => {
759759
let platform_state = self.platform.state.read().unwrap();
760760
let platform_version = platform_state.current_platform_version()?;
@@ -774,7 +774,11 @@ where
774774

775775
let gas_wanted = validation_result
776776
.data
777-
.map(|fee_result| fee_result.total_base_fee())
777+
.map(|fee_result| {
778+
fee_result
779+
.map(|fee_result| fee_result.total_base_fee())
780+
.unwrap_or_default()
781+
})
778782
.unwrap_or_default();
779783

780784
Ok(ResponseCheckTx {

packages/rs-drive-abci/src/execution/check_tx/mod.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,52 @@ use crate::error::execution::ExecutionError;
22
use crate::error::Error;
33
use crate::platform_types::platform::Platform;
44

5+
use crate::abci::AbciError;
56
use crate::rpc::core::CoreRPCLike;
67
use dpp::consensus::ConsensusError;
78
use dpp::fee::fee_result::FeeResult;
89
use dpp::validation::ValidationResult;
910

1011
mod v0;
1112

13+
// @append_only
14+
#[repr(u8)]
15+
#[derive(Copy, Clone, Debug)]
16+
pub enum CheckTxLevel {
17+
FirstTimeCheck,
18+
Recheck,
19+
}
20+
21+
impl TryFrom<u8> for CheckTxLevel {
22+
type Error = Error;
23+
24+
fn try_from(value: u8) -> Result<Self, Self::Error> {
25+
match value {
26+
0 => Ok(CheckTxLevel::FirstTimeCheck),
27+
1 => Ok(CheckTxLevel::Recheck),
28+
value => Err(Error::Abci(AbciError::BadRequest(format!(
29+
"Invalid value for CheckTxLevel {}",
30+
value
31+
)))),
32+
}
33+
}
34+
}
35+
36+
impl TryFrom<i32> for CheckTxLevel {
37+
type Error = Error;
38+
39+
fn try_from(value: i32) -> Result<Self, Self::Error> {
40+
match value {
41+
0 => Ok(CheckTxLevel::FirstTimeCheck),
42+
1 => Ok(CheckTxLevel::Recheck),
43+
value => Err(Error::Abci(AbciError::BadRequest(format!(
44+
"Invalid value for CheckTxLevel {}",
45+
value
46+
)))),
47+
}
48+
}
49+
}
50+
1251
impl<C> Platform<C>
1352
where
1453
C: CoreRPCLike,
@@ -30,11 +69,12 @@ where
3069
pub fn check_tx(
3170
&self,
3271
raw_tx: &[u8],
33-
) -> Result<ValidationResult<FeeResult, ConsensusError>, Error> {
72+
check_tx_level: CheckTxLevel,
73+
) -> Result<ValidationResult<Option<FeeResult>, ConsensusError>, Error> {
3474
let state = self.state.read().expect("expected to get state");
3575
let platform_version = state.current_platform_version()?;
3676
match platform_version.drive_abci.methods.engine.check_tx {
37-
0 => self.check_tx_v0(raw_tx),
77+
0 => self.check_tx_v0(raw_tx, check_tx_level),
3878
version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch {
3979
method: "check_tx".to_string(),
4080
known_versions: vec![0],

0 commit comments

Comments
 (0)