dpp/document/v0/serialize/
mod.rs1use crate::data_contract::document_type::DocumentTypeRef;
2use crate::data_contract::errors::DataContractError;
3
4#[cfg(feature = "validation")]
5use crate::prelude::ConsensusValidationResult;
6
7use crate::prelude::DataContract;
8
9use crate::ProtocolError;
10
11use crate::document::serialization_traits::deserialize::v0::DocumentPlatformDeserializationMethodsV0;
12use crate::document::serialization_traits::serialize::v0::DocumentPlatformSerializationMethodsV0;
13use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0;
14use crate::document::v0::DocumentV0;
15use crate::version::PlatformVersion;
16use integer_encoding::VarIntReader;
17
18use platform_version::version::FeatureVersion;
19
20use crate::consensus::basic::decode::DecodingError;
21#[cfg(feature = "validation")]
22use crate::consensus::basic::BasicError;
23#[cfg(feature = "validation")]
24use crate::consensus::ConsensusError;
25use crate::data_contract::accessors::v0::DataContractV0Getters;
26use crate::data_contract::config::DataContractConfig;
27
28mod v0;
29mod v1;
30mod v2;
31mod v3;
32
33impl DocumentPlatformSerializationMethodsV0 for DocumentV0 {
38 fn serialize_v0(&self, document_type: DocumentTypeRef) -> Result<Vec<u8>, ProtocolError> {
40 DocumentV0::serialize_v0(self, document_type)
41 }
42
43 fn serialize_v1(&self, document_type: DocumentTypeRef) -> Result<Vec<u8>, ProtocolError> {
45 DocumentV0::serialize_v1(self, document_type)
46 }
47
48 fn serialize_v2(&self, document_type: DocumentTypeRef) -> Result<Vec<u8>, ProtocolError> {
50 DocumentV0::serialize_v2(self, document_type)
51 }
52
53 fn serialize_v3(&self, document_type: DocumentTypeRef) -> Result<Vec<u8>, ProtocolError> {
55 DocumentV0::serialize_v3(self, document_type)
56 }
57}
58
59impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 {
60 fn from_bytes_v0(
62 serialized_document: &[u8],
63 document_type: DocumentTypeRef,
64 platform_version: &PlatformVersion,
65 ) -> Result<Self, DataContractError> {
66 DocumentV0::from_bytes_v0(serialized_document, document_type, platform_version)
67 }
68
69 fn from_bytes_v1(
71 serialized_document: &[u8],
72 document_type: DocumentTypeRef,
73 platform_version: &PlatformVersion,
74 ) -> Result<Self, DataContractError> {
75 DocumentV0::from_bytes_v1(serialized_document, document_type, platform_version)
76 }
77
78 fn from_bytes_v2(
80 serialized_document: &[u8],
81 document_type: DocumentTypeRef,
82 platform_version: &PlatformVersion,
83 ) -> Result<Self, DataContractError> {
84 DocumentV0::from_bytes_v2(serialized_document, document_type, platform_version)
85 }
86
87 fn from_bytes_v3(
89 serialized_document: &[u8],
90 document_type: DocumentTypeRef,
91 platform_version: &PlatformVersion,
92 ) -> Result<Self, DataContractError> {
93 DocumentV0::from_bytes_v3(serialized_document, document_type, platform_version)
94 }
95}
96
97impl DocumentPlatformConversionMethodsV0 for DocumentV0 {
98 fn serialize(
103 &self,
104 document_type: DocumentTypeRef,
105 contract: &DataContract,
106 platform_version: &PlatformVersion,
107 ) -> Result<Vec<u8>, ProtocolError> {
108 if matches!(contract, DataContract::V0(_))
109 || matches!(contract.config(), DataContractConfig::V0(_))
110 {
111 self.serialize_v0(document_type)
117 } else {
118 match platform_version
119 .dpp
120 .document_versions
121 .document_serialization_version
122 .default_current_version
123 {
124 0 => self.serialize_v0(document_type),
128 1 => self.serialize_v1(document_type),
132 2 => self.serialize_v2(document_type),
137 3 => self.serialize_v3(document_type),
141 version => Err(ProtocolError::UnknownVersionMismatch {
142 method: "DocumentV0::serialize".to_string(),
143 known_versions: vec![0, 1, 2, 3],
144 received: version,
145 }),
146 }
147 }
148 }
149
150 fn serialize_specific_version(
151 &self,
152 document_type: DocumentTypeRef,
153 contract: &DataContract,
154 feature_version: FeatureVersion,
155 ) -> Result<Vec<u8>, ProtocolError> {
156 if (matches!(contract, DataContract::V0(_))
157 || matches!(contract.config(), DataContractConfig::V0(_)))
158 && feature_version != 0
159 {
160 return Err(ProtocolError::NotSupported("Serializing with data contract version 0 or data contract config version 0 is not supported outside of feature version 0".to_string()));
166 };
167 if feature_version < 3 && (self.moderated_at.is_some() || self.moderated_by.is_some()) {
172 return Err(ProtocolError::NotSupported(format!(
173 "document serialization format {feature_version} has no place for \
174 $moderatedAt or $moderatedBy; serialize a moderated document in format 3"
175 )));
176 }
177 match feature_version {
178 0 => self.serialize_v0(document_type),
179 1 => self.serialize_v1(document_type),
180 2 => self.serialize_v2(document_type),
181 3 => self.serialize_v3(document_type),
182 version => Err(ProtocolError::UnknownVersionMismatch {
183 method: "DocumentV0::serialize".to_string(),
184 known_versions: vec![0, 1, 2, 3],
185 received: version,
186 }),
187 }
188 }
189
190 fn from_bytes(
192 mut serialized_document: &[u8],
193 document_type: DocumentTypeRef,
194 platform_version: &PlatformVersion,
195 ) -> Result<Self, ProtocolError> {
196 let serialized_version = serialized_document.read_varint().map_err(|_| {
197 DataContractError::DecodingDocumentError(DecodingError::new(
198 "error reading revision from serialized document for revision".to_string(),
199 ))
200 })?;
201 match serialized_version {
202 0 => {
203 match DocumentV0::from_bytes_v0(
204 serialized_document,
205 document_type,
206 platform_version,
207 )
208 .map_err(ProtocolError::DataContractError)
209 {
210 Ok(document) => Ok(document),
211 Err(first_err) => {
212 match DocumentV0::from_bytes_v1(
218 serialized_document,
219 document_type,
220 platform_version,
221 ) {
222 Ok(document_from_version_1_deserialization) => {
223 Ok(document_from_version_1_deserialization)
224 }
225 Err(_) => Err(first_err),
226 }
227 }
228 }
229 }
230 1 => DocumentV0::from_bytes_v1(serialized_document, document_type, platform_version)
231 .map_err(ProtocolError::DataContractError),
232 2 => DocumentV0::from_bytes_v2(serialized_document, document_type, platform_version)
233 .map_err(ProtocolError::DataContractError),
234 3 => DocumentV0::from_bytes_v3(serialized_document, document_type, platform_version)
235 .map_err(ProtocolError::DataContractError),
236 version => Err(ProtocolError::UnknownVersionMismatch {
237 method: "Document::from_bytes (deserialization)".to_string(),
238 known_versions: vec![0, 1, 2, 3],
239 received: version,
240 }),
241 }
242 }
243
244 #[cfg(feature = "validation")]
246 fn from_bytes_in_consensus(
247 mut serialized_document: &[u8],
248 document_type: DocumentTypeRef,
249 platform_version: &PlatformVersion,
250 ) -> Result<ConsensusValidationResult<Self>, ProtocolError> {
251 let serialized_version = serialized_document.read_varint().map_err(|_| {
252 DataContractError::DecodingDocumentError(DecodingError::new(
253 "error reading revision from serialized document for revision".to_string(),
254 ))
255 })?;
256 match serialized_version {
257 0 => {
258 match DocumentV0::from_bytes_v0(
259 serialized_document,
260 document_type,
261 platform_version,
262 ) {
263 Ok(document) => Ok(ConsensusValidationResult::new_with_data(document)),
264 Err(first_err) => {
265 match DocumentV0::from_bytes_v1(
271 serialized_document,
272 document_type,
273 platform_version,
274 ) {
275 Ok(document_from_version_1_deserialization) => {
276 Ok(ConsensusValidationResult::new_with_data(
277 document_from_version_1_deserialization,
278 ))
279 }
280 Err(_) => Ok(ConsensusValidationResult::new_with_error(
281 ConsensusError::BasicError(BasicError::ContractError(first_err)),
282 )),
283 }
284 }
285 }
286 }
287 1 => {
288 match DocumentV0::from_bytes_v1(
289 serialized_document,
290 document_type,
291 platform_version,
292 ) {
293 Ok(document) => Ok(ConsensusValidationResult::new_with_data(document)),
294 Err(err) => Ok(ConsensusValidationResult::new_with_error(
295 ConsensusError::BasicError(BasicError::ContractError(err)),
296 )),
297 }
298 }
299 2 => {
300 match DocumentV0::from_bytes_v2(
301 serialized_document,
302 document_type,
303 platform_version,
304 ) {
305 Ok(document) => Ok(ConsensusValidationResult::new_with_data(document)),
306 Err(err) => Ok(ConsensusValidationResult::new_with_error(
307 ConsensusError::BasicError(BasicError::ContractError(err)),
308 )),
309 }
310 }
311 3 => {
312 match DocumentV0::from_bytes_v3(
313 serialized_document,
314 document_type,
315 platform_version,
316 ) {
317 Ok(document) => Ok(ConsensusValidationResult::new_with_data(document)),
318 Err(err) => Ok(ConsensusValidationResult::new_with_error(
319 ConsensusError::BasicError(BasicError::ContractError(err)),
320 )),
321 }
322 }
323 version => Err(ProtocolError::UnknownVersionMismatch {
324 method: "Document::from_bytes (deserialization)".to_string(),
325 known_versions: vec![0, 1, 2, 3],
326 received: version,
327 }),
328 }
329 }
330}
331
332#[cfg(test)]
333mod tests;