From 0ee8cc1674ee64fb471c679018085f5272824ae9 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 19 Jan 2024 04:00:52 +0700 Subject: [PATCH 1/7] chore: version system data contracts --- Cargo.lock | 96 +++++++++------- .../bench-suite/benchmarks/basicValidation.js | 2 +- .../bench-suite/benchmarks/documents/dpns.js | 2 +- packages/dashpay-contract/Cargo.toml | 2 + .../schema/{ => v0}/dashpay.schema.json | 0 packages/dashpay-contract/src/error.rs | 17 +++ packages/dashpay-contract/src/lib.rs | 40 ++++--- packages/dashpay-contract/src/v0/mod.rs | 19 ++++ .../dashpay-contract/test/unit/schema.spec.js | 2 +- packages/data-contracts/Cargo.toml | 2 + packages/data-contracts/src/error.rs | 104 ++++++++++++++++++ packages/data-contracts/src/lib.rs | 40 ++++--- packages/dpns-contract/Cargo.toml | 2 + .../{ => v0}/dpns-contract-documents.json | 0 packages/dpns-contract/src/error.rs | 17 +++ packages/dpns-contract/src/lib.rs | 47 ++++---- packages/dpns-contract/src/v0/mod.rs | 25 +++++ .../test/unit/dpnsContract.spec.js | 2 +- packages/feature-flags-contract/Cargo.toml | 2 + .../{ => v0}/feature-flags-documents.json | 0 packages/feature-flags-contract/src/error.rs | 17 +++ packages/feature-flags-contract/src/lib.rs | 39 ++++--- packages/feature-flags-contract/src/v0/mod.rs | 18 +++ .../test/unit/featureFlagsContract.spec.js | 2 +- .../Cargo.toml | 2 + .../masternode-reward-shares-documents.json | 0 .../src/error.rs | 17 +++ .../src/lib.rs | 36 +++--- .../src/v0/mod.rs | 20 ++++ .../masternodeRewardSharesContract.spec.js | 2 +- .../mod.rs | 2 +- packages/rs-dpp/src/system_data_contracts.rs | 18 +-- .../fixtures/get_dashpay_contract_fixture.rs | 6 +- ...with_generalized_encryption_key_fixture.rs | 6 +- .../tests/fixtures/get_documents_fixture.rs | 2 +- .../tests/fixtures/get_dpns_data_contract.rs | 6 +- ...ternode_reward_shares_documents_fixture.rs | 15 ++- .../create_mn_shares_contract/mod.rs | 8 +- .../v0/mod.rs | 18 ++- .../v0/mod.rs | 16 ++- .../v0/mod.rs | 2 +- .../v0/mod.rs | 20 ++-- .../v0/mod.rs | 24 ++-- .../create_genesis_state/v0/mod.rs | 35 +++--- .../data_triggers/bindings/list/v0/mod.rs | 4 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 3 +- .../data_triggers/triggers/dpns/v0/mod.rs | 5 +- .../triggers/feature_flags/v0/mod.rs | 3 +- .../triggers/reward_share/v0/mod.rs | 3 +- .../triggers/withdrawals/v0/mod.rs | 26 ++--- .../src/test/helpers/fee_pools.rs | 2 +- .../tests/strategy_tests/failures.rs | 40 ++++--- .../drive/batch/drive_op_batch/document.rs | 13 ++- packages/rs-drive/src/drive/cache.rs | 6 + .../src/drive/cache/system_contracts_cache.rs | 63 +++++++++++ .../src/drive/contract/contract_fetch_info.rs | 7 +- .../drive/identity/withdrawals/documents.rs | 4 +- packages/rs-drive/src/drive/mod.rs | 8 -- packages/rs-drive/src/drive/open/mod.rs | 6 +- .../src/drive/system_contracts_cache.rs | 36 ------ .../v0/transformer.rs | 4 +- .../src/version/contracts.rs | 10 ++ .../src/version/mocks/v2_test.rs | 8 ++ .../src/version/mocks/v3_test.rs | 8 ++ .../rs-platform-version/src/version/mod.rs | 1 + .../src/version/protocol_version.rs | 2 + .../rs-platform-version/src/version/v1.rs | 8 ++ packages/withdrawals-contract/Cargo.toml | 2 + .../{ => v0}/withdrawals-documents.json | 0 packages/withdrawals-contract/src/error.rs | 17 +++ packages/withdrawals-contract/src/lib.rs | 68 ++++-------- packages/withdrawals-contract/src/v0/mod.rs | 51 +++++++++ .../test/unit/withdrawalsContract.spec.js | 2 +- 73 files changed, 818 insertions(+), 344 deletions(-) rename packages/dashpay-contract/schema/{ => v0}/dashpay.schema.json (100%) create mode 100644 packages/dashpay-contract/src/error.rs create mode 100644 packages/dashpay-contract/src/v0/mod.rs create mode 100644 packages/data-contracts/src/error.rs rename packages/dpns-contract/schema/{ => v0}/dpns-contract-documents.json (100%) create mode 100644 packages/dpns-contract/src/error.rs create mode 100644 packages/dpns-contract/src/v0/mod.rs rename packages/feature-flags-contract/schema/{ => v0}/feature-flags-documents.json (100%) create mode 100644 packages/feature-flags-contract/src/error.rs create mode 100644 packages/feature-flags-contract/src/v0/mod.rs rename packages/masternode-reward-shares-contract/schema/{ => v0}/masternode-reward-shares-documents.json (100%) create mode 100644 packages/masternode-reward-shares-contract/src/error.rs create mode 100644 packages/masternode-reward-shares-contract/src/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/cache/system_contracts_cache.rs delete mode 100644 packages/rs-drive/src/drive/system_contracts_cache.rs create mode 100644 packages/rs-platform-version/src/version/contracts.rs rename packages/withdrawals-contract/schema/{ => v0}/withdrawals-documents.json (100%) create mode 100644 packages/withdrawals-contract/src/error.rs create mode 100644 packages/withdrawals-contract/src/v0/mod.rs diff --git a/Cargo.lock b/Cargo.lock index fd5dc32b093..0d31863a6ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,7 +179,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -190,7 +190,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -359,7 +359,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.41", + "syn 2.0.48", "which", ] @@ -480,7 +480,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "syn_derive", ] @@ -719,7 +719,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -940,7 +940,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -964,7 +964,7 @@ dependencies = [ "dapi-grpc", "heck", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -988,7 +988,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -999,7 +999,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -1068,7 +1068,9 @@ name = "dashpay-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1080,7 +1082,9 @@ dependencies = [ "feature-flags-contract", "masternode-reward-shares-contract", "platform-value", + "platform-version", "serde_json", + "thiserror", "withdrawals-contract", ] @@ -1167,7 +1171,9 @@ name = "dpns-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1394,7 +1400,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -1515,7 +1521,9 @@ name = "feature-flags-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1682,7 +1690,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2231,7 +2239,7 @@ source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-p dependencies = [ "ahash 0.7.7", "anyhow", - "base64 0.13.1", + "base64 0.21.5", "bytecount", "fancy-regex", "fraction", @@ -2363,7 +2371,9 @@ name = "masternode-reward-shares-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -2433,7 +2443,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2622,7 +2632,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2805,7 +2815,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2850,7 +2860,7 @@ version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "virtue 0.0.14", ] @@ -2880,7 +2890,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.3" dependencies = [ "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2896,7 +2906,7 @@ version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3024,7 +3034,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3073,9 +3083,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] @@ -3139,7 +3149,7 @@ dependencies = [ "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.41", + "syn 2.0.48", "tempfile", "which", ] @@ -3167,7 +3177,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3237,9 +3247,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3772,7 +3782,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3795,7 +3805,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3838,7 +3848,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3850,7 +3860,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4065,9 +4075,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -4083,7 +4093,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4283,22 +4293,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4402,7 +4412,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4577,7 +4587,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4856,7 +4866,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -4890,7 +4900,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5149,9 +5159,11 @@ version = "1.0.0-dev.3" dependencies = [ "num_enum", "platform-value", + "platform-version", "serde", "serde_json", "serde_repr", + "thiserror", ] [[package]] @@ -5186,7 +5198,7 @@ checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] diff --git a/packages/bench-suite/benchmarks/basicValidation.js b/packages/bench-suite/benchmarks/basicValidation.js index cc1eb900d57..5a26fe81cff 100644 --- a/packages/bench-suite/benchmarks/basicValidation.js +++ b/packages/bench-suite/benchmarks/basicValidation.js @@ -1,6 +1,6 @@ const { PrivateKey } = require('@dashevo/dashcore-lib'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v0/dpns-contract-documents.json'); // const { DashPlatformProtocol, Identity, Identifier, default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/bench-suite/benchmarks/documents/dpns.js b/packages/bench-suite/benchmarks/documents/dpns.js index 605862943ca..e210558d35c 100644 --- a/packages/bench-suite/benchmarks/documents/dpns.js +++ b/packages/bench-suite/benchmarks/documents/dpns.js @@ -1,6 +1,6 @@ const crypto = require('crypto'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v0/dpns-contract-documents.json'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index ea69f871c89..6a57b5a220e 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +platform-version = { path = "../rs-platform-version" } +thiserror = "1.0.56" serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dashpay-contract/schema/dashpay.schema.json b/packages/dashpay-contract/schema/v0/dashpay.schema.json similarity index 100% rename from packages/dashpay-contract/schema/dashpay.schema.json rename to packages/dashpay-contract/schema/v0/dashpay.schema.json diff --git a/packages/dashpay-contract/src/error.rs b/packages/dashpay-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/dashpay-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dashpay-contract/src/lib.rs b/packages/dashpay-contract/src/lib.rs index 737eba57c6f..c3de5d95189 100644 --- a/packages/dashpay-contract/src/lib.rs +++ b/packages/dashpay-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v0; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,21 +16,25 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 215, 90, 101, 229, 15, 115, 5, 44, 117, 182, 217, ]; -pub mod document_types { - pub mod contact_request { - pub const NAME: &str = "contactRequest"; - - pub mod properties { - pub const TO_USER_ID: &str = "toUserId"; - pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; - pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dashpay.schema.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.dashpay { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.dashpay { + 1 => v0::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dashpay-contract/src/v0/mod.rs b/packages/dashpay-contract/src/v0/mod.rs new file mode 100644 index 00000000000..07278ce1dc7 --- /dev/null +++ b/packages/dashpay-contract/src/v0/mod.rs @@ -0,0 +1,19 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod contact_request { + pub const NAME: &str = "contactRequest"; + + pub mod properties { + pub const TO_USER_ID: &str = "toUserId"; + pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; + pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v0/dashpay.schema.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dashpay-contract/test/unit/schema.spec.js b/packages/dashpay-contract/test/unit/schema.spec.js index a5407a94b1b..e97e2e25751 100644 --- a/packages/dashpay-contract/test/unit/schema.spec.js +++ b/packages/dashpay-contract/test/unit/schema.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const crypto = require('crypto'); const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const schema = require('../../schema/dashpay.schema.json'); +const schema = require('../../schema/v0/dashpay.schema.json'); const whitepaperMasternodeText = 'Full nodes are servers running on a P2P network that allow peers to use them to receive updates about the events on the network. These nodes utilize significant amounts of traffic and other resources that incur a substantial cost. As a result, a steady decrease in the amount of these nodes has been observed for some time on the Bitcoin network and as a result, block propagation times have been upwards of 40 seconds. Many solutions have been proposed such as a new reward scheme by Microsoft Research and the Bitnodes incentive program'; const encoded32Chars = '4fafc98bbfe597f7ba2c9f767d52036d'; diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 9ca1fc9250c..ccf596d97b3 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } withdrawals-contract = { path = "../withdrawals-contract" } masternode-reward-shares-contract = { path = "../masternode-reward-shares-contract" } diff --git a/packages/data-contracts/src/error.rs b/packages/data-contracts/src/error.rs new file mode 100644 index 00000000000..b9a5dd5d244 --- /dev/null +++ b/packages/data-contracts/src/error.rs @@ -0,0 +1,104 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} + +impl From for Error { + fn from(e: withdrawals_contract::Error) -> Self { + match e { + withdrawals_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + withdrawals_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dashpay_contract::Error) -> Self { + match e { + dashpay_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dashpay_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dpns_contract::Error) -> Self { + match e { + dpns_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dpns_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: masternode_reward_shares_contract::Error) -> Self { + match e { + masternode_reward_shares_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + masternode_reward_shares_contract::Error::InvalidSchemaJson(e) => { + Error::InvalidSchemaJson(e) + } + } + } +} + +impl From for Error { + fn from(e: feature_flags_contract::Error) -> Self { + match e { + feature_flags_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + feature_flags_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} diff --git a/packages/data-contracts/src/lib.rs b/packages/data-contracts/src/lib.rs index 460233bb221..f6761d1eb8c 100644 --- a/packages/data-contracts/src/lib.rs +++ b/packages/data-contracts/src/lib.rs @@ -1,14 +1,18 @@ -use serde_json::{Error, Value}; +mod error; +use serde_json::Value; + +use crate::error::Error; pub use dashpay_contract; pub use dpns_contract; pub use feature_flags_contract; pub use masternode_reward_shares_contract; use platform_value::Identifier; +use platform_version::version::PlatformVersion; pub use withdrawals_contract; #[repr(u8)] -#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd, Hash)] pub enum SystemDataContract { Withdrawals = 0, MasternodeRewards = 1, @@ -20,6 +24,7 @@ pub enum SystemDataContract { pub struct DataContractSource { pub id_bytes: [u8; 32], pub owner_id_bytes: [u8; 32], + pub version: u32, pub definitions: Option, pub document_schemas: Value, } @@ -36,37 +41,46 @@ impl SystemDataContract { Identifier::new(bytes) } /// Returns [DataContractSource] - pub fn source(self) -> Result { + pub fn source(self, platform_version: &PlatformVersion) -> Result { let data = match self { SystemDataContract::Withdrawals => DataContractSource { id_bytes: withdrawals_contract::ID_BYTES, owner_id_bytes: withdrawals_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: withdrawals_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.withdrawals as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: withdrawals_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::MasternodeRewards => DataContractSource { id_bytes: masternode_reward_shares_contract::ID_BYTES, owner_id_bytes: masternode_reward_shares_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: masternode_reward_shares_contract::load_documents_schemas()?, + version: platform_version + .system_data_contracts + .masternode_reward_shares as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: masternode_reward_shares_contract::load_documents_schemas( + platform_version, + )?, }, SystemDataContract::FeatureFlags => DataContractSource { id_bytes: feature_flags_contract::ID_BYTES, owner_id_bytes: feature_flags_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: feature_flags_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.feature_flags as u32, + definitions: feature_flags_contract::load_definitions(platform_version)?, + document_schemas: feature_flags_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::DPNS => DataContractSource { id_bytes: dpns_contract::ID_BYTES, owner_id_bytes: dpns_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dpns_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dpns as u32, + definitions: dpns_contract::load_definitions(platform_version)?, + document_schemas: dpns_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::Dashpay => DataContractSource { id_bytes: dashpay_contract::ID_BYTES, owner_id_bytes: dashpay_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dashpay_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dashpay as u32, + definitions: dashpay_contract::load_definitions(platform_version)?, + document_schemas: dashpay_contract::load_documents_schemas(platform_version)?, }, }; diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 4b1156421ae..0ab6051c1e6 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dpns-contract/schema/dpns-contract-documents.json b/packages/dpns-contract/schema/v0/dpns-contract-documents.json similarity index 100% rename from packages/dpns-contract/schema/dpns-contract-documents.json rename to packages/dpns-contract/schema/v0/dpns-contract-documents.json diff --git a/packages/dpns-contract/src/error.rs b/packages/dpns-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/dpns-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dpns-contract/src/lib.rs b/packages/dpns-contract/src/lib.rs index 0321c3823c9..2f9e5a22413 100644 --- a/packages/dpns-contract/src/lib.rs +++ b/packages/dpns-contract/src/lib.rs @@ -1,5 +1,10 @@ +mod error; +pub mod v0; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::{Error, Value}; +use platform_version::version::PlatformVersion; +use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ 230, 104, 198, 89, 175, 102, 174, 225, 231, 44, 24, 109, 222, 123, 91, 126, 10, 29, 113, 42, 9, @@ -11,27 +16,25 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 67, 4, 181, 246, 153, 65, 68, 40, 110, 253, 172, ]; -pub mod document_types { - pub mod domain { - pub const NAME: &str = "domain"; - - pub mod properties { - pub const LABEL: &str = "label"; - pub const NORMALIZED_LABEL: &str = "normalizedLabel"; - pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; - pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; - pub const PREORDER_SALT: &str = "preorderSalt"; - pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; - pub const RECORDS: &str = "records"; - pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; - pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dpns-contract-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v0::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dpns-contract/src/v0/mod.rs b/packages/dpns-contract/src/v0/mod.rs new file mode 100644 index 00000000000..5572064166b --- /dev/null +++ b/packages/dpns-contract/src/v0/mod.rs @@ -0,0 +1,25 @@ +use crate::Error; +use serde_json::Value; + +pub mod document_types { + pub mod domain { + pub const NAME: &str = "domain"; + + pub mod properties { + pub const LABEL: &str = "label"; + pub const NORMALIZED_LABEL: &str = "normalizedLabel"; + pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; + pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; + pub const PREORDER_SALT: &str = "preorderSalt"; + pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; + pub const RECORDS: &str = "records"; + pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; + pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v0/dpns-contract-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dpns-contract/test/unit/dpnsContract.spec.js b/packages/dpns-contract/test/unit/dpnsContract.spec.js index 148d79f51c2..cb5d0edb8a1 100644 --- a/packages/dpns-contract/test/unit/dpnsContract.spec.js +++ b/packages/dpns-contract/test/unit/dpnsContract.spec.js @@ -6,7 +6,7 @@ const { const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const { expect } = require('chai'); -const dpnsContractDocumentsSchema = require('../../schema/dpns-contract-documents.json'); +const dpnsContractDocumentsSchema = require('../../schema/v0/dpns-contract-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index d7fc4fcabf7..1114df3030f 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/feature-flags-contract/schema/feature-flags-documents.json b/packages/feature-flags-contract/schema/v0/feature-flags-documents.json similarity index 100% rename from packages/feature-flags-contract/schema/feature-flags-documents.json rename to packages/feature-flags-contract/schema/v0/feature-flags-documents.json diff --git a/packages/feature-flags-contract/src/error.rs b/packages/feature-flags-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/feature-flags-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/feature-flags-contract/src/lib.rs b/packages/feature-flags-contract/src/lib.rs index 50264845dfc..c10ceaa1668 100644 --- a/packages/feature-flags-contract/src/lib.rs +++ b/packages/feature-flags-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v0; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,20 +16,25 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 154, 191, 43, 51, 101, 131, 190, 89, 135, 167, 21, ]; -pub mod document_types { - pub mod update_consensus_params { - pub const NAME: &str = "updateConsensusParams"; - - pub mod properties { - pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; - pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/feature-flags-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v0::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/feature-flags-contract/src/v0/mod.rs b/packages/feature-flags-contract/src/v0/mod.rs new file mode 100644 index 00000000000..c4fc58bc3d4 --- /dev/null +++ b/packages/feature-flags-contract/src/v0/mod.rs @@ -0,0 +1,18 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod update_consensus_params { + pub const NAME: &str = "updateConsensusParams"; + + pub mod properties { + pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; + pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v0/feature-flags-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js index f06deea8d41..7aef0a4ee10 100644 --- a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js +++ b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const featureFlagsContractDocumentsSchema = require('../../schema/feature-flags-documents.json'); +const featureFlagsContractDocumentsSchema = require('../../schema/v0/feature-flags-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 29a0bc18512..c2863a4a4e1 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json b/packages/masternode-reward-shares-contract/schema/v0/masternode-reward-shares-documents.json similarity index 100% rename from packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json rename to packages/masternode-reward-shares-contract/schema/v0/masternode-reward-shares-documents.json diff --git a/packages/masternode-reward-shares-contract/src/error.rs b/packages/masternode-reward-shares-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/masternode-reward-shares-contract/src/lib.rs b/packages/masternode-reward-shares-contract/src/lib.rs index 5d9a0fe4004..70ba9bf50d7 100644 --- a/packages/masternode-reward-shares-contract/src/lib.rs +++ b/packages/masternode-reward-shares-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v0; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -15,19 +19,23 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub mod document_types { - pub mod reward_share { - pub const NAME: &str = "rewardShare"; - - pub mod properties { - pub const PAY_TO_ID: &str = "payToId"; - pub const PERCENTAGE: &str = "percentage"; - } +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 0 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_definitions".to_string(), + known_versions: vec![0], + received: version, + }), } } - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!( - "../schema/masternode-reward-shares-documents.json" - )) +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v0::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/masternode-reward-shares-contract/src/v0/mod.rs b/packages/masternode-reward-shares-contract/src/v0/mod.rs new file mode 100644 index 00000000000..bde68053da7 --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/v0/mod.rs @@ -0,0 +1,20 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod reward_share { + pub const NAME: &str = "rewardShare"; + + pub mod properties { + pub const PAY_TO_ID: &str = "payToId"; + pub const PERCENTAGE: &str = "percentage"; + } + } +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!( + "../../schema/v0/masternode-reward-shares-documents.json" + )) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js index 704249bc68a..980373db7bd 100644 --- a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js +++ b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const rewardSharingContractSchema = require('../../schema/masternode-reward-shares-documents.json'); +const rewardSharingContractSchema = require('../../schema/v0/masternode-reward-shares-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index c7b052160e2..0ba1d37580c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -18,7 +18,7 @@ use crate::state_transition::StateTransitionFieldTypes; use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; -use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT; +use data_contracts::withdrawals_contract::v0::document_types::withdrawal::properties::OUTPUT_SCRIPT; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; diff --git a/packages/rs-dpp/src/system_data_contracts.rs b/packages/rs-dpp/src/system_data_contracts.rs index 7857cf112a1..3007df8bc41 100644 --- a/packages/rs-dpp/src/system_data_contracts.rs +++ b/packages/rs-dpp/src/system_data_contracts.rs @@ -5,18 +5,21 @@ use std::collections::{BTreeMap, BTreeSet}; use crate::data_contract::accessors::v0::DataContractV0Setters; pub use data_contracts::*; +use platform_version::version::PlatformVersion; fn create_data_contract( factory: &DataContractFactory, system_contract: SystemDataContract, + platform_version: &PlatformVersion, ) -> Result { let DataContractSource { id_bytes, owner_id_bytes, + version, definitions, document_schemas, } = system_contract - .source() + .source(platform_version) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let id = Identifier::from(id_bytes); @@ -30,29 +33,30 @@ fn create_data_contract( )?; data_contract.data_contract_mut().set_id(id); + data_contract.data_contract_mut().set_version(version); Ok(data_contract.data_contract_owned()) } pub fn load_system_data_contract( system_contract: SystemDataContract, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; - create_data_contract(&factory, system_contract) + create_data_contract(&factory, system_contract, platform_version) } pub fn load_system_data_contracts( system_contracts: BTreeSet, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; system_contracts .into_iter() .map(|system_contract| { - let data_contract = create_data_contract(&factory, system_contract)?; + let data_contract = create_data_contract(&factory, system_contract, platform_version)?; Ok((system_contract, data_contract)) }) diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs index 078d486e86e..8f0866fe09b 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs @@ -5,6 +5,7 @@ use crate::{ use crate::data_contract::created_data_contract::CreatedDataContract; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_fixture( owner_id: Option, @@ -12,8 +13,11 @@ pub fn get_dashpay_contract_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs index 61d3ac61732..9d58df2e70c 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs @@ -7,6 +7,7 @@ use crate::data_contract::config::v0::DataContractConfigV0; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( owner_id: Option, @@ -14,8 +15,11 @@ pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index 8af470b1487..5a990ab1d8a 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -198,7 +198,7 @@ pub fn get_withdrawal_document_fixture( }; let document_type = data_contract.document_type_for_name( - data_contracts::withdrawals_contract::document_types::withdrawal::NAME, + data_contracts::withdrawals_contract::v0::document_types::withdrawal::NAME, )?; let properties = data diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs index 46edce16604..77e14679737 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs @@ -1,4 +1,5 @@ use data_contracts::{DataContractSource, SystemDataContract}; +use platform_version::version::PlatformVersion; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::DataContractFactory; @@ -14,10 +15,13 @@ pub fn get_dpns_data_contract_fixture( let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let DataContractSource { document_schemas, .. } = SystemDataContract::DPNS - .source() + .source(platform_version) .expect("should return DPNS data contract source"); //Todo create config diff --git a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs index 66b50f6df10..b6f0ae7cefa 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs @@ -8,14 +8,19 @@ use crate::{ }; use data_contracts::SystemDataContract; use platform_value::platform_value; +use platform_version::version::PlatformVersion; pub fn get_masternode_reward_shares_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); + + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); @@ -37,7 +42,9 @@ pub fn get_masternode_reward_shares_documents_fixture( } pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) -> DataContract { - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract") } @@ -45,10 +52,12 @@ pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) pub fn get_masternode_reward_shares_extended_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs index 6dd0da06831..213b9ac0dad 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs @@ -20,11 +20,9 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> DataContract { - let contract = load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - ) - .expect("should load masternode reward contract"); + let contract = + load_system_data_contract(SystemDataContract::MasternodeRewards, &platform_version) + .expect("should load masternode reward contract"); let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 6f84e0799f6..4fa90a88f2f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -21,6 +21,7 @@ use dpp::version::PlatformVersion; use drive::drive::document::query::{QueryDocumentsOutcomeV0Methods}; use std::collections::BTreeMap; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::SystemDataContract; use crate::execution::platform_events::fee_pool_outwards_distribution::fetch_reward_shares_list_for_masternode::MN_REWARD_SHARES_DOCUMENT_TYPE; impl Platform { @@ -31,14 +32,19 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let document_type = self - .drive - .system_contracts - .masternode_rewards - .document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; + let cache = self.drive.cache.read().unwrap(); + + let masternode_rewards_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::MasternodeRewards, platform_version)?; + + drop(cache); + + let document_type = + masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; let drive_query = DriveQuery { - contract: &self.drive.system_contracts.masternode_rewards, + contract: &masternode_rewards_contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs index 09b1c48c78f..3999a7d0245 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs @@ -9,7 +9,7 @@ use dashcore_rpc::dashcore::{ }; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use drive::dpp::identifier::Identifier; use drive::dpp::identity::convert_credits_to_duffs; @@ -125,7 +125,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; use dpp::prelude::Identifier; @@ -148,11 +148,9 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); @@ -166,7 +164,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, "transactionIndex": 1u64, }), None, @@ -194,7 +192,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, "transactionIndex": 2u64, }), None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs index f388172b268..4861ddfa5be 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::document::{Document, DocumentV0Setters}; use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::withdrawals_contract; -use drive::dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use drive::dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use drive::dpp::util::hash; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs index 139820ec9ac..4b963be51c9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -10,7 +10,7 @@ use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; use drive::grovedb::Transaction; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_execution_context::BlockExecutionContext; @@ -58,7 +58,7 @@ where }; let mut documents = self.drive.fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), Some(transaction), platform_version, )?; @@ -92,7 +92,7 @@ where document.set_u8( withdrawal::properties::STATUS, - withdrawals_contract::WithdrawalStatus::POOLED as u8, + withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, ); document.set_i64( @@ -219,11 +219,9 @@ mod tests { .into(), ); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); @@ -237,7 +235,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, "transactionIndex": 1u64, }), None, @@ -265,7 +263,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, "transactionIndex": 2u64, }), None, @@ -294,7 +292,7 @@ mod tests { let updated_documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), + withdrawals_contract::v0::WithdrawalStatus::POOLED.into(), Some(&transaction), platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index d0d503ada17..104361e34cc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -1,12 +1,12 @@ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; +use dpp::data_contracts::withdrawals_contract::v0::WithdrawalStatus; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::version::PlatformVersion; use std::collections::BTreeMap; @@ -61,7 +61,7 @@ where }; let broadcasted_withdrawal_documents = self.drive.fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + withdrawals_contract::v0::WithdrawalStatus::BROADCASTED.into(), Some(transaction), platform_version, )?; @@ -220,7 +220,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::{ @@ -356,11 +356,9 @@ mod tests { proposer_results: None, }; - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); @@ -374,7 +372,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Identifier::new([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), @@ -403,7 +401,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 2u64, "transactionSignHeight": 10u64, "transactionId": Identifier::new([3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), @@ -432,7 +430,7 @@ mod tests { let documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + withdrawals_contract::v0::WithdrawalStatus::EXPIRED.into(), Some(&transaction), platform_version, ) @@ -447,7 +445,7 @@ mod tests { let documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + withdrawals_contract::v0::WithdrawalStatus::COMPLETE.into(), Some(&transaction), platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index ba2a1044d6b..a281d2bdf66 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -44,7 +44,7 @@ use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; use dpp::identity::IdentityV0; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; -use drive::dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use drive::dpp::system_data_contracts::SystemDataContract; use drive::drive::batch::{ DataContractOperationType, DocumentOperationType, DriveOperation, IdentityOperationType, }; @@ -81,8 +81,22 @@ impl Platform { // Create system identities and contracts - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let cache = self.drive.cache.read().unwrap(); + + let dpns_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::DPNS, platform_version)?; + let withdrawals_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::Withdrawals, platform_version)?; + let dashpay_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::Dashpay, platform_version)?; + let masternode_rewards_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::MasternodeRewards, platform_version)?; + + drop(cache); let system_data_contract_types = BTreeMap::from_iter([ ( @@ -95,10 +109,7 @@ impl Platform { ( SystemDataContract::Withdrawals, ( - load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - )?, + withdrawals_contract, system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -116,20 +127,14 @@ impl Platform { ( SystemDataContract::Dashpay, ( - load_system_data_contract( - SystemDataContract::Dashpay, - platform_version.protocol_version, - )?, + dashpay_contract, system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - )?, + masternode_rewards_contract, system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index d4498a54241..eb3432bedb7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -7,8 +7,8 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; use dpp::errors::ProtocolError; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::feature_flags_contract::v0::document_types::update_consensus_params; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::system_data_contracts::{dashpay_contract, dpns_contract, SystemDataContract}; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 42b07516598..8c836383e11 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -10,7 +10,8 @@ use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::dashpay_contract::document_types::contact_request::properties::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; +use dpp::system_data_contracts::dashpay_contract::v0::document_types::contact_request::properties +::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index c4a0ab9ae70..80f3c4aa0da 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -1,6 +1,6 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::dpns_contract::document_types::domain::properties::PARENT_DOMAIN_NAME; +use dpp::data_contracts::dpns_contract::v0::document_types::domain::properties::PARENT_DOMAIN_NAME; ///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. use dpp::util::hash::hash; use std::collections::BTreeMap; @@ -19,7 +19,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::dpns_contract; -use dpp::system_data_contracts::dpns_contract::document_types::domain::properties::{ALLOW_SUBDOMAINS, DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; +use dpp::system_data_contracts::dpns_contract::v0::document_types::domain::properties::{ALLOW_SUBDOMAINS, + DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; use dpp::util::strings::convert_to_homograph_safe_chars; use dpp::version::PlatformVersion; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 2a307ea5dae..76daacfc4b7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -10,7 +10,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::feature_flags_contract; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params::properties::PROPERTY_ENABLE_AT_HEIGHT; +use dpp::system_data_contracts::feature_flags_contract::v0::document_types::update_consensus_params::properties +::PROPERTY_ENABLE_AT_HEIGHT; use dpp::version::PlatformVersion; use super::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs index 78c48f1e905..9c0885739c8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs @@ -12,7 +12,8 @@ use dpp::document::DocumentV0Getters; use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types::reward_share::properties::{PAY_TO_ID, PERCENTAGE}; +use dpp::system_data_contracts::masternode_reward_shares_contract::v0::document_types::reward_share::properties +::{PAY_TO_ID, PERCENTAGE}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::error::execution::ExecutionError; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 466f0154fdf..72c807783e6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; @@ -104,8 +104,8 @@ pub fn delete_withdrawal_data_trigger_v0( .get_integer("status") .map_err(ProtocolError::ValueError)?; - if status != withdrawals_contract::WithdrawalStatus::COMPLETE as u8 - || status != withdrawals_contract::WithdrawalStatus::EXPIRED as u8 + if status != withdrawals_contract::v0::WithdrawalStatus::COMPLETE as u8 + || status != withdrawals_contract::v0::WithdrawalStatus::EXPIRED as u8 { let err = DataTriggerConditionError::new( data_contract.id(), @@ -202,11 +202,9 @@ mod tests { fn can_serialize_and_deserialize_withdrawal() { let platform_version = PlatformVersion::first(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract @@ -220,7 +218,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": (0..23).collect::>(), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Bytes32::new([1;32]), @@ -257,11 +255,9 @@ mod tests { .current_platform_version() .expect("should return a platform version"); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract @@ -276,7 +272,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": (0..23).collect::>(), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Bytes32::new([1;32]), diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index ea323d94c82..b0fcdb5af46 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -47,7 +47,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::document::{DocumentV0, INITIAL_REVISION}; use dpp::identity::accessors::IdentityGettersV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types; +use dpp::system_data_contracts::masternode_reward_shares_contract::v0::document_types; use dpp::version::PlatformVersion; use drive::common::identities::create_test_identity_with_rng; use drive::dpp::document::Document; diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 6f55d48d657..7fdc623d409 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -15,6 +15,7 @@ mod tests { use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; + use dpp::data_contracts::SystemDataContract; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::Value; use dpp::prelude::Identity; @@ -260,8 +261,27 @@ mod tests { platform_version, ); + let cache = platform + .drive + .cache + .read() + .expect("expected to get a read lock on the cache"); + + let dpns_contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::DPNS, &platform_version) + .expect("expected to get dpns contract"); + + drop(cache); + + let dpns_contract_for_type = dpns_contract.clone(); + + let domain_document_type_ref = dpns_contract_for_type + .document_type_for_name("domain") + .expect("expected a profile document type"); + let document_op_1 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract.clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -280,17 +300,11 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let document_op_2 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract, action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -309,13 +323,7 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let strategy = NetworkStrategy { diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 4fd13a99cc6..862d2cae919 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -14,8 +14,9 @@ use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::prelude::Identifier; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::data_contracts::SystemDataContract; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -247,13 +248,19 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { DocumentOperationType::AddWithdrawalDocument { owned_document_info, } => { - let contract = &drive.system_contracts.withdrawal_contract; + let cache = drive.cache.read().expect("should get cache lock"); + + let contract = cache + .system_data_contracts + .get_or_load(SystemDataContract::Withdrawals, platform_version)?; + + drop(cache); let document_type = contract.document_type_for_name(withdrawal::NAME)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, - contract, + contract: &contract, document_type, }; drive.add_document_for_contract_operations( diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 8e15643bfbe..66390089017 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,3 +1,4 @@ +pub use crate::drive::cache::system_contracts_cache::SystemDataContracts; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::contract::DataContractFetchInfo; use crate::drive::Drive; @@ -16,6 +17,9 @@ use platform_version::version::drive_versions::DriveVersion; #[cfg(any(feature = "full", feature = "verify"))] use std::sync::Arc; +#[cfg(feature = "full")] +mod system_contracts_cache; + /// Drive cache struct #[cfg(feature = "full")] pub struct DriveCache { @@ -25,6 +29,8 @@ pub struct DriveCache { pub genesis_time_ms: Option, /// Lazy loaded counter of votes to upgrade protocol version pub protocol_versions_counter: ProtocolVersionsCache, + /// Versioned system data contracts + pub system_data_contracts: SystemDataContracts, } /// ProtocolVersion cache that handles both global and block data diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs new file mode 100644 index 00000000000..3b018415791 --- /dev/null +++ b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs @@ -0,0 +1,63 @@ +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use moka::sync::Cache; +use platform_version::version::PlatformVersion; + +#[derive(Hash, Eq, PartialEq, Clone)] +struct DataContractTypeAndVersion { + contract: SystemDataContract, + version: u32, +} + +/// System contracts +pub struct SystemDataContracts { + contracts: Cache, +} + +impl SystemDataContracts { + /// Create a new SystemDataContracts + pub fn new() -> Self { + Self { + contracts: Cache::new(50), + } + } + /// Retrieves a reference to a `DataContract` from the cache, or loads it if not already present. + /// + /// This function takes a `SystemDataContract` and a reference to a `PlatformVersion` as arguments. + /// It constructs a key using the `contract` and the `withdrawals` field of `system_data_contracts` + /// in `platform_version`. If the `contracts` cache does not contain the key, it loads the system data contract + /// using the `load_system_data_contract` function and inserts it into `contracts`. + /// + /// # Arguments + /// + /// * `contract` - A `SystemDataContract` that specifies the type of contract to retrieve or load. + /// * `platform_version` - A reference to a `PlatformVersion` used to determine the version of the contract. + /// + /// # Returns + /// + /// * `Result<&DataContract, Error>` - A result that contains a reference to the `DataContract` if successful, + /// or an `Error` if the loading operation fails. + /// + /// # Panics + /// + /// This function will panic if it tries to retrieve a `DataContract` from `contracts` that does not exist. + /// However, this should never happen because the function ensures the `DataContract` is loaded + pub fn get_or_load( + &self, + contract: SystemDataContract, + platform_version: &PlatformVersion, + ) -> Result { + let key = DataContractTypeAndVersion { + contract, + version: platform_version.system_data_contracts.withdrawals as u32, + }; + + if !self.contracts.contains_key(&key) { + let data_contract = load_system_data_contract(contract, platform_version)?; + self.contracts.insert(key.clone(), data_contract); + } + + Ok(self.contracts.get(&key).unwrap()) + } +} diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 3565b1ccc66..42d865b78f4 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -10,6 +10,7 @@ use dpp::tests::fixtures::get_dpns_data_contract_fixture; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_masternode_reward_shares_data_contract_fixture; use grovedb_costs::OperationCost; +use platform_version::version::PlatformVersion; #[cfg(any(feature = "full", feature = "verify"))] /// DataContract and fetch information @@ -65,11 +66,15 @@ impl DataContractFetchInfo { /// This should ONLY be used for tests pub fn withdrawals_contract_fixture(protocol_version: u32) -> Self { + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get version"); + let contract = load_system_data_contract( data_contracts::SystemDataContract::Withdrawals, - protocol_version, + platform_version, ) .expect("to load system data contract"); + DataContractFetchInfo { contract, storage_flags: None, diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs index 52ffe87fa4c..4eb38a118d1 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs @@ -5,7 +5,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::Document; use dpp::platform_value::Value; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::version::PlatformVersion; use grovedb::TransactionArg; use indexmap::IndexMap; @@ -141,7 +141,7 @@ impl Drive { WhereClause { field: withdrawal::properties::STATUS.to_string(), operator: crate::query::WhereOperator::Equal, - value: Value::U8(withdrawals_contract::WithdrawalStatus::POOLED as u8), + value: Value::U8(withdrawals_contract::v0::WithdrawalStatus::POOLED as u8), }, ); diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index 053a051452a..3b56f562b18 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -94,8 +94,6 @@ mod open; mod operations; #[cfg(feature = "full")] mod prove; -#[cfg(feature = "full")] -mod system_contracts_cache; /// Contains a set of useful grovedb proof verification functions #[cfg(any(feature = "full", feature = "verify"))] pub mod verify; @@ -103,9 +101,6 @@ pub mod verify; #[cfg(feature = "full")] use crate::drive::cache::DriveCache; -#[cfg(feature = "full")] -use crate::drive::system_contracts_cache::SystemContracts; - /// Drive struct #[cfg(any(feature = "full", feature = "verify"))] pub struct Drive { @@ -113,9 +108,6 @@ pub struct Drive { pub grove: GroveDb, /// Drive config pub config: DriveConfig, - /// Main contracts in the system - #[cfg(feature = "full")] - pub system_contracts: SystemContracts, /// Drive Cache #[cfg(feature = "full")] pub cache: RwLock, diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 7496a651cd7..6be9f4472b9 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -1,6 +1,6 @@ +use crate::drive::cache::SystemDataContracts; use crate::drive::cache::{DataContractCache, DriveCache, ProtocolVersionsCache}; use crate::drive::config::DriveConfig; -use crate::drive::system_contracts_cache::SystemContracts; use crate::drive::Drive; use crate::error::Error; use grovedb::GroveDb; @@ -39,9 +39,6 @@ impl Drive { let drive = Drive { grove, config, - system_contracts: SystemContracts::load_genesis_system_contracts( - platform_version.protocol_version, - )?, cache: RwLock::new(DriveCache { cached_contracts: DataContractCache::new( data_contracts_global_cache_size, @@ -49,6 +46,7 @@ impl Drive { ), genesis_time_ms, protocol_versions_counter: ProtocolVersionsCache::new(), + system_data_contracts: SystemDataContracts::new(), }), }; diff --git a/packages/rs-drive/src/drive/system_contracts_cache.rs b/packages/rs-drive/src/drive/system_contracts_cache.rs deleted file mode 100644 index 71e95262445..00000000000 --- a/packages/rs-drive/src/drive/system_contracts_cache.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; - -/// System contracts -pub struct SystemContracts { - /// Withdrawal contract - pub withdrawal_contract: DataContract, - /// DPNS contract - pub dpns_contract: DataContract, - /// Dashpay contract - pub dashpay_contract: DataContract, - /// Masternode reward shares contract - pub masternode_rewards: DataContract, -} - -impl SystemContracts { - /// load genesis system contracts - pub fn load_genesis_system_contracts(protocol_version: u32) -> Result { - Ok(SystemContracts { - withdrawal_contract: load_system_data_contract( - SystemDataContract::Withdrawals, - protocol_version, - )?, - dpns_contract: load_system_data_contract(SystemDataContract::DPNS, protocol_version)?, - dashpay_contract: load_system_data_contract( - SystemDataContract::Dashpay, - protocol_version, - )?, - masternode_rewards: load_system_data_contract( - SystemDataContract::MasternodeRewards, - protocol_version, - )?, - }) - } -} diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 0d3b41099de..0dd755a2753 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -1,6 +1,6 @@ use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use dpp::data_contracts::withdrawals_contract; -use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::document::{Document, DocumentV0}; use dpp::platform_value::platform_value; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; @@ -24,7 +24,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { withdrawal::properties::CORE_FEE_PER_BYTE: identity_credit_withdrawal.core_fee_per_byte, withdrawal::properties::POOLING: Pooling::Never, withdrawal::properties::OUTPUT_SCRIPT: identity_credit_withdrawal.output_script.as_bytes(), - withdrawal::properties::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, + withdrawal::properties::STATUS: withdrawals_contract::v0::WithdrawalStatus::QUEUED, }); let withdrawal_document = DocumentV0 { diff --git a/packages/rs-platform-version/src/version/contracts.rs b/packages/rs-platform-version/src/version/contracts.rs new file mode 100644 index 00000000000..84c0d874b1d --- /dev/null +++ b/packages/rs-platform-version/src/version/contracts.rs @@ -0,0 +1,10 @@ +use crate::version::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct SystemDataContractVersions { + pub withdrawals: FeatureVersion, + pub dpns: FeatureVersion, + pub dashpay: FeatureVersion, + pub masternode_reward_shares: FeatureVersion, + pub feature_flags: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index a1a8d821439..642236eac97 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -906,4 +907,11 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 4a87ecde428..da782aa8878 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -906,4 +907,11 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 040c413e509..486f8db5fff 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,6 @@ mod protocol_version; pub use protocol_version::*; +pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; pub mod drive_versions; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index e6577486066..2b6763aee6c 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -1,4 +1,5 @@ use crate::error::PlatformVersionError; +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::DriveVersion; @@ -48,6 +49,7 @@ pub struct PlatformVersion { pub drive_abci: DriveAbciVersion, pub abci_structure: AbciStructureVersion, pub platform_architecture: PlatformArchitectureVersion, + pub system_data_contracts: SystemDataContractVersions, } pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[PLATFORM_V1]; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index cc0fc782c6a..9e3b2743074 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -903,4 +904,11 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index c0e4c43fa90..61d4b0dae5e 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" serde = { version = "1.0.152", features = ["derive"] } diff --git a/packages/withdrawals-contract/schema/withdrawals-documents.json b/packages/withdrawals-contract/schema/v0/withdrawals-documents.json similarity index 100% rename from packages/withdrawals-contract/schema/withdrawals-documents.json rename to packages/withdrawals-contract/schema/v0/withdrawals-documents.json diff --git a/packages/withdrawals-contract/src/error.rs b/packages/withdrawals-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/withdrawals-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index f041acc820d..f266cc6c0bf 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -1,49 +1,10 @@ -use num_enum::{IntoPrimitive, TryFromPrimitive}; +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; -use serde_repr::{Deserialize_repr, Serialize_repr}; -pub mod document_types { - pub mod withdrawal { - pub const NAME: &str = "withdrawal"; - - pub mod properties { - pub const TRANSACTION_ID: &str = "transactionId"; - pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; - pub const TRANSACTION_INDEX: &str = "transactionIndex"; - pub const AMOUNT: &str = "amount"; - pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; - pub const POOLING: &str = "pooling"; - pub const OUTPUT_SCRIPT: &str = "outputScript"; - pub const STATUS: &str = "status"; - pub const CREATED_AT: &str = "$createdAt"; - pub const UPDATED_AT: &str = "$updatedAt"; - pub const OWNER_ID: &str = "$ownerId"; - } - } -} - -// @append_only -#[repr(u8)] -#[derive( - Serialize_repr, - Deserialize_repr, - PartialEq, - Eq, - Clone, - Copy, - Debug, - TryFromPrimitive, - IntoPrimitive, -)] -pub enum WithdrawalStatus { - QUEUED = 0, - POOLED = 1, - BROADCASTED = 2, - COMPLETE = 3, - EXPIRED = 4, -} +mod error; +pub mod v0; pub const ID_BYTES: [u8; 32] = [ 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, @@ -58,6 +19,23 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/withdrawals-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v0::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/withdrawals-contract/src/v0/mod.rs b/packages/withdrawals-contract/src/v0/mod.rs new file mode 100644 index 00000000000..8c79acada35 --- /dev/null +++ b/packages/withdrawals-contract/src/v0/mod.rs @@ -0,0 +1,51 @@ +use crate::error::Error; +use num_enum::{IntoPrimitive, TryFromPrimitive}; +use serde_json::Value; +use serde_repr::{Deserialize_repr, Serialize_repr}; + +pub mod document_types { + pub mod withdrawal { + pub const NAME: &str = "withdrawal"; + + pub mod properties { + pub const TRANSACTION_ID: &str = "transactionId"; + pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; + pub const TRANSACTION_INDEX: &str = "transactionIndex"; + pub const AMOUNT: &str = "amount"; + pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; + pub const POOLING: &str = "pooling"; + pub const OUTPUT_SCRIPT: &str = "outputScript"; + pub const STATUS: &str = "status"; + pub const CREATED_AT: &str = "$createdAt"; + pub const UPDATED_AT: &str = "$updatedAt"; + pub const OWNER_ID: &str = "$ownerId"; + } + } +} + +// @append_only +#[repr(u8)] +#[derive( + Serialize_repr, + Deserialize_repr, + PartialEq, + Eq, + Clone, + Copy, + Debug, + TryFromPrimitive, + IntoPrimitive, +)] + +pub enum WithdrawalStatus { + QUEUED = 0, + POOLED = 1, + BROADCASTED = 2, + COMPLETE = 3, + EXPIRED = 4, +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v0/withdrawals-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 61c8c064516..0cfe0a8c797 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const withdrawalContractDocumentsSchema = require('../../schema/withdrawals-documents.json'); +const withdrawalContractDocumentsSchema = require('../../schema/v0/withdrawals-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); From dc760fa5443265fddc7b637e0fec9d7062cf67f4 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 19 Jan 2024 04:07:05 +0700 Subject: [PATCH 2/7] Update system_contracts_cache.rs --- packages/rs-drive/src/drive/cache/system_contracts_cache.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs index 3b018415791..b194517787b 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs @@ -22,7 +22,7 @@ impl SystemDataContracts { contracts: Cache::new(50), } } - /// Retrieves a reference to a `DataContract` from the cache, or loads it if not already present. + /// Retrieves a `DataContract` from the cache, or loads it if not already present. /// /// This function takes a `SystemDataContract` and a reference to a `PlatformVersion` as arguments. /// It constructs a key using the `contract` and the `withdrawals` field of `system_data_contracts` @@ -36,7 +36,7 @@ impl SystemDataContracts { /// /// # Returns /// - /// * `Result<&DataContract, Error>` - A result that contains a reference to the `DataContract` if successful, + /// * `Result` - A result that contains a reference to the `DataContract` if successful, /// or an `Error` if the loading operation fails. /// /// # Panics From fb1781fe0d75857e287377685cabb2925ddcad7c Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 19 Jan 2024 16:12:04 +0700 Subject: [PATCH 3/7] fix: compilation errors --- packages/rs-dpp/src/data_contract/mod.rs | 2 +- .../src/document/extended_document/mod.rs | 23 ++++--------- .../drive/identity/withdrawals/documents.rs | 32 ++++++++----------- .../rs-drive/tests/deterministic_root_hash.rs | 5 ++- packages/rs-sdk/tests/fetch/config.rs | 8 ++--- packages/strategy-tests/src/lib.rs | 5 ++- 6 files changed, 28 insertions(+), 47 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 83536ce7b41..d6572b53db6 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -264,7 +264,7 @@ mod tests { #[test] fn test_contract_serialization() { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract(Dashpay, platform_version.protocol_version) + let data_contract = load_system_data_contract(Dashpay, platform_version) .expect("expected dashpay contract"); let platform_version = PlatformVersion::latest(); let serialized = data_contract diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index fe16af61183..393430ac621 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -410,8 +410,7 @@ mod test { fn test_document_json_deserialize() -> Result<()> { init(); let platform_version = PlatformVersion::latest(); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let doc = ExtendedDocument::from_json_string(&document_json, dpns_contract, platform_version)?; @@ -489,11 +488,8 @@ mod test { #[test] fn test_to_object() { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json").unwrap(); let document = ExtendedDocument::from_json_string( &document_json, @@ -517,10 +513,8 @@ mod test { fn test_json_serialize() -> Result<()> { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - )?; + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let document = ExtendedDocument::from_json_string( &document_json, @@ -542,11 +536,8 @@ mod test { init(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); ExtendedDocument::from_json_string(&document_json, dpns_contract, LATEST_PLATFORM_VERSION) .expect("expected extended document"); Ok(()) diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs index 4eb38a118d1..0cc511c7526 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs @@ -193,7 +193,7 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -206,17 +206,15 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), Some(&transaction), platform_version, ) @@ -234,7 +232,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, "transactionIndex": 1u64, }), None, @@ -262,7 +260,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED, + "status": withdrawals_contract::v0::WithdrawalStatus::POOLED, "transactionIndex": 2u64, }), None, @@ -280,7 +278,7 @@ mod tests { let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), Some(&transaction), platform_version, ) @@ -290,7 +288,7 @@ mod tests { let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), + withdrawals_contract::v0::WithdrawalStatus::POOLED.into(), Some(&transaction), platform_version, ) @@ -305,7 +303,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::{platform_value, Bytes32}; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -320,11 +318,9 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); @@ -338,7 +334,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, "transactionIndex": 1u64, "transactionId": Bytes32::default(), }), diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index b0856635f7e..0eb4c39d5fd 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -426,9 +426,8 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { "e34e316e84c4639f44c512c5e602ee7d674d33ce69f02237de87af5f6151cdf6" ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("should load dpns contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("should load dpns contract"); drive .apply_contract( diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 6dd9010f5c7..cc4d7e956e6 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -168,15 +168,11 @@ impl Config { } fn default_identity_id() -> Identifier { - data_contracts::SystemDataContract::DPNS - .source() - .expect("data contract source") - .owner_id_bytes - .into() + data_contracts::dpns_contract::OWNER_ID_BYTES.into() } fn default_data_contract_id() -> Identifier { - data_contracts::SystemDataContract::DPNS.id() + data_contracts::dpns_contract::ID_BYTES.into() } fn default_document_type_name() -> String { diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d6deff5afa0..d48daf02d69 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1191,9 +1191,8 @@ mod tests { platform_version, ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("data contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("data contract"); let document_op_1 = DocumentOp { contract: dpns_contract.clone(), From b26e8bd6f8fe5df9c375b79ca3255835a0e4611b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 23 Jan 2024 16:51:42 +0700 Subject: [PATCH 4/7] chore: use corresponding version for module --- .../schema/{v0 => v1}/dashpay.schema.json | 0 packages/dashpay-contract/src/lib.rs | 5 ++-- .../dashpay-contract/src/{v0 => v1}/mod.rs | 2 +- .../{v0 => v1}/dpns-contract-documents.json | 0 packages/dpns-contract/src/lib.rs | 4 +-- packages/dpns-contract/src/{v0 => v1}/mod.rs | 2 +- .../{v0 => v1}/feature-flags-documents.json | 0 packages/feature-flags-contract/src/lib.rs | 5 ++-- .../src/{v0 => v1}/mod.rs | 2 +- .../masternode-reward-shares-documents.json | 0 .../src/lib.rs | 4 +-- .../src/{v0 => v1}/mod.rs | 2 +- .../mod.rs | 2 +- .../tests/fixtures/get_documents_fixture.rs | 2 +- .../v0/mod.rs | 8 +++--- .../v0/mod.rs | 2 +- .../v0/mod.rs | 12 ++++----- .../v0/mod.rs | 16 +++++------ .../data_triggers/bindings/list/v0/mod.rs | 4 +-- .../data_triggers/triggers/dashpay/v0/mod.rs | 2 +- .../data_triggers/triggers/dpns/v0/mod.rs | 4 +-- .../triggers/feature_flags/v0/mod.rs | 2 +- .../triggers/reward_share/v0/mod.rs | 2 +- .../triggers/withdrawals/v0/mod.rs | 10 +++---- .../src/test/helpers/fee_pools.rs | 2 +- .../drive/batch/drive_op_batch/document.rs | 2 +- .../drive/identity/withdrawals/documents.rs | 20 +++++++------- .../v0/transformer.rs | 4 +-- .../{v0 => v1}/withdrawals-documents.json | 0 packages/withdrawals-contract/src/lib.rs | 27 +++++++++++++++++-- .../src/{v0 => v1}/mod.rs | 26 +----------------- 31 files changed, 87 insertions(+), 86 deletions(-) rename packages/dashpay-contract/schema/{v0 => v1}/dashpay.schema.json (100%) rename packages/dashpay-contract/src/{v0 => v1}/mod.rs (89%) rename packages/dpns-contract/schema/{v0 => v1}/dpns-contract-documents.json (100%) rename packages/dpns-contract/src/{v0 => v1}/mod.rs (93%) rename packages/feature-flags-contract/schema/{v0 => v1}/feature-flags-documents.json (100%) rename packages/feature-flags-contract/src/{v0 => v1}/mod.rs (88%) rename packages/masternode-reward-shares-contract/schema/{v0 => v1}/masternode-reward-shares-documents.json (100%) rename packages/masternode-reward-shares-contract/src/{v0 => v1}/mod.rs (87%) rename packages/withdrawals-contract/schema/{v0 => v1}/withdrawals-documents.json (100%) rename packages/withdrawals-contract/src/{v0 => v1}/mod.rs (67%) diff --git a/packages/dashpay-contract/schema/v0/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json similarity index 100% rename from packages/dashpay-contract/schema/v0/dashpay.schema.json rename to packages/dashpay-contract/schema/v1/dashpay.schema.json diff --git a/packages/dashpay-contract/src/lib.rs b/packages/dashpay-contract/src/lib.rs index c3de5d95189..8d443aeaa0a 100644 --- a/packages/dashpay-contract/src/lib.rs +++ b/packages/dashpay-contract/src/lib.rs @@ -1,5 +1,5 @@ mod error; -pub mod v0; +pub mod v1; pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; @@ -18,6 +18,7 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); + pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { match platform_version.system_data_contracts.dashpay { 1 => Ok(None), @@ -30,7 +31,7 @@ pub fn load_definitions(platform_version: &PlatformVersion) -> Result Result { match platform_version.system_data_contracts.dashpay { - 1 => v0::load_documents_schemas(), + 1 => v1::load_documents_schemas(), version => Err(Error::UnknownVersionMismatch { method: "dashpay_contract::load_documents_schemas".to_string(), known_versions: vec![1], diff --git a/packages/dashpay-contract/src/v0/mod.rs b/packages/dashpay-contract/src/v1/mod.rs similarity index 89% rename from packages/dashpay-contract/src/v0/mod.rs rename to packages/dashpay-contract/src/v1/mod.rs index 07278ce1dc7..051b0819aca 100644 --- a/packages/dashpay-contract/src/v0/mod.rs +++ b/packages/dashpay-contract/src/v1/mod.rs @@ -14,6 +14,6 @@ pub mod document_types { } pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../../schema/v0/dashpay.schema.json")) + serde_json::from_str(include_str!("../../schema/v1/dashpay.schema.json")) .map_err(Error::InvalidSchemaJson) } diff --git a/packages/dpns-contract/schema/v0/dpns-contract-documents.json b/packages/dpns-contract/schema/v1/dpns-contract-documents.json similarity index 100% rename from packages/dpns-contract/schema/v0/dpns-contract-documents.json rename to packages/dpns-contract/schema/v1/dpns-contract-documents.json diff --git a/packages/dpns-contract/src/lib.rs b/packages/dpns-contract/src/lib.rs index 2f9e5a22413..6c379e90249 100644 --- a/packages/dpns-contract/src/lib.rs +++ b/packages/dpns-contract/src/lib.rs @@ -1,5 +1,5 @@ mod error; -pub mod v0; +pub mod v1; pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; @@ -30,7 +30,7 @@ pub fn load_definitions(platform_version: &PlatformVersion) -> Result Result { match platform_version.system_data_contracts.withdrawals { - 1 => v0::load_documents_schemas(), + 1 => v1::load_documents_schemas(), version => Err(Error::UnknownVersionMismatch { method: "dpns_contract::load_documents_schemas".to_string(), known_versions: vec![1], diff --git a/packages/dpns-contract/src/v0/mod.rs b/packages/dpns-contract/src/v1/mod.rs similarity index 93% rename from packages/dpns-contract/src/v0/mod.rs rename to packages/dpns-contract/src/v1/mod.rs index 5572064166b..fb2117245e0 100644 --- a/packages/dpns-contract/src/v0/mod.rs +++ b/packages/dpns-contract/src/v1/mod.rs @@ -20,6 +20,6 @@ pub mod document_types { } pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../../schema/v0/dpns-contract-documents.json")) + serde_json::from_str(include_str!("../../schema/v1/dpns-contract-documents.json")) .map_err(Error::InvalidSchemaJson) } diff --git a/packages/feature-flags-contract/schema/v0/feature-flags-documents.json b/packages/feature-flags-contract/schema/v1/feature-flags-documents.json similarity index 100% rename from packages/feature-flags-contract/schema/v0/feature-flags-documents.json rename to packages/feature-flags-contract/schema/v1/feature-flags-documents.json diff --git a/packages/feature-flags-contract/src/lib.rs b/packages/feature-flags-contract/src/lib.rs index c10ceaa1668..a509ebc2e05 100644 --- a/packages/feature-flags-contract/src/lib.rs +++ b/packages/feature-flags-contract/src/lib.rs @@ -1,5 +1,5 @@ mod error; -pub mod v0; +pub mod v1; pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; @@ -18,6 +18,7 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); + pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { match platform_version.system_data_contracts.withdrawals { 1 => Ok(None), @@ -30,7 +31,7 @@ pub fn load_definitions(platform_version: &PlatformVersion) -> Result Result { match platform_version.system_data_contracts.withdrawals { - 1 => v0::load_documents_schemas(), + 1 => v1::load_documents_schemas(), version => Err(Error::UnknownVersionMismatch { method: "feature_flags_contract::load_documents_schemas".to_string(), known_versions: vec![1], diff --git a/packages/feature-flags-contract/src/v0/mod.rs b/packages/feature-flags-contract/src/v1/mod.rs similarity index 88% rename from packages/feature-flags-contract/src/v0/mod.rs rename to packages/feature-flags-contract/src/v1/mod.rs index c4fc58bc3d4..43ccaf608a4 100644 --- a/packages/feature-flags-contract/src/v0/mod.rs +++ b/packages/feature-flags-contract/src/v1/mod.rs @@ -13,6 +13,6 @@ pub mod document_types { } pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../../schema/v0/feature-flags-documents.json")) + serde_json::from_str(include_str!("../../schema/v1/feature-flags-documents.json")) .map_err(Error::InvalidSchemaJson) } diff --git a/packages/masternode-reward-shares-contract/schema/v0/masternode-reward-shares-documents.json b/packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json similarity index 100% rename from packages/masternode-reward-shares-contract/schema/v0/masternode-reward-shares-documents.json rename to packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json diff --git a/packages/masternode-reward-shares-contract/src/lib.rs b/packages/masternode-reward-shares-contract/src/lib.rs index 70ba9bf50d7..124f0e66278 100644 --- a/packages/masternode-reward-shares-contract/src/lib.rs +++ b/packages/masternode-reward-shares-contract/src/lib.rs @@ -1,5 +1,5 @@ mod error; -pub mod v0; +pub mod v1; pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; @@ -31,7 +31,7 @@ pub fn load_definitions(platform_version: &PlatformVersion) -> Result Result { match platform_version.system_data_contracts.withdrawals { - 1 => v0::load_documents_schemas(), + 1 => v1::load_documents_schemas(), version => Err(Error::UnknownVersionMismatch { method: "masternode_reward_shares_contract::load_documents_schemas".to_string(), known_versions: vec![1], diff --git a/packages/masternode-reward-shares-contract/src/v0/mod.rs b/packages/masternode-reward-shares-contract/src/v1/mod.rs similarity index 87% rename from packages/masternode-reward-shares-contract/src/v0/mod.rs rename to packages/masternode-reward-shares-contract/src/v1/mod.rs index bde68053da7..0af222aa0b7 100644 --- a/packages/masternode-reward-shares-contract/src/v0/mod.rs +++ b/packages/masternode-reward-shares-contract/src/v1/mod.rs @@ -14,7 +14,7 @@ pub mod document_types { pub(super) fn load_documents_schemas() -> Result { serde_json::from_str(include_str!( - "../../schema/v0/masternode-reward-shares-documents.json" + "../../schema/v1/masternode-reward-shares-documents.json" )) .map_err(Error::InvalidSchemaJson) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 0ba1d37580c..87786d4a3ea 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -18,7 +18,7 @@ use crate::state_transition::StateTransitionFieldTypes; use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; -use data_contracts::withdrawals_contract::v0::document_types::withdrawal::properties::OUTPUT_SCRIPT; +use data_contracts::withdrawals_contract::v1::document_types::withdrawal::properties::OUTPUT_SCRIPT; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index 5a990ab1d8a..ed44af2ffaf 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -198,7 +198,7 @@ pub fn get_withdrawal_document_fixture( }; let document_type = data_contract.document_type_for_name( - data_contracts::withdrawals_contract::v0::document_types::withdrawal::NAME, + data_contracts::withdrawals_contract::v1::document_types::withdrawal::NAME, )?; let properties = data diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs index 3999a7d0245..e69975245d3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs @@ -9,7 +9,7 @@ use dashcore_rpc::dashcore::{ }; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::identifier::Identifier; use drive::dpp::identity::convert_credits_to_duffs; @@ -125,7 +125,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contracts::withdrawals_contract::v0::document_types::withdrawal; + use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; use dpp::prelude::Identifier; @@ -164,7 +164,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, "transactionIndex": 1u64, }), None, @@ -192,7 +192,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, "transactionIndex": 2u64, }), None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs index 4861ddfa5be..8a218da798d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::document::{Document, DocumentV0Setters}; use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::withdrawals_contract; -use drive::dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::util::hash; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs index 4b963be51c9..07ea80c7fbc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -10,7 +10,7 @@ use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; use drive::grovedb::Transaction; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_execution_context::BlockExecutionContext; @@ -58,7 +58,7 @@ where }; let mut documents = self.drive.fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::WithdrawalStatus::QUEUED.into(), Some(transaction), platform_version, )?; @@ -92,7 +92,7 @@ where document.set_u8( withdrawal::properties::STATUS, - withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, + withdrawals_contract::WithdrawalStatus::POOLED as u8, ); document.set_i64( @@ -235,7 +235,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, "transactionIndex": 1u64, }), None, @@ -263,7 +263,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, "transactionIndex": 2u64, }), None, @@ -292,7 +292,7 @@ mod tests { let updated_documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::POOLED.into(), + withdrawals_contract::WithdrawalStatus::POOLED.into(), Some(&transaction), platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index 104361e34cc..b85ae636bdd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -1,12 +1,12 @@ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::withdrawals_contract::v0::WithdrawalStatus; +use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use std::collections::BTreeMap; @@ -61,7 +61,7 @@ where }; let broadcasted_withdrawal_documents = self.drive.fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::BROADCASTED.into(), + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), Some(transaction), platform_version, )?; @@ -220,7 +220,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::{ @@ -372,7 +372,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Identifier::new([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), @@ -401,7 +401,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 2u64, "transactionSignHeight": 10u64, "transactionId": Identifier::new([3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), @@ -430,7 +430,7 @@ mod tests { let documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::EXPIRED.into(), + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), Some(&transaction), platform_version, ) @@ -445,7 +445,7 @@ mod tests { let documents = platform .drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::COMPLETE.into(), + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), Some(&transaction), platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index eb3432bedb7..954ce1f2ff9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -7,8 +7,8 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; use dpp::errors::ProtocolError; -use dpp::system_data_contracts::feature_flags_contract::v0::document_types::update_consensus_params; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{dashpay_contract, dpns_contract, SystemDataContract}; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 8c836383e11..08b559cd88f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::dashpay_contract::v0::document_types::contact_request::properties +use dpp::system_data_contracts::dashpay_contract::v1::document_types::contact_request::properties ::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index 80f3c4aa0da..419f9b1c9f5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -1,6 +1,6 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::dpns_contract::v0::document_types::domain::properties::PARENT_DOMAIN_NAME; +use dpp::data_contracts::dpns_contract::v1::document_types::domain::properties::PARENT_DOMAIN_NAME; ///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. use dpp::util::hash::hash; use std::collections::BTreeMap; @@ -19,7 +19,7 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::dpns_contract; -use dpp::system_data_contracts::dpns_contract::v0::document_types::domain::properties::{ALLOW_SUBDOMAINS, +use dpp::system_data_contracts::dpns_contract::v1::document_types::domain::properties::{ALLOW_SUBDOMAINS, DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; use dpp::util::strings::convert_to_homograph_safe_chars; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 76daacfc4b7..879fd7f0f60 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -10,7 +10,7 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::feature_flags_contract; -use dpp::system_data_contracts::feature_flags_contract::v0::document_types::update_consensus_params::properties +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params::properties ::PROPERTY_ENABLE_AT_HEIGHT; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs index 9c0885739c8..5fd7a63aa79 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::document::DocumentV0Getters; use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::v0::document_types::reward_share::properties +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types::reward_share::properties ::{PAY_TO_ID, PERCENTAGE}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 72c807783e6..3e6e7937a7c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; @@ -104,8 +104,8 @@ pub fn delete_withdrawal_data_trigger_v0( .get_integer("status") .map_err(ProtocolError::ValueError)?; - if status != withdrawals_contract::v0::WithdrawalStatus::COMPLETE as u8 - || status != withdrawals_contract::v0::WithdrawalStatus::EXPIRED as u8 + if status != withdrawals_contract::WithdrawalStatus::COMPLETE as u8 + || status != withdrawals_contract::WithdrawalStatus::EXPIRED as u8 { let err = DataTriggerConditionError::new( data_contract.id(), @@ -218,7 +218,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": (0..23).collect::>(), - "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Bytes32::new([1;32]), @@ -272,7 +272,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": (0..23).collect::>(), - "status": withdrawals_contract::v0::WithdrawalStatus::BROADCASTED as u8, + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, "transactionId": Bytes32::new([1;32]), diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index b0fcdb5af46..d54805b3326 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -47,7 +47,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::document::{DocumentV0, INITIAL_REVISION}; use dpp::identity::accessors::IdentityGettersV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::v0::document_types; +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types; use dpp::version::PlatformVersion; use drive::common::identities::create_test_identity_with_rng; use drive::dpp::document::Document; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 862d2cae919..44cd90455e2 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -14,7 +14,7 @@ use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::prelude::Identifier; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::data_contracts::SystemDataContract; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs index 0cc511c7526..998e3c296fe 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs @@ -5,7 +5,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::Document; use dpp::platform_value::Value; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use grovedb::TransactionArg; use indexmap::IndexMap; @@ -141,7 +141,7 @@ impl Drive { WhereClause { field: withdrawal::properties::STATUS.to_string(), operator: crate::query::WhereOperator::Equal, - value: Value::U8(withdrawals_contract::v0::WithdrawalStatus::POOLED as u8), + value: Value::U8(withdrawals_contract::WithdrawalStatus::POOLED as u8), }, ); @@ -193,7 +193,7 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -214,7 +214,7 @@ mod tests { let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::WithdrawalStatus::QUEUED.into(), Some(&transaction), platform_version, ) @@ -232,7 +232,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::QUEUED as u8, + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, "transactionIndex": 1u64, }), None, @@ -260,7 +260,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::POOLED, + "status": withdrawals_contract::WithdrawalStatus::POOLED, "transactionIndex": 2u64, }), None, @@ -278,7 +278,7 @@ mod tests { let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::QUEUED.into(), + withdrawals_contract::WithdrawalStatus::QUEUED.into(), Some(&transaction), platform_version, ) @@ -288,7 +288,7 @@ mod tests { let documents = drive .fetch_withdrawal_documents_by_status( - withdrawals_contract::v0::WithdrawalStatus::POOLED.into(), + withdrawals_contract::WithdrawalStatus::POOLED.into(), Some(&transaction), platform_version, ) @@ -303,7 +303,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::{platform_value, Bytes32}; - use dpp::system_data_contracts::withdrawals_contract::v0::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -334,7 +334,7 @@ mod tests { "coreFeePerByte": 1u32, "pooling": Pooling::Never as u8, "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::v0::WithdrawalStatus::POOLED as u8, + "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, "transactionIndex": 1u64, "transactionId": Bytes32::default(), }), diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 0dd755a2753..9cebee40643 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -1,6 +1,6 @@ use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use dpp::data_contracts::withdrawals_contract; -use dpp::data_contracts::withdrawals_contract::v0::document_types::withdrawal; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::{Document, DocumentV0}; use dpp::platform_value::platform_value; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; @@ -24,7 +24,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { withdrawal::properties::CORE_FEE_PER_BYTE: identity_credit_withdrawal.core_fee_per_byte, withdrawal::properties::POOLING: Pooling::Never, withdrawal::properties::OUTPUT_SCRIPT: identity_credit_withdrawal.output_script.as_bytes(), - withdrawal::properties::STATUS: withdrawals_contract::v0::WithdrawalStatus::QUEUED, + withdrawal::properties::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, }); let withdrawal_document = DocumentV0 { diff --git a/packages/withdrawals-contract/schema/v0/withdrawals-documents.json b/packages/withdrawals-contract/schema/v1/withdrawals-documents.json similarity index 100% rename from packages/withdrawals-contract/schema/v0/withdrawals-documents.json rename to packages/withdrawals-contract/schema/v1/withdrawals-documents.json diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index f266cc6c0bf..acb8703c54b 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -1,10 +1,12 @@ pub use crate::error::Error; +use num_enum::{IntoPrimitive, TryFromPrimitive}; use platform_value::{Identifier, IdentifierBytes32}; use platform_version::version::PlatformVersion; use serde_json::Value; +use serde_repr::{Deserialize_repr, Serialize_repr}; mod error; -pub mod v0; +pub mod v1; pub const ID_BYTES: [u8; 32] = [ 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, @@ -19,6 +21,27 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); +// @append_only +#[repr(u8)] +#[derive( + Serialize_repr, + Deserialize_repr, + PartialEq, + Eq, + Clone, + Copy, + Debug, + TryFromPrimitive, + IntoPrimitive, +)] +pub enum WithdrawalStatus { + QUEUED = 0, + POOLED = 1, + BROADCASTED = 2, + COMPLETE = 3, + EXPIRED = 4, +} + pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { match platform_version.system_data_contracts.withdrawals { 1 => Ok(None), @@ -31,7 +54,7 @@ pub fn load_definitions(platform_version: &PlatformVersion) -> Result Result { match platform_version.system_data_contracts.withdrawals { - 1 => v0::load_documents_schemas(), + 1 => v1::load_documents_schemas(), version => Err(Error::UnknownVersionMismatch { method: "withdrawals_contract::load_documents_schemas".to_string(), known_versions: vec![1], diff --git a/packages/withdrawals-contract/src/v0/mod.rs b/packages/withdrawals-contract/src/v1/mod.rs similarity index 67% rename from packages/withdrawals-contract/src/v0/mod.rs rename to packages/withdrawals-contract/src/v1/mod.rs index 8c79acada35..df86928bb1e 100644 --- a/packages/withdrawals-contract/src/v0/mod.rs +++ b/packages/withdrawals-contract/src/v1/mod.rs @@ -1,7 +1,5 @@ use crate::error::Error; -use num_enum::{IntoPrimitive, TryFromPrimitive}; use serde_json::Value; -use serde_repr::{Deserialize_repr, Serialize_repr}; pub mod document_types { pub mod withdrawal { @@ -23,29 +21,7 @@ pub mod document_types { } } -// @append_only -#[repr(u8)] -#[derive( - Serialize_repr, - Deserialize_repr, - PartialEq, - Eq, - Clone, - Copy, - Debug, - TryFromPrimitive, - IntoPrimitive, -)] - -pub enum WithdrawalStatus { - QUEUED = 0, - POOLED = 1, - BROADCASTED = 2, - COMPLETE = 3, - EXPIRED = 4, -} - pub(super) fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../../schema/v0/withdrawals-documents.json")) + serde_json::from_str(include_str!("../../schema/v1/withdrawals-documents.json")) .map_err(Error::InvalidSchemaJson) } From debf03a2d82cae2c4fe53e8bcc7e9e17011b9ad0 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 23 Jan 2024 17:57:38 +0700 Subject: [PATCH 5/7] fix: invalid schema require path --- packages/bench-suite/benchmarks/basicValidation.js | 2 +- packages/bench-suite/benchmarks/documents/dpns.js | 2 +- packages/dashpay-contract/test/unit/schema.spec.js | 2 +- packages/dpns-contract/test/unit/dpnsContract.spec.js | 2 +- .../test/unit/featureFlagsContract.spec.js | 2 +- .../test/unit/masternodeRewardSharesContract.spec.js | 2 +- .../withdrawals-contract/test/unit/withdrawalsContract.spec.js | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bench-suite/benchmarks/basicValidation.js b/packages/bench-suite/benchmarks/basicValidation.js index 5a26fe81cff..40c0944241c 100644 --- a/packages/bench-suite/benchmarks/basicValidation.js +++ b/packages/bench-suite/benchmarks/basicValidation.js @@ -1,6 +1,6 @@ const { PrivateKey } = require('@dashevo/dashcore-lib'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v0/dpns-contract-documents.json'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); // const { DashPlatformProtocol, Identity, Identifier, default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/bench-suite/benchmarks/documents/dpns.js b/packages/bench-suite/benchmarks/documents/dpns.js index e210558d35c..a1062007b1b 100644 --- a/packages/bench-suite/benchmarks/documents/dpns.js +++ b/packages/bench-suite/benchmarks/documents/dpns.js @@ -1,6 +1,6 @@ const crypto = require('crypto'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v0/dpns-contract-documents.json'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/dashpay-contract/test/unit/schema.spec.js b/packages/dashpay-contract/test/unit/schema.spec.js index e97e2e25751..1d7523d2964 100644 --- a/packages/dashpay-contract/test/unit/schema.spec.js +++ b/packages/dashpay-contract/test/unit/schema.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const crypto = require('crypto'); const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const schema = require('../../schema/v0/dashpay.schema.json'); +const schema = require('../../schema/v1/dashpay.schema.json'); const whitepaperMasternodeText = 'Full nodes are servers running on a P2P network that allow peers to use them to receive updates about the events on the network. These nodes utilize significant amounts of traffic and other resources that incur a substantial cost. As a result, a steady decrease in the amount of these nodes has been observed for some time on the Bitcoin network and as a result, block propagation times have been upwards of 40 seconds. Many solutions have been proposed such as a new reward scheme by Microsoft Research and the Bitnodes incentive program'; const encoded32Chars = '4fafc98bbfe597f7ba2c9f767d52036d'; diff --git a/packages/dpns-contract/test/unit/dpnsContract.spec.js b/packages/dpns-contract/test/unit/dpnsContract.spec.js index cb5d0edb8a1..e0b4c46f555 100644 --- a/packages/dpns-contract/test/unit/dpnsContract.spec.js +++ b/packages/dpns-contract/test/unit/dpnsContract.spec.js @@ -6,7 +6,7 @@ const { const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const { expect } = require('chai'); -const dpnsContractDocumentsSchema = require('../../schema/v0/dpns-contract-documents.json'); +const dpnsContractDocumentsSchema = require('../../schema/v1/dpns-contract-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js index 7aef0a4ee10..217a5122b5d 100644 --- a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js +++ b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const featureFlagsContractDocumentsSchema = require('../../schema/v0/feature-flags-documents.json'); +const featureFlagsContractDocumentsSchema = require('../../schema/v1/feature-flags-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js index 980373db7bd..adac76bbe92 100644 --- a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js +++ b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const rewardSharingContractSchema = require('../../schema/v0/masternode-reward-shares-documents.json'); +const rewardSharingContractSchema = require('../../schema/v1/masternode-reward-shares-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 0cfe0a8c797..7f1d638a0cd 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const withdrawalContractDocumentsSchema = require('../../schema/v0/withdrawals-documents.json'); +const withdrawalContractDocumentsSchema = require('../../schema/v1/withdrawals-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); From bc34645986ea0032a7c4c5ace51cd5d5242fd879 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sun, 28 Jan 2024 23:38:42 +0700 Subject: [PATCH 6/7] chore: use static cache --- .../v0/mod.rs | 8 +- .../create_genesis_state/v0/mod.rs | 28 ++----- packages/rs-drive-abci/src/main.rs | 2 +- .../src/platform_types/platform/mod.rs | 11 +-- .../tests/strategy_tests/failures.rs | 11 +-- .../drive/batch/drive_op_batch/document.rs | 8 +- .../src/drive/cache/system_contracts_cache.rs | 73 ++++++------------- packages/rs-drive/src/drive/defaults.rs | 2 +- .../rs-drive/src/drive/document/delete/mod.rs | 2 +- packages/rs-drive/src/drive/open/mod.rs | 24 ++++-- .../fetch_current_protocol_version.rs | 11 ++- packages/rs-drive/src/query/mod.rs | 2 +- packages/rs-drive/src/tests/helpers/setup.rs | 2 +- 13 files changed, 77 insertions(+), 107 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 4fa90a88f2f..010c5e7f777 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -34,17 +34,13 @@ impl Platform { ) -> Result, Error> { let cache = self.drive.cache.read().unwrap(); - let masternode_rewards_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::MasternodeRewards, platform_version)?; - - drop(cache); + let masternode_rewards_contract = &cache.system_data_contracts.masternode_reward_shares; let document_type = masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; let drive_query = DriveQuery { - contract: &masternode_rewards_contract, + contract: masternode_rewards_contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index a281d2bdf66..da78767ba37 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -83,33 +83,18 @@ impl Platform { let cache = self.drive.cache.read().unwrap(); - let dpns_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::DPNS, platform_version)?; - let withdrawals_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::Withdrawals, platform_version)?; - let dashpay_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::Dashpay, platform_version)?; - let masternode_rewards_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::MasternodeRewards, platform_version)?; - - drop(cache); - let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - dpns_contract.clone(), + cache.system_data_contracts.dpns.clone(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - withdrawals_contract, + cache.system_data_contracts.withdrawals.clone(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -127,14 +112,14 @@ impl Platform { ( SystemDataContract::Dashpay, ( - dashpay_contract, + cache.system_data_contracts.dashpay.clone(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - masternode_rewards_contract, + cache.system_data_contracts.masternode_reward_shares.clone(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), @@ -189,7 +174,10 @@ impl Platform { self.register_system_identity_operations(identity, &mut operations); } - self.register_dpns_top_level_domain_operations(&dpns_contract, &mut operations)?; + self.register_dpns_top_level_domain_operations( + &cache.system_data_contracts.dpns, + &mut operations, + )?; let block_info = BlockInfo::default_with_time(genesis_time); diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index dec4bc0a6e5..40c71f7e4ce 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -372,7 +372,7 @@ mod test { let path = tempdir.join("db"); fs::create_dir(&path).expect("create db dir"); - let drive = Drive::open(&path, None).expect("open drive"); + let (drive, _) = Drive::open(&path, None).expect("open drive"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 54c9f8cea4b..4ab7ecfe28c 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -7,7 +7,7 @@ use std::fmt::{Debug, Formatter}; #[cfg(any(feature = "mocks", test))] use crate::rpc::core::MockCoreRPCLike; -use drive::drive::defaults::PROTOCOL_VERSION; +use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; use std::sync::RwLock; @@ -176,9 +176,10 @@ impl Platform { { let config = config.unwrap_or(PlatformConfig::default_testnet()); - let drive = Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; + let (drive, current_protocol_version) = + Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; - if let Some(protocol_version) = drive.fetch_current_protocol_version(None)? { + if let Some(protocol_version) = current_protocol_version { let platform_version = PlatformVersion::get(protocol_version)?; let Some(execution_state) = @@ -201,8 +202,8 @@ impl Platform { drive, core_rpc, config, - PROTOCOL_VERSION, - PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 9badb57e867..a51b98ec7cc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -263,12 +263,7 @@ mod tests { .read() .expect("expected to get a read lock on the cache"); - let dpns_contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::DPNS, &platform_version) - .expect("expected to get dpns contract"); - - drop(cache); + let dpns_contract = &cache.system_data_contracts.dpns; let dpns_contract_for_type = dpns_contract.clone(); @@ -300,7 +295,7 @@ mod tests { }; let document_op_2 = DocumentOp { - contract: dpns_contract, + contract: dpns_contract.clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -368,6 +363,8 @@ mod tests { ..Default::default() }; + drop(cache); + // On the first block we only have identities and contracts let outcome = run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 15); diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 44cd90455e2..b5fc6a27725 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -250,17 +250,13 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { } => { let cache = drive.cache.read().expect("should get cache lock"); - let contract = cache - .system_data_contracts - .get_or_load(SystemDataContract::Withdrawals, platform_version)?; - - drop(cache); + let contract = &cache.system_data_contracts.withdrawals; let document_type = contract.document_type_for_name(withdrawal::NAME)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, - contract: &contract, + contract, document_type, }; drive.add_document_for_contract_operations( diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs index b194517787b..d9a4af3288d 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs @@ -1,63 +1,36 @@ use crate::error::Error; use dpp::data_contract::DataContract; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; -use moka::sync::Cache; use platform_version::version::PlatformVersion; -#[derive(Hash, Eq, PartialEq, Clone)] -struct DataContractTypeAndVersion { - contract: SystemDataContract, - version: u32, -} - /// System contracts pub struct SystemDataContracts { - contracts: Cache, + /// Withdrawal contract + pub withdrawals: DataContract, + /// DPNS contract + pub dpns: DataContract, + /// Dashpay contract + pub dashpay: DataContract, + /// Masternode reward shares contract + pub masternode_reward_shares: DataContract, } impl SystemDataContracts { - /// Create a new SystemDataContracts - pub fn new() -> Self { - Self { - contracts: Cache::new(50), - } - } - /// Retrieves a `DataContract` from the cache, or loads it if not already present. - /// - /// This function takes a `SystemDataContract` and a reference to a `PlatformVersion` as arguments. - /// It constructs a key using the `contract` and the `withdrawals` field of `system_data_contracts` - /// in `platform_version`. If the `contracts` cache does not contain the key, it loads the system data contract - /// using the `load_system_data_contract` function and inserts it into `contracts`. - /// - /// # Arguments - /// - /// * `contract` - A `SystemDataContract` that specifies the type of contract to retrieve or load. - /// * `platform_version` - A reference to a `PlatformVersion` used to determine the version of the contract. - /// - /// # Returns - /// - /// * `Result` - A result that contains a reference to the `DataContract` if successful, - /// or an `Error` if the loading operation fails. - /// - /// # Panics - /// - /// This function will panic if it tries to retrieve a `DataContract` from `contracts` that does not exist. - /// However, this should never happen because the function ensures the `DataContract` is loaded - pub fn get_or_load( - &self, - contract: SystemDataContract, + /// load genesis system contracts + pub fn load_genesis_system_contracts( platform_version: &PlatformVersion, - ) -> Result { - let key = DataContractTypeAndVersion { - contract, - version: platform_version.system_data_contracts.withdrawals as u32, - }; - - if !self.contracts.contains_key(&key) { - let data_contract = load_system_data_contract(contract, platform_version)?; - self.contracts.insert(key.clone(), data_contract); - } - - Ok(self.contracts.get(&key).unwrap()) + ) -> Result { + Ok(Self { + withdrawals: load_system_data_contract( + SystemDataContract::Withdrawals, + platform_version, + )?, + dpns: load_system_data_contract(SystemDataContract::DPNS, platform_version)?, + dashpay: load_system_data_contract(SystemDataContract::Dashpay, platform_version)?, + masternode_reward_shares: load_system_data_contract( + SystemDataContract::MasternodeRewards, + platform_version, + )?, + }) } } diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 3440843d64f..8dc5e8385b2 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -33,7 +33,7 @@ //! /// Protocol version -pub const PROTOCOL_VERSION: u32 = 1; +pub const INITIAL_PROTOCOL_VERSION: u32 = 1; ///DataContract Documents subtree path height pub const CONTRACT_DOCUMENTS_PATH_HEIGHT: u16 = 4; /// Base contract root path size diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index a43971fef05..8f88c41c9a6 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -119,7 +119,7 @@ mod tests { fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index adbb7db7a42..457b88f4e70 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -1,8 +1,11 @@ use crate::drive::cache::SystemDataContracts; use crate::drive::cache::{DataContractCache, DriveCache, ProtocolVersionsCache}; use crate::drive::config::DriveConfig; +use crate::drive::defaults::INITIAL_PROTOCOL_VERSION; use crate::drive::Drive; use crate::error::Error; +use dpp::errors::ProtocolError; +use dpp::util::deserializer::ProtocolVersion; use grovedb::GroveDb; use platform_version::version::PlatformVersion; use std::path::Path; @@ -24,7 +27,10 @@ impl Drive { /// /// * `Result` - On success, returns `Ok(Self)`, where `Self` is a `Drive` instance. On error, returns an `Error`. /// - pub fn open>(path: P, config: Option) -> Result { + pub fn open>( + path: P, + config: Option, + ) -> Result<(Self, Option), Error> { match GroveDb::open(path) { Ok(grove) => { let config = config.unwrap_or_default(); @@ -32,12 +38,16 @@ impl Drive { let data_contracts_global_cache_size = config.data_contracts_global_cache_size; let data_contracts_block_cache_size = config.data_contracts_block_cache_size; + let protocol_version = + Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + + let platform_version = + PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) + .map_err(ProtocolError::PlatformVersionError)?; + let drive = Drive { grove, config, - // system_contracts: SystemContracts::load_genesis_system_contracts( - // platform_version.protocol_version, - // )?, cache: RwLock::new(DriveCache { cached_contracts: DataContractCache::new( data_contracts_global_cache_size, @@ -45,11 +55,13 @@ impl Drive { ), genesis_time_ms, protocol_versions_counter: ProtocolVersionsCache::new(), - system_data_contracts: SystemDataContracts::new(), + system_data_contracts: SystemDataContracts::load_genesis_system_contracts( + platform_version, + )?, }), }; - Ok(drive) + Ok((drive, protocol_version)) } Err(e) => Err(Error::GroveDB(e)), } diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs index 2a38de6766d..fbd2e81b45a 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs @@ -5,7 +5,7 @@ use crate::error::Error; use crate::drive::system::misc_path; use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; use dpp::util::deserializer::ProtocolVersion; -use grovedb::TransactionArg; +use grovedb::{GroveDb, TransactionArg}; use integer_encoding::VarInt; /// @@ -33,9 +33,16 @@ impl Drive { pub fn fetch_current_protocol_version( &self, transaction: TransactionArg, + ) -> Result, Error> { + Drive::fetch_current_protocol_version_with_grovedb(&self.grove, transaction) + } + + pub(crate) fn fetch_current_protocol_version_with_grovedb( + grove: &GroveDb, + transaction: TransactionArg, ) -> Result, Error> { let misc_path = misc_path(); - self.grove + grove .get_raw_optional( (&misc_path).into(), PROTOCOL_VERSION_STORAGE_KEY, diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 7217e72c101..0529cedbe32 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1974,7 +1974,7 @@ mod tests { fn setup_family_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/tests/helpers/setup.rs b/packages/rs-drive/src/tests/helpers/setup.rs index a62e55de431..7eaacc586f1 100644 --- a/packages/rs-drive/src/tests/helpers/setup.rs +++ b/packages/rs-drive/src/tests/helpers/setup.rs @@ -65,7 +65,7 @@ impl Default for SetupFeePoolsOptions { pub fn setup_drive(drive_config: Option) -> Drive { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); drive } From eb5b114aa8dcadf8d334c06e595fa6d0ba1469af Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 29 Jan 2024 16:22:24 +0700 Subject: [PATCH 7/7] test: resolve dead lock --- .../initialization/create_genesis_state/v0/mod.rs | 9 +++++---- packages/rs-drive-abci/tests/strategy_tests/failures.rs | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index da78767ba37..8c034f320a6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -83,6 +83,8 @@ impl Platform { let cache = self.drive.cache.read().unwrap(); + let dpns_data_contract = cache.system_data_contracts.dpns.clone(); + let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, @@ -125,6 +127,8 @@ impl Platform { ), ]); + drop(cache); + for (_, (data_contract, identity_public_keys_set)) in system_data_contract_types { let public_keys = [ ( @@ -174,10 +178,7 @@ impl Platform { self.register_system_identity_operations(identity, &mut operations); } - self.register_dpns_top_level_domain_operations( - &cache.system_data_contracts.dpns, - &mut operations, - )?; + self.register_dpns_top_level_domain_operations(&dpns_data_contract, &mut operations)?; let block_info = BlockInfo::default_with_time(genesis_time); diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index a51b98ec7cc..bf8df7f8a4a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -263,7 +263,9 @@ mod tests { .read() .expect("expected to get a read lock on the cache"); - let dpns_contract = &cache.system_data_contracts.dpns; + let dpns_contract = cache.system_data_contracts.dpns.clone(); + + drop(cache); let dpns_contract_for_type = dpns_contract.clone(); @@ -295,7 +297,7 @@ mod tests { }; let document_op_2 = DocumentOp { - contract: dpns_contract.clone(), + contract: dpns_contract, action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -363,8 +365,6 @@ mod tests { ..Default::default() }; - drop(cache); - // On the first block we only have identities and contracts let outcome = run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 15);