elements/pset/
serialize.rs1use std::convert::TryFrom;
21use std::io;
22
23use crate::confidential::{self, AssetBlindingFactor};
24use crate::encode::{
25 self, deserialize, deserialize_partial, serialize, Decodable, Encodable, VarInt,
26};
27use crate::hashes::{hash160, ripemd160, sha256, sha256d, Hash};
28use crate::hex::ToHex;
29use crate::{AssetId, BlockHash, Script, Transaction, TxOut, Txid};
30use bitcoin;
31use bitcoin::bip32::{ChildNumber, Fingerprint, KeySource};
32use bitcoin::{key::XOnlyPublicKey, PublicKey};
33use secp256k1_zkp::{self, RangeProof, SurjectionProof, Tweak};
34
35use super::map::{PsbtSighashType, TapTree};
36use crate::schnorr;
37use crate::taproot::{ControlBlock, LeafVersion, TapLeafHash, TapNodeHash};
38
39use crate::sighash::SchnorrSighashType;
40use crate::taproot::TaprootBuilder;
41
42pub trait Serialize {
45 fn serialize(&self) -> Vec<u8>;
47}
48
49pub trait Deserialize: Sized {
51 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error>;
53}
54
55pub fn serialize_hex<T: Serialize + ?Sized>(data: &T) -> String {
57 Serialize::serialize(data)[..].to_hex()
58}
59
60impl_pset_de_serialize!(Transaction);
61impl_pset_de_serialize!(TxOut);
62impl_pset_de_serialize!(AssetId);
63impl_pset_de_serialize!(u8);
64impl_pset_de_serialize!(u32);
65impl_pset_de_serialize!(u64);
66impl_pset_de_serialize!(crate::LockTime);
67impl_pset_de_serialize!(crate::Sequence);
68impl_pset_de_serialize!(crate::locktime::Height);
69impl_pset_de_serialize!(crate::locktime::Time);
70impl_pset_de_serialize!([u8; 32]);
71impl_pset_de_serialize!(Vec<Vec<u8>>); impl_pset_hash_de_serialize!(Txid);
73impl_pset_hash_de_serialize!(ripemd160::Hash);
74impl_pset_hash_de_serialize!(sha256::Hash);
75impl_pset_hash_de_serialize!(hash160::Hash);
76impl_pset_hash_de_serialize!(sha256d::Hash);
77impl_pset_hash_de_serialize!(BlockHash);
78impl_pset_hash_de_serialize!(TapLeafHash);
79impl_pset_hash_de_serialize!(TapNodeHash);
80
81impl Deserialize for bitcoin::Transaction {
83 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
84 Ok(bitcoin::consensus::encode::deserialize(bytes)?)
85 }
86}
87impl Serialize for bitcoin::Transaction {
88 fn serialize(&self) -> Vec<u8> {
89 bitcoin::consensus::encode::serialize(self)
90 }
91}
92
93impl_pset_de_serialize!(Vec<TapLeafHash>);
95
96impl Serialize for VarInt {
97 fn serialize(&self) -> Vec<u8> {
98 let mut v = vec![];
99 self.consensus_encode(&mut v).expect("vec don't errors");
100 v
101 }
102}
103
104impl Deserialize for VarInt {
105 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
106 VarInt::consensus_decode(bytes)
107 }
108}
109
110impl Serialize for Tweak {
111 fn serialize(&self) -> Vec<u8> {
112 encode::serialize(self.as_ref())
113 }
114}
115
116impl Deserialize for Tweak {
117 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
118 let x = deserialize::<[u8; 32]>(bytes)?;
119 Tweak::from_slice(&x).map_err(|_| encode::Error::ParseFailed("invalid Tweak"))
120 }
121}
122
123impl Serialize for AssetBlindingFactor {
124 fn serialize(&self) -> Vec<u8> {
125 encode::serialize(self.into_inner().as_ref())
126 }
127}
128
129impl Deserialize for AssetBlindingFactor {
130 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
131 let x = deserialize::<[u8; 32]>(bytes)?;
132 AssetBlindingFactor::from_slice(&x)
133 .map_err(|_| encode::Error::ParseFailed("invalid AssetBlindingFactor"))
134 }
135}
136
137impl Serialize for Script {
138 fn serialize(&self) -> Vec<u8> {
139 self.to_bytes()
140 }
141}
142
143impl Deserialize for Script {
144 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
145 Ok(Self::from(bytes.to_vec()))
146 }
147}
148
149impl Serialize for PublicKey {
150 fn serialize(&self) -> Vec<u8> {
151 let mut buf = Vec::new();
152 self.write_into(&mut buf).expect("vecs don't error");
153 buf
154 }
155}
156
157impl Deserialize for PublicKey {
158 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
159 PublicKey::from_slice(bytes).map_err(|_| encode::Error::ParseFailed("invalid public key"))
160 }
161}
162
163impl Serialize for KeySource {
164 fn serialize(&self) -> Vec<u8> {
165 let mut rv: Vec<u8> = Vec::with_capacity(key_source_len(self));
166
167 rv.append(&mut self.0.to_bytes().to_vec());
168
169 for cnum in &self.1 {
170 rv.append(&mut serialize(&u32::from(*cnum)));
171 }
172
173 rv
174 }
175}
176
177impl Deserialize for KeySource {
178 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
179 let prefix = match <[u8; 4]>::try_from(&bytes[0..4]) {
180 Ok(prefix) => prefix,
181 Err(_) => return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into()),
182 };
183
184 let fprint: Fingerprint = Fingerprint::from(prefix);
185 let mut dpath: Vec<ChildNumber> = Vec::default();
186
187 let mut d = &bytes[4..];
188 while !d.is_empty() {
189 match u32::consensus_decode(&mut d) {
190 Ok(index) => dpath.push(index.into()),
191 Err(e) => return Err(e),
192 }
193 }
194
195 Ok((fprint, dpath.into()))
196 }
197}
198
199impl Serialize for Vec<u8> {
201 fn serialize(&self) -> Vec<u8> {
202 self.clone()
203 }
204}
205
206impl Deserialize for Vec<u8> {
207 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
208 Ok(bytes.to_vec())
209 }
210}
211
212impl Serialize for PsbtSighashType {
213 fn serialize(&self) -> Vec<u8> {
214 serialize(&self.to_u32())
215 }
216}
217
218impl Deserialize for PsbtSighashType {
219 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
220 let raw: u32 = encode::deserialize(bytes)?;
221 Ok(PsbtSighashType::from_u32(raw))
222 }
223}
224
225impl Serialize for confidential::Value {
226 fn serialize(&self) -> Vec<u8> {
227 match self {
228 confidential::Value::Null => vec![], confidential::Value::Explicit(x) => Serialize::serialize(x),
230 confidential::Value::Confidential(_) => encode::serialize(self), }
232 }
233}
234
235impl Deserialize for confidential::Value {
236 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
237 match bytes.len() {
238 8 => Ok(confidential::Value::Explicit(encode::deserialize(bytes)?)),
239 _ => Ok(encode::deserialize(bytes)?),
240 }
241 }
242}
243
244impl Serialize for secp256k1_zkp::PedersenCommitment {
245 fn serialize(&self) -> Vec<u8> {
246 self.serialize().to_vec()
247 }
248}
249
250impl Deserialize for secp256k1_zkp::PedersenCommitment {
251 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
252 let comm = secp256k1_zkp::PedersenCommitment::from_slice(bytes)?;
253 Ok(comm)
254 }
255}
256
257impl Serialize for secp256k1_zkp::Generator {
258 fn serialize(&self) -> Vec<u8> {
259 self.serialize().to_vec()
260 }
261}
262
263impl Deserialize for secp256k1_zkp::Generator {
264 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
265 let comm = secp256k1_zkp::Generator::from_slice(bytes)?;
266 Ok(comm)
267 }
268}
269
270impl Serialize for confidential::Asset {
271 fn serialize(&self) -> Vec<u8> {
272 match self {
273 confidential::Asset::Null => vec![], confidential::Asset::Explicit(x) => Serialize::serialize(x),
275 confidential::Asset::Confidential(_) => encode::serialize(self), }
277 }
278}
279
280impl Deserialize for confidential::Asset {
281 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
282 match bytes.len() {
283 32 => Ok(confidential::Asset::Explicit(encode::deserialize(bytes)?)),
284 _ => Ok(encode::deserialize(bytes)?),
285 }
286 }
287}
288
289impl Serialize for Box<RangeProof> {
290 fn serialize(&self) -> Vec<u8> {
291 RangeProof::serialize(self)
292 }
293}
294
295impl Deserialize for Box<RangeProof> {
296 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
297 let prf = RangeProof::from_slice(bytes)
298 .map_err(|_| encode::Error::ParseFailed("Invalid Rangeproof"))?;
299 Ok(Box::new(prf))
300 }
301}
302
303impl Serialize for Box<SurjectionProof> {
304 fn serialize(&self) -> Vec<u8> {
305 SurjectionProof::serialize(self)
306 }
307}
308
309impl Deserialize for Box<SurjectionProof> {
310 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
311 let prf = SurjectionProof::from_slice(bytes)
312 .map_err(|_| encode::Error::ParseFailed("Invalid SurjectionProof"))?;
313 Ok(Box::new(prf))
314 }
315}
316
317impl Serialize for XOnlyPublicKey {
319 fn serialize(&self) -> Vec<u8> {
320 XOnlyPublicKey::serialize(self).to_vec()
321 }
322}
323
324impl Deserialize for XOnlyPublicKey {
325 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
326 XOnlyPublicKey::from_slice(bytes)
327 .map_err(|_| encode::Error::ParseFailed("Invalid xonly public key"))
328 }
329}
330
331impl Serialize for schnorr::SchnorrSig {
332 fn serialize(&self) -> Vec<u8> {
333 self.to_vec()
334 }
335}
336
337impl Deserialize for schnorr::SchnorrSig {
338 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
339 match bytes.len() {
340 65 => {
341 let hash_ty = SchnorrSighashType::from_u8(bytes[64])
342 .ok_or(encode::Error::ParseFailed("Invalid Sighash type"))?;
343 let sig = secp256k1_zkp::schnorr::Signature::from_slice(&bytes[..64])
344 .map_err(|_| encode::Error::ParseFailed("Invalid Schnorr signature"))?;
345 Ok(schnorr::SchnorrSig { sig, hash_ty })
346 }
347 64 => {
348 let sig = secp256k1_zkp::schnorr::Signature::from_slice(&bytes[..64])
349 .map_err(|_| encode::Error::ParseFailed("Invalid Schnorr signature"))?;
350 Ok(schnorr::SchnorrSig {
351 sig,
352 hash_ty: SchnorrSighashType::Default,
353 })
354 }
355 _ => Err(encode::Error::ParseFailed("Invalid Schnorr signature len")),
356 }
357 }
358}
359
360impl Serialize for (XOnlyPublicKey, TapLeafHash) {
361 fn serialize(&self) -> Vec<u8> {
362 let ser_pk = self.0.serialize();
363 let mut buf = Vec::with_capacity(ser_pk.len() + TapLeafHash::LEN);
364 buf.extend(&ser_pk);
365 buf.extend(&self.1.to_byte_array());
366 buf
367 }
368}
369
370impl Deserialize for (XOnlyPublicKey, TapLeafHash) {
371 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
372 if bytes.len() < 32 {
373 return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into());
374 }
375 let a: XOnlyPublicKey = Deserialize::deserialize(&bytes[..32])?;
376 let b: TapLeafHash = Deserialize::deserialize(&bytes[32..])?;
377 Ok((a, b))
378 }
379}
380
381impl Serialize for ControlBlock {
382 fn serialize(&self) -> Vec<u8> {
383 ControlBlock::serialize(self)
384 }
385}
386
387impl Deserialize for ControlBlock {
388 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
389 Self::from_slice(bytes).map_err(|_| encode::Error::ParseFailed("Invalid control block"))
390 }
391}
392
393impl Serialize for (Script, LeafVersion) {
395 fn serialize(&self) -> Vec<u8> {
396 let mut buf = Vec::with_capacity(self.0.len() + 1);
397 buf.extend(self.0.as_bytes());
398 buf.push(self.1.as_u8());
399 buf
400 }
401}
402
403impl Deserialize for (Script, LeafVersion) {
404 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
405 if bytes.is_empty() {
406 return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into());
407 }
408 let script = Script::deserialize(&bytes[..bytes.len() - 1])?;
410 let leaf_ver = LeafVersion::from_u8(bytes[bytes.len() - 1])
411 .map_err(|_| encode::Error::ParseFailed("invalid leaf version"))?;
412 Ok((script, leaf_ver))
413 }
414}
415
416impl Serialize for (Vec<TapLeafHash>, KeySource) {
417 fn serialize(&self) -> Vec<u8> {
418 let mut buf = Vec::with_capacity(32 * self.0.len() + key_source_len(&self.1));
419 self.0
420 .consensus_encode(&mut buf)
421 .expect("Vecs don't error allocation");
422 buf.extend(self.1.serialize());
424 buf
425 }
426}
427
428impl Deserialize for (Vec<TapLeafHash>, KeySource) {
429 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
430 let (leafhash_vec, consumed) = deserialize_partial::<Vec<TapLeafHash>>(bytes)?;
431 let key_source = KeySource::deserialize(&bytes[consumed..])?;
432 Ok((leafhash_vec, key_source))
433 }
434}
435
436impl Serialize for TapTree {
437 fn serialize(&self) -> Vec<u8> {
438 match (self.0.branch().len(), self.0.branch().last()) {
439 (1, Some(Some(root))) => {
440 let mut buf = Vec::new();
441 for leaf_info in &root.leaves {
442 buf.push(leaf_info.merkle_branch.as_inner().len() as u8);
447 buf.push(leaf_info.ver.as_u8());
448 leaf_info
449 .script
450 .consensus_encode(&mut buf)
451 .expect("Vecs dont err");
452 }
453 buf
454 }
455 _ => unreachable!(),
457 }
458 }
459}
460
461impl Deserialize for TapTree {
462 fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
463 let mut builder = TaprootBuilder::new();
464 let mut bytes_iter = bytes.iter();
465 while let Some(depth) = bytes_iter.next() {
466 let version = bytes_iter
467 .next()
468 .ok_or(encode::Error::ParseFailed("Invalid Taproot Builder"))?;
469 let (script, consumed) = deserialize_partial::<Script>(bytes_iter.as_slice())?;
470 if consumed > 0 {
471 bytes_iter.nth(consumed - 1);
472 }
473
474 let leaf_version = LeafVersion::from_u8(*version)
475 .map_err(|_| encode::Error::ParseFailed("Leaf Version Error"))?;
476 builder = builder
477 .add_leaf_with_ver(usize::from(*depth), script, leaf_version)
478 .map_err(|_| encode::Error::ParseFailed("Tree not in DFS order"))?;
479 }
480 if builder.is_complete() {
481 Ok(TapTree(builder))
482 } else {
483 Err(encode::Error::ParseFailed("Incomplete taproot Tree"))
484 }
485 }
486}
487
488fn key_source_len(key_source: &KeySource) -> usize {
490 4 + 4 * (key_source.1).as_ref().len()
491}