|
5 | 5 | //! This module contains the [`Witness`] struct and related methods to operate on it
|
6 | 6 | //!
|
7 | 7 |
|
| 8 | +use secp256k1::ecdsa; |
| 9 | + |
8 | 10 | use crate::blockdata::transaction::EcdsaSighashType;
|
9 | 11 | use crate::consensus::encode::{Error, MAX_VEC_SIZE};
|
10 | 12 | use crate::consensus::{Decodable, Encodable, WriteExt};
|
11 | 13 | use crate::io::{self, Read, Write};
|
12 | 14 | use crate::prelude::*;
|
13 |
| -use secp256k1::ecdsa; |
14 | 15 | use crate::VarInt;
|
15 | 16 |
|
16 | 17 | /// The Witness is the data used to unlock bitcoins since the [segwit upgrade](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki)
|
@@ -124,7 +125,6 @@ impl Encodable for Witness {
|
124 | 125 | }
|
125 | 126 |
|
126 | 127 | impl Witness {
|
127 |
| - |
128 | 128 | /// Create a new empty [`Witness`]
|
129 | 129 | pub fn new() -> Self {
|
130 | 130 | Witness::default()
|
@@ -281,25 +281,77 @@ impl serde::Serialize for Witness {
|
281 | 281 | where
|
282 | 282 | S: serde::Serializer,
|
283 | 283 | {
|
284 |
| - use serde::ser::SerializeSeq; |
| 284 | + use hashes::hex::ToHex; |
| 285 | + use serde::ser::SerializeSeq; |
285 | 286 |
|
| 287 | + let human_readable = serializer.is_human_readable(); |
286 | 288 | let mut seq = serializer.serialize_seq(Some(self.witness_elements))?;
|
287 | 289 |
|
288 | 290 | for elem in self.iter() {
|
289 |
| - seq.serialize_element(&elem)?; |
| 291 | + if human_readable { |
| 292 | + seq.serialize_element(&elem.to_hex())?; |
| 293 | + } else { |
| 294 | + seq.serialize_element(&elem)?; |
| 295 | + } |
290 | 296 | }
|
291 |
| - |
292 | 297 | seq.end()
|
293 | 298 | }
|
294 | 299 | }
|
| 300 | + |
295 | 301 | #[cfg(feature = "serde")]
|
296 | 302 | impl<'de> serde::Deserialize<'de> for Witness {
|
297 | 303 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
298 | 304 | where
|
299 | 305 | D: serde::Deserializer<'de>,
|
300 | 306 | {
|
301 |
| - let vec: Vec<Vec<u8>> = serde::Deserialize::deserialize(deserializer)?; |
302 |
| - Ok(Witness::from_vec(vec)) |
| 307 | + struct Visitor; // Human-readable visitor. |
| 308 | + impl<'de> serde::de::Visitor<'de> for Visitor |
| 309 | + { |
| 310 | + type Value = Witness; |
| 311 | + |
| 312 | + fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { |
| 313 | + write!(f, "a sequence of hex arrays") |
| 314 | + } |
| 315 | + |
| 316 | + fn visit_seq<A: serde::de::SeqAccess<'de>>(self, mut a: A) -> Result<Self::Value, A::Error> |
| 317 | + { |
| 318 | + use hashes::hex::FromHex; |
| 319 | + use hashes::hex::Error::*; |
| 320 | + use serde::de::{self, Unexpected}; |
| 321 | + |
| 322 | + let mut ret = match a.size_hint() { |
| 323 | + Some(len) => Vec::with_capacity(len), |
| 324 | + None => Vec::new(), |
| 325 | + }; |
| 326 | + |
| 327 | + while let Some(elem) = a.next_element::<String>()? { |
| 328 | + let vec = Vec::<u8>::from_hex(&elem).map_err(|e| { |
| 329 | + match e { |
| 330 | + InvalidChar(b) => { |
| 331 | + match core::char::from_u32(b.into()) { |
| 332 | + Some(c) => de::Error::invalid_value(Unexpected::Char(c), &"a valid hex character"), |
| 333 | + None => de::Error::invalid_value(Unexpected::Unsigned(b.into()), &"a valid hex character") |
| 334 | + } |
| 335 | + } |
| 336 | + OddLengthString(len) => de::Error::invalid_length(len, &"an even length string"), |
| 337 | + InvalidLength(expected, got) => { |
| 338 | + let exp = format!("expected length: {}", expected); |
| 339 | + de::Error::invalid_length(got, &exp.as_str()) |
| 340 | + } |
| 341 | + } |
| 342 | + })?; |
| 343 | + ret.push(vec); |
| 344 | + } |
| 345 | + Ok(Witness::from_vec(ret)) |
| 346 | + } |
| 347 | + } |
| 348 | + |
| 349 | + if deserializer.is_human_readable() { |
| 350 | + deserializer.deserialize_seq(Visitor) |
| 351 | + } else { |
| 352 | + let vec: Vec<Vec<u8>> = serde::Deserialize::deserialize(deserializer)?; |
| 353 | + Ok(Witness::from_vec(vec)) |
| 354 | + } |
303 | 355 | }
|
304 | 356 | }
|
305 | 357 |
|
@@ -424,20 +476,35 @@ mod test {
|
424 | 476 |
|
425 | 477 | #[cfg(feature = "serde")]
|
426 | 478 | #[test]
|
427 |
| - fn test_serde() { |
428 |
| - use serde_json; |
| 479 | + fn test_serde_bincode() { |
| 480 | + use bincode; |
429 | 481 |
|
430 | 482 | let old_witness_format = vec![vec![0u8], vec![2]];
|
431 | 483 | let new_witness_format = Witness::from_vec(old_witness_format.clone());
|
432 | 484 |
|
433 |
| - let old = serde_json::to_string(&old_witness_format).unwrap(); |
434 |
| - let new = serde_json::to_string(&new_witness_format).unwrap(); |
| 485 | + let old = bincode::serialize(&old_witness_format).unwrap(); |
| 486 | + let new = bincode::serialize(&new_witness_format).unwrap(); |
435 | 487 |
|
436 | 488 | assert_eq!(old, new);
|
437 | 489 |
|
438 |
| - let back = serde_json::from_str(&new).unwrap(); |
| 490 | + let back: Witness = bincode::deserialize(&new).unwrap(); |
439 | 491 | assert_eq!(new_witness_format, back);
|
440 | 492 | }
|
| 493 | + |
| 494 | + #[cfg(feature = "serde")] |
| 495 | + #[test] |
| 496 | + fn test_serde_human() { |
| 497 | + use serde_json; |
| 498 | + |
| 499 | + let witness = Witness::from_vec(vec![vec![0u8, 123, 75], vec![2u8, 6, 3, 7, 8]]); |
| 500 | + |
| 501 | + let json = serde_json::to_string(&witness).unwrap(); |
| 502 | + |
| 503 | + assert_eq!(json, r#"["007b4b","0206030708"]"#); |
| 504 | + |
| 505 | + let back: Witness = serde_json::from_str(&json).unwrap(); |
| 506 | + assert_eq!(witness, back); |
| 507 | + } |
441 | 508 | }
|
442 | 509 |
|
443 | 510 |
|
|
0 commit comments