2018-03-05 22:33:44 +03:00
|
|
|
// Copyright 2018 The Grin Developers
|
2016-10-22 21:35:48 +03:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
//! Serialization and deserialization layer specialized for binary encoding.
|
|
|
|
//! Ensures consistency and safety. Basically a minimal subset or
|
|
|
|
//! rustc_serialize customized for our need.
|
|
|
|
//!
|
|
|
|
//! To use it simply implement `Writeable` or `Readable` and then use the
|
|
|
|
//! `serialize` or `deserialize` functions on them as appropriate.
|
|
|
|
|
2019-02-15 16:41:19 +03:00
|
|
|
use crate::core::hash::{DefaultHashable, Hash, Hashed};
|
2018-12-08 02:59:40 +03:00
|
|
|
use crate::keychain::{BlindingFactor, Identifier, IDENTIFIER_SIZE};
|
|
|
|
use crate::util::read_write::read_exact;
|
|
|
|
use crate::util::secp::constants::{
|
2019-05-27 12:19:24 +03:00
|
|
|
AGG_SIGNATURE_SIZE, COMPRESSED_PUBLIC_KEY_SIZE, MAX_PROOF_SIZE, PEDERSEN_COMMITMENT_SIZE,
|
|
|
|
SECRET_KEY_SIZE,
|
2018-12-08 02:59:40 +03:00
|
|
|
};
|
2019-05-27 12:19:24 +03:00
|
|
|
use crate::util::secp::key::PublicKey;
|
2018-12-08 02:59:40 +03:00
|
|
|
use crate::util::secp::pedersen::{Commitment, RangeProof};
|
|
|
|
use crate::util::secp::Signature;
|
2019-05-27 12:19:24 +03:00
|
|
|
use crate::util::secp::{ContextFlag, Secp256k1};
|
2017-11-01 02:32:33 +03:00
|
|
|
use byteorder::{BigEndian, ByteOrder, ReadBytesExt};
|
2019-06-27 19:19:41 +03:00
|
|
|
use std::fmt::{self, Debug};
|
2018-05-29 05:45:31 +03:00
|
|
|
use std::io::{self, Read, Write};
|
2018-11-14 17:52:43 +03:00
|
|
|
use std::marker;
|
2018-12-08 02:59:40 +03:00
|
|
|
use std::time::Duration;
|
2019-06-27 19:19:41 +03:00
|
|
|
use std::{cmp, error};
|
2016-10-21 03:06:12 +03:00
|
|
|
|
|
|
|
/// Possible errors deriving from serializing or deserializing.
|
2019-03-07 22:08:29 +03:00
|
|
|
#[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
|
2016-10-21 03:06:12 +03:00
|
|
|
pub enum Error {
|
|
|
|
/// Wraps an io error produced when reading or writing
|
2019-03-07 22:08:29 +03:00
|
|
|
IOErr(
|
|
|
|
String,
|
|
|
|
#[serde(
|
|
|
|
serialize_with = "serialize_error_kind",
|
|
|
|
deserialize_with = "deserialize_error_kind"
|
|
|
|
)]
|
|
|
|
io::ErrorKind,
|
|
|
|
),
|
2016-10-25 06:41:28 +03:00
|
|
|
/// Expected a given value that wasn't found
|
|
|
|
UnexpectedData {
|
2017-06-01 00:44:44 +03:00
|
|
|
/// What we wanted
|
2016-10-25 06:41:28 +03:00
|
|
|
expected: Vec<u8>,
|
2017-06-01 00:44:44 +03:00
|
|
|
/// What we got
|
2016-10-25 06:41:28 +03:00
|
|
|
received: Vec<u8>,
|
|
|
|
},
|
2016-11-01 01:17:53 +03:00
|
|
|
/// Data wasn't in a consumable format
|
|
|
|
CorruptedData,
|
2018-11-14 17:52:43 +03:00
|
|
|
/// Incorrect number of elements (when deserializing a vec via read_multi say).
|
|
|
|
CountError,
|
2016-10-21 03:06:12 +03:00
|
|
|
/// When asked to read too much data
|
2016-12-11 06:11:49 +03:00
|
|
|
TooLargeReadErr,
|
2018-01-17 06:03:40 +03:00
|
|
|
/// Error from from_hex deserialization
|
|
|
|
HexError(String),
|
2018-12-05 13:27:46 +03:00
|
|
|
/// Inputs/outputs/kernels must be sorted lexicographically.
|
|
|
|
SortError,
|
|
|
|
/// Inputs/outputs/kernels must be unique.
|
|
|
|
DuplicateError,
|
2019-05-08 23:10:42 +03:00
|
|
|
/// Block header version (hard-fork schedule).
|
|
|
|
InvalidBlockVersion,
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2016-11-01 01:17:53 +03:00
|
|
|
impl From<io::Error> for Error {
|
|
|
|
fn from(e: io::Error) -> Error {
|
2018-07-01 01:36:38 +03:00
|
|
|
Error::IOErr(format!("{}", e), e.kind())
|
2016-11-01 01:17:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Error {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
2016-11-01 01:17:53 +03:00
|
|
|
match *self {
|
2018-07-01 01:36:38 +03:00
|
|
|
Error::IOErr(ref e, ref _k) => write!(f, "{}", e),
|
2017-09-29 21:44:25 +03:00
|
|
|
Error::UnexpectedData {
|
|
|
|
expected: ref e,
|
|
|
|
received: ref r,
|
|
|
|
} => write!(f, "expected {:?}, got {:?}", e, r),
|
2016-11-01 01:17:53 +03:00
|
|
|
Error::CorruptedData => f.write_str("corrupted data"),
|
2018-11-14 17:52:43 +03:00
|
|
|
Error::CountError => f.write_str("count error"),
|
2018-12-05 13:27:46 +03:00
|
|
|
Error::SortError => f.write_str("sort order"),
|
|
|
|
Error::DuplicateError => f.write_str("duplicate"),
|
2016-12-11 06:11:49 +03:00
|
|
|
Error::TooLargeReadErr => f.write_str("too large read"),
|
2018-01-17 06:03:40 +03:00
|
|
|
Error::HexError(ref e) => write!(f, "hex error {:?}", e),
|
2019-05-08 23:10:42 +03:00
|
|
|
Error::InvalidBlockVersion => f.write_str("invalid block version"),
|
2016-11-01 01:17:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl error::Error for Error {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn cause(&self) -> Option<&dyn error::Error> {
|
2016-11-01 01:17:53 +03:00
|
|
|
match *self {
|
2018-07-01 01:36:38 +03:00
|
|
|
Error::IOErr(ref _e, ref _k) => Some(self),
|
2016-11-10 02:51:24 +03:00
|
|
|
_ => None,
|
2016-11-01 01:17:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn description(&self) -> &str {
|
|
|
|
match *self {
|
2018-07-01 01:36:38 +03:00
|
|
|
Error::IOErr(ref e, _) => e,
|
2018-10-23 22:09:16 +03:00
|
|
|
Error::UnexpectedData { .. } => "unexpected data",
|
2016-11-01 01:17:53 +03:00
|
|
|
Error::CorruptedData => "corrupted data",
|
2018-11-14 17:52:43 +03:00
|
|
|
Error::CountError => "count error",
|
2018-12-05 13:27:46 +03:00
|
|
|
Error::SortError => "sort order",
|
|
|
|
Error::DuplicateError => "duplicate error",
|
2016-12-11 06:11:49 +03:00
|
|
|
Error::TooLargeReadErr => "too large read",
|
2018-01-17 06:03:40 +03:00
|
|
|
Error::HexError(_) => "hex error",
|
2019-05-08 23:10:42 +03:00
|
|
|
Error::InvalidBlockVersion => "invalid block version",
|
2016-11-01 01:17:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-01 04:37:06 +03:00
|
|
|
/// Signal to a serializable object how much of its data should be serialized
|
|
|
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
|
|
|
pub enum SerializationMode {
|
|
|
|
/// Serialize everything sufficiently to fully reconstruct the object
|
|
|
|
Full,
|
|
|
|
/// Serialize the data that defines the object
|
|
|
|
Hash,
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Implementations defined how different numbers and binary structures are
|
|
|
|
/// written to an underlying stream or container (depending on implementation).
|
|
|
|
pub trait Writer {
|
2016-11-01 04:37:06 +03:00
|
|
|
/// The mode this serializer is writing in
|
|
|
|
fn serialization_mode(&self) -> SerializationMode;
|
|
|
|
|
2016-10-25 03:43:14 +03:00
|
|
|
/// Writes a u8 as bytes
|
2016-11-01 16:14:26 +03:00
|
|
|
fn write_u8(&mut self, n: u8) -> Result<(), Error> {
|
|
|
|
self.write_fixed_bytes(&[n])
|
|
|
|
}
|
|
|
|
|
2016-10-26 08:06:13 +03:00
|
|
|
/// Writes a u16 as bytes
|
2016-11-01 16:14:26 +03:00
|
|
|
fn write_u16(&mut self, n: u16) -> Result<(), Error> {
|
|
|
|
let mut bytes = [0; 2];
|
|
|
|
BigEndian::write_u16(&mut bytes, n);
|
|
|
|
self.write_fixed_bytes(&bytes)
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Writes a u32 as bytes
|
2016-11-01 16:14:26 +03:00
|
|
|
fn write_u32(&mut self, n: u32) -> Result<(), Error> {
|
|
|
|
let mut bytes = [0; 4];
|
|
|
|
BigEndian::write_u32(&mut bytes, n);
|
|
|
|
self.write_fixed_bytes(&bytes)
|
|
|
|
}
|
|
|
|
|
2018-05-29 05:45:31 +03:00
|
|
|
/// Writes a u32 as bytes
|
|
|
|
fn write_i32(&mut self, n: i32) -> Result<(), Error> {
|
|
|
|
let mut bytes = [0; 4];
|
|
|
|
BigEndian::write_i32(&mut bytes, n);
|
|
|
|
self.write_fixed_bytes(&bytes)
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Writes a u64 as bytes
|
2016-11-01 16:14:26 +03:00
|
|
|
fn write_u64(&mut self, n: u64) -> Result<(), Error> {
|
|
|
|
let mut bytes = [0; 8];
|
|
|
|
BigEndian::write_u64(&mut bytes, n);
|
|
|
|
self.write_fixed_bytes(&bytes)
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Writes a i64 as bytes
|
2016-11-01 16:14:26 +03:00
|
|
|
fn write_i64(&mut self, n: i64) -> Result<(), Error> {
|
|
|
|
let mut bytes = [0; 8];
|
|
|
|
BigEndian::write_i64(&mut bytes, n);
|
|
|
|
self.write_fixed_bytes(&bytes)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Writes a variable number of bytes. The length is encoded as a 64-bit
|
2016-10-21 03:06:12 +03:00
|
|
|
/// prefix.
|
2017-04-07 08:54:54 +03:00
|
|
|
fn write_bytes<T: AsFixedBytes>(&mut self, bytes: &T) -> Result<(), Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
self.write_u64(bytes.as_ref().len() as u64)?;
|
2016-11-01 16:14:26 +03:00
|
|
|
self.write_fixed_bytes(bytes)
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Writes a fixed number of bytes from something that can turn itself into
|
|
|
|
/// a `&[u8]`. The reader is expected to know the actual length on read.
|
2017-04-07 08:54:54 +03:00
|
|
|
fn write_fixed_bytes<T: AsFixedBytes>(&mut self, fixed: &T) -> Result<(), Error>;
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Implementations defined how different numbers and binary structures are
|
|
|
|
/// read from an underlying stream or container (depending on implementation).
|
|
|
|
pub trait Reader {
|
2016-10-25 03:43:14 +03:00
|
|
|
/// Read a u8 from the underlying Read
|
|
|
|
fn read_u8(&mut self) -> Result<u8, Error>;
|
2016-10-26 08:06:13 +03:00
|
|
|
/// Read a u16 from the underlying Read
|
|
|
|
fn read_u16(&mut self) -> Result<u16, Error>;
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Read a u32 from the underlying Read
|
|
|
|
fn read_u32(&mut self) -> Result<u32, Error>;
|
|
|
|
/// Read a u64 from the underlying Read
|
|
|
|
fn read_u64(&mut self) -> Result<u64, Error>;
|
|
|
|
/// Read a i32 from the underlying Read
|
2018-05-29 05:45:31 +03:00
|
|
|
fn read_i32(&mut self) -> Result<i32, Error>;
|
|
|
|
/// Read a i64 from the underlying Read
|
2016-10-21 03:06:12 +03:00
|
|
|
fn read_i64(&mut self) -> Result<i64, Error>;
|
2018-11-13 12:30:40 +03:00
|
|
|
/// Read a u64 len prefix followed by that number of exact bytes.
|
|
|
|
fn read_bytes_len_prefix(&mut self) -> Result<Vec<u8>, Error>;
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Read a fixed number of bytes from the underlying reader.
|
|
|
|
fn read_fixed_bytes(&mut self, length: usize) -> Result<Vec<u8>, Error>;
|
2016-10-25 06:41:28 +03:00
|
|
|
/// Consumes a byte from the reader, producing an error if it doesn't have
|
|
|
|
/// the expected value
|
|
|
|
fn expect_u8(&mut self, val: u8) -> Result<u8, Error>;
|
2019-06-27 19:19:41 +03:00
|
|
|
/// Access to underlying protocol version to support
|
|
|
|
/// version specific deserialization logic.
|
|
|
|
fn protocol_version(&self) -> ProtocolVersion;
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Trait that every type that can be serialized as binary must implement.
|
|
|
|
/// Writes directly to a Writer, a utility type thinly wrapping an
|
|
|
|
/// underlying Write implementation.
|
|
|
|
pub trait Writeable {
|
|
|
|
/// Write the data held by this Writeable to the provided writer
|
2017-04-07 08:54:54 +03:00
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error>;
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2018-11-16 14:00:39 +03:00
|
|
|
/// Reader that exposes an Iterator interface.
|
|
|
|
pub struct IteratingReader<'a, T> {
|
2018-11-14 17:52:43 +03:00
|
|
|
count: u64,
|
|
|
|
curr: u64,
|
2018-12-08 02:59:40 +03:00
|
|
|
reader: &'a mut dyn Reader,
|
2018-11-14 17:52:43 +03:00
|
|
|
_marker: marker::PhantomData<T>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T> IteratingReader<'a, T> {
|
2018-11-16 14:00:39 +03:00
|
|
|
/// Constructor to create a new iterating reader for the provided underlying reader.
|
|
|
|
/// Takes a count so we know how many to iterate over.
|
2018-12-08 02:59:40 +03:00
|
|
|
pub fn new(reader: &'a mut dyn Reader, count: u64) -> IteratingReader<'a, T> {
|
2018-11-14 17:52:43 +03:00
|
|
|
let curr = 0;
|
|
|
|
IteratingReader {
|
|
|
|
count,
|
|
|
|
curr,
|
|
|
|
reader,
|
|
|
|
_marker: marker::PhantomData,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T> Iterator for IteratingReader<'a, T>
|
|
|
|
where
|
|
|
|
T: Readable,
|
|
|
|
{
|
|
|
|
type Item = T;
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<T> {
|
|
|
|
if self.curr >= self.count {
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
self.curr += 1;
|
|
|
|
T::read(self.reader).ok()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-22 22:19:37 +03:00
|
|
|
/// Reads multiple serialized items into a Vec.
|
2018-12-08 02:59:40 +03:00
|
|
|
pub fn read_multi<T>(reader: &mut dyn Reader, count: u64) -> Result<Vec<T>, Error>
|
2017-11-01 02:32:33 +03:00
|
|
|
where
|
2018-11-14 17:52:43 +03:00
|
|
|
T: Readable,
|
2017-10-13 20:23:18 +03:00
|
|
|
{
|
2018-11-13 12:30:02 +03:00
|
|
|
// Very rudimentary check to ensure we do not overflow anything
|
|
|
|
// attempting to read huge amounts of data.
|
|
|
|
// Probably better than checking if count * size overflows a u64 though.
|
|
|
|
if count > 1_000_000 {
|
2018-03-16 22:02:22 +03:00
|
|
|
return Err(Error::TooLargeReadErr);
|
|
|
|
}
|
2018-11-13 12:30:02 +03:00
|
|
|
|
2018-11-14 17:52:43 +03:00
|
|
|
let res: Vec<T> = IteratingReader::new(reader, count).collect();
|
|
|
|
if res.len() as u64 != count {
|
|
|
|
return Err(Error::CountError);
|
|
|
|
}
|
|
|
|
Ok(res)
|
2017-10-13 20:23:18 +03:00
|
|
|
}
|
|
|
|
|
2019-06-27 19:19:41 +03:00
|
|
|
/// Protocol version for serialization/deserialization.
|
|
|
|
/// Note: This is used in various places including but limited to
|
|
|
|
/// the p2p layer and our local db storage layer.
|
|
|
|
/// We may speak multiple versions to various peers and a potentially *different*
|
|
|
|
/// version for our local db.
|
|
|
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialOrd, PartialEq, Serialize)]
|
|
|
|
pub struct ProtocolVersion(pub u32);
|
|
|
|
|
|
|
|
impl Default for ProtocolVersion {
|
|
|
|
fn default() -> ProtocolVersion {
|
|
|
|
ProtocolVersion(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for ProtocolVersion {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
write!(f, "{}", self.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ProtocolVersion {
|
|
|
|
/// We need to specify a protocol version for our local database.
|
|
|
|
/// Regardless of specific version used when sending/receiving data between peers
|
|
|
|
/// we need to take care with serialization/deserialization of data locally in the db.
|
|
|
|
pub fn local_db() -> ProtocolVersion {
|
|
|
|
ProtocolVersion(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<ProtocolVersion> for u32 {
|
|
|
|
fn from(v: ProtocolVersion) -> u32 {
|
|
|
|
v.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Writeable for ProtocolVersion {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_u32(self.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Readable for ProtocolVersion {
|
|
|
|
fn read(reader: &mut dyn Reader) -> Result<ProtocolVersion, Error> {
|
|
|
|
let version = reader.read_u32()?;
|
|
|
|
Ok(ProtocolVersion(version))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Trait that every type that can be deserialized from binary must implement.
|
|
|
|
/// Reads directly to a Reader, a utility type thinly wrapping an
|
|
|
|
/// underlying Read implementation.
|
2017-06-01 00:44:44 +03:00
|
|
|
pub trait Readable
|
2017-09-29 21:44:25 +03:00
|
|
|
where
|
|
|
|
Self: Sized,
|
2017-06-01 00:44:44 +03:00
|
|
|
{
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Reads the data necessary to this Readable from the provided reader
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Self, Error>;
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2018-11-16 14:00:39 +03:00
|
|
|
/// Deserializes a Readable from any std::io::Read implementation.
|
2019-06-27 19:19:41 +03:00
|
|
|
pub fn deserialize<T: Readable>(
|
|
|
|
source: &mut dyn Read,
|
|
|
|
version: ProtocolVersion,
|
|
|
|
) -> Result<T, Error> {
|
|
|
|
let mut reader = BinReader::new(source, version);
|
2016-10-21 03:06:12 +03:00
|
|
|
T::read(&mut reader)
|
|
|
|
}
|
|
|
|
|
2019-06-27 19:19:41 +03:00
|
|
|
/// Deserialize a Readable based on our local db version protocol.
|
|
|
|
pub fn deserialize_db<T: Readable>(source: &mut dyn Read) -> Result<T, Error> {
|
|
|
|
deserialize(source, ProtocolVersion::local_db())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Deserialize a Readable based on our local "default" version protocol.
|
|
|
|
pub fn deserialize_default<T: Readable>(source: &mut dyn Read) -> Result<T, Error> {
|
|
|
|
deserialize(source, ProtocolVersion::default())
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Serializes a Writeable into any std::io::Write implementation.
|
2018-12-08 02:59:40 +03:00
|
|
|
pub fn serialize<W: Writeable>(sink: &mut dyn Write, thing: &W) -> Result<(), Error> {
|
2018-10-23 22:09:16 +03:00
|
|
|
let mut writer = BinWriter { sink };
|
2016-10-21 03:06:12 +03:00
|
|
|
thing.write(&mut writer)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Utility function to serialize a writeable directly in memory using a
|
|
|
|
/// Vec<u8>.
|
2017-04-07 08:54:54 +03:00
|
|
|
pub fn ser_vec<W: Writeable>(thing: &W) -> Result<Vec<u8>, Error> {
|
2018-12-05 16:02:24 +03:00
|
|
|
let mut vec = vec![];
|
2018-06-04 19:05:49 +03:00
|
|
|
serialize(&mut vec, thing)?;
|
2016-10-21 03:06:12 +03:00
|
|
|
Ok(vec)
|
|
|
|
}
|
|
|
|
|
2018-02-22 16:45:13 +03:00
|
|
|
/// Utility to read from a binary source
|
2019-05-27 12:19:24 +03:00
|
|
|
pub struct BinReader<'a> {
|
2018-12-08 02:59:40 +03:00
|
|
|
source: &'a mut dyn Read,
|
2019-06-27 19:19:41 +03:00
|
|
|
version: ProtocolVersion,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> BinReader<'a> {
|
|
|
|
/// Constructor for a new BinReader for the provided source and protocol version.
|
|
|
|
pub fn new(source: &'a mut dyn Read, version: ProtocolVersion) -> BinReader<'a> {
|
|
|
|
BinReader { source, version }
|
|
|
|
}
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2018-07-01 01:36:38 +03:00
|
|
|
fn map_io_err(err: io::Error) -> Error {
|
|
|
|
Error::IOErr(format!("{}", err), err.kind())
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Utility wrapper for an underlying byte Reader. Defines higher level methods
|
|
|
|
/// to read numbers, byte vectors, hashes, etc.
|
|
|
|
impl<'a> Reader for BinReader<'a> {
|
2016-10-25 03:43:14 +03:00
|
|
|
fn read_u8(&mut self) -> Result<u8, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_u8().map_err(map_io_err)
|
2016-10-25 03:43:14 +03:00
|
|
|
}
|
2016-10-26 08:06:13 +03:00
|
|
|
fn read_u16(&mut self) -> Result<u16, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_u16::<BigEndian>().map_err(map_io_err)
|
2016-10-26 08:06:13 +03:00
|
|
|
}
|
2016-10-21 03:06:12 +03:00
|
|
|
fn read_u32(&mut self) -> Result<u32, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_u32::<BigEndian>().map_err(map_io_err)
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
2018-05-29 05:45:31 +03:00
|
|
|
fn read_i32(&mut self) -> Result<i32, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_i32::<BigEndian>().map_err(map_io_err)
|
2018-05-29 05:45:31 +03:00
|
|
|
}
|
2016-10-21 03:06:12 +03:00
|
|
|
fn read_u64(&mut self) -> Result<u64, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_u64::<BigEndian>().map_err(map_io_err)
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
fn read_i64(&mut self) -> Result<i64, Error> {
|
2018-07-01 01:36:38 +03:00
|
|
|
self.source.read_i64::<BigEndian>().map_err(map_io_err)
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
/// Read a variable size vector from the underlying Read. Expects a usize
|
2018-11-13 12:30:40 +03:00
|
|
|
fn read_bytes_len_prefix(&mut self) -> Result<Vec<u8>, Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
let len = self.read_u64()?;
|
2016-10-21 03:06:12 +03:00
|
|
|
self.read_fixed_bytes(len as usize)
|
|
|
|
}
|
2018-11-16 14:00:39 +03:00
|
|
|
|
2018-11-13 12:30:40 +03:00
|
|
|
/// Read a fixed number of bytes.
|
2018-11-16 14:00:39 +03:00
|
|
|
fn read_fixed_bytes(&mut self, len: usize) -> Result<Vec<u8>, Error> {
|
|
|
|
// not reading more than 100k bytes in a single read
|
|
|
|
if len > 100_000 {
|
2016-12-11 06:11:49 +03:00
|
|
|
return Err(Error::TooLargeReadErr);
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
2018-11-16 14:00:39 +03:00
|
|
|
let mut buf = vec![0; len];
|
2017-11-01 02:32:33 +03:00
|
|
|
self.source
|
|
|
|
.read_exact(&mut buf)
|
|
|
|
.map(move |_| buf)
|
2018-07-01 01:36:38 +03:00
|
|
|
.map_err(map_io_err)
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
2016-12-18 00:44:14 +03:00
|
|
|
|
2016-10-25 06:41:28 +03:00
|
|
|
fn expect_u8(&mut self, val: u8) -> Result<u8, Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
let b = self.read_u8()?;
|
2016-10-25 06:41:28 +03:00
|
|
|
if b == val {
|
|
|
|
Ok(b)
|
|
|
|
} else {
|
|
|
|
Err(Error::UnexpectedData {
|
|
|
|
expected: vec![val],
|
|
|
|
received: vec![b],
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2019-06-27 19:19:41 +03:00
|
|
|
|
|
|
|
fn protocol_version(&self) -> ProtocolVersion {
|
|
|
|
self.version
|
|
|
|
}
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2018-11-16 14:00:39 +03:00
|
|
|
/// A reader that reads straight off a stream.
|
|
|
|
/// Tracks total bytes read so we can verify we read the right number afterwards.
|
|
|
|
pub struct StreamingReader<'a> {
|
|
|
|
total_bytes_read: u64,
|
2019-06-27 19:19:41 +03:00
|
|
|
version: ProtocolVersion,
|
2018-12-08 02:59:40 +03:00
|
|
|
stream: &'a mut dyn Read,
|
2018-11-16 14:00:39 +03:00
|
|
|
timeout: Duration,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> StreamingReader<'a> {
|
|
|
|
/// Create a new streaming reader with the provided underlying stream.
|
|
|
|
/// Also takes a duration to be used for each individual read_exact call.
|
2019-06-27 19:19:41 +03:00
|
|
|
pub fn new(
|
|
|
|
stream: &'a mut dyn Read,
|
|
|
|
version: ProtocolVersion,
|
|
|
|
timeout: Duration,
|
|
|
|
) -> StreamingReader<'a> {
|
2018-11-16 14:00:39 +03:00
|
|
|
StreamingReader {
|
|
|
|
total_bytes_read: 0,
|
2019-06-27 19:19:41 +03:00
|
|
|
version,
|
2018-11-16 14:00:39 +03:00
|
|
|
stream,
|
|
|
|
timeout,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the total bytes read via this streaming reader.
|
|
|
|
pub fn total_bytes_read(&self) -> u64 {
|
|
|
|
self.total_bytes_read
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Reader for StreamingReader<'a> {
|
|
|
|
fn read_u8(&mut self) -> Result<u8, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(1)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(buf[0])
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn read_u16(&mut self) -> Result<u16, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(2)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(BigEndian::read_u16(&buf[..]))
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn read_u32(&mut self) -> Result<u32, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(4)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(BigEndian::read_u32(&buf[..]))
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn read_i32(&mut self) -> Result<i32, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(4)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(BigEndian::read_i32(&buf[..]))
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn read_u64(&mut self) -> Result<u64, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(8)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(BigEndian::read_u64(&buf[..]))
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn read_i64(&mut self) -> Result<i64, Error> {
|
|
|
|
let buf = self.read_fixed_bytes(8)?;
|
2019-05-14 01:04:14 +03:00
|
|
|
Ok(BigEndian::read_i64(&buf[..]))
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Read a variable size vector from the underlying stream. Expects a usize
|
|
|
|
fn read_bytes_len_prefix(&mut self) -> Result<Vec<u8>, Error> {
|
|
|
|
let len = self.read_u64()?;
|
|
|
|
self.total_bytes_read += 8;
|
|
|
|
self.read_fixed_bytes(len as usize)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Read a fixed number of bytes.
|
|
|
|
fn read_fixed_bytes(&mut self, len: usize) -> Result<Vec<u8>, Error> {
|
|
|
|
let mut buf = vec![0u8; len];
|
|
|
|
read_exact(&mut self.stream, &mut buf, self.timeout, true)?;
|
|
|
|
self.total_bytes_read += len as u64;
|
|
|
|
Ok(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn expect_u8(&mut self, val: u8) -> Result<u8, Error> {
|
|
|
|
let b = self.read_u8()?;
|
|
|
|
if b == val {
|
|
|
|
Ok(b)
|
|
|
|
} else {
|
|
|
|
Err(Error::UnexpectedData {
|
|
|
|
expected: vec![val],
|
|
|
|
received: vec![b],
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2019-06-27 19:19:41 +03:00
|
|
|
|
|
|
|
fn protocol_version(&self) -> ProtocolVersion {
|
|
|
|
self.version
|
|
|
|
}
|
2018-11-16 14:00:39 +03:00
|
|
|
}
|
|
|
|
|
2017-04-10 09:17:23 +03:00
|
|
|
impl Readable for Commitment {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Commitment, Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
let a = reader.read_fixed_bytes(PEDERSEN_COMMITMENT_SIZE)?;
|
2016-12-18 00:44:14 +03:00
|
|
|
let mut c = [0; PEDERSEN_COMMITMENT_SIZE];
|
2018-10-23 22:09:16 +03:00
|
|
|
c[..PEDERSEN_COMMITMENT_SIZE].clone_from_slice(&a[..PEDERSEN_COMMITMENT_SIZE]);
|
2016-12-18 00:44:14 +03:00
|
|
|
Ok(Commitment(c))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 02:46:32 +03:00
|
|
|
impl Writeable for Commitment {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_fixed_bytes(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-13 18:35:30 +03:00
|
|
|
impl Writeable for BlindingFactor {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_fixed_bytes(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Readable for BlindingFactor {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<BlindingFactor, Error> {
|
2018-11-13 12:30:02 +03:00
|
|
|
let bytes = reader.read_fixed_bytes(BlindingFactor::LEN)?;
|
2018-02-13 18:35:30 +03:00
|
|
|
Ok(BlindingFactor::from_slice(&bytes))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 12:30:02 +03:00
|
|
|
impl FixedLength for BlindingFactor {
|
|
|
|
const LEN: usize = SECRET_KEY_SIZE;
|
|
|
|
}
|
|
|
|
|
2017-10-07 20:38:41 +03:00
|
|
|
impl Writeable for Identifier {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_fixed_bytes(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Readable for Identifier {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Identifier, Error> {
|
2017-10-13 07:45:07 +03:00
|
|
|
let bytes = reader.read_fixed_bytes(IDENTIFIER_SIZE)?;
|
2017-10-07 20:38:41 +03:00
|
|
|
Ok(Identifier::from_bytes(&bytes))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-28 02:46:32 +03:00
|
|
|
impl Writeable for RangeProof {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
2018-02-25 02:20:15 +03:00
|
|
|
writer.write_bytes(self)
|
2017-09-28 02:46:32 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-10 09:17:23 +03:00
|
|
|
impl Readable for RangeProof {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<RangeProof, Error> {
|
2018-11-13 12:30:40 +03:00
|
|
|
let len = reader.read_u64()?;
|
|
|
|
let max_len = cmp::min(len as usize, MAX_PROOF_SIZE);
|
|
|
|
let p = reader.read_fixed_bytes(max_len)?;
|
|
|
|
let mut proof = [0; MAX_PROOF_SIZE];
|
|
|
|
proof[..p.len()].clone_from_slice(&p[..]);
|
2016-12-18 00:44:14 +03:00
|
|
|
Ok(RangeProof {
|
2018-11-13 12:30:40 +03:00
|
|
|
plen: proof.len(),
|
|
|
|
proof,
|
2016-12-18 00:44:14 +03:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-01 23:14:46 +03:00
|
|
|
impl FixedLength for RangeProof {
|
2018-11-13 12:30:40 +03:00
|
|
|
const LEN: usize = 8 // length prefix
|
|
|
|
+ MAX_PROOF_SIZE;
|
2018-02-22 16:45:13 +03:00
|
|
|
}
|
|
|
|
|
2018-11-27 15:32:39 +03:00
|
|
|
impl PMMRable for RangeProof {
|
|
|
|
type E = Self;
|
|
|
|
|
2018-12-02 22:59:24 +03:00
|
|
|
fn as_elmt(&self) -> Self::E {
|
|
|
|
self.clone()
|
2018-11-27 15:32:39 +03:00
|
|
|
}
|
|
|
|
}
|
2018-11-01 23:14:46 +03:00
|
|
|
|
2018-01-15 23:45:26 +03:00
|
|
|
impl Readable for Signature {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Signature, Error> {
|
2018-11-13 12:30:40 +03:00
|
|
|
let a = reader.read_fixed_bytes(Signature::LEN)?;
|
|
|
|
let mut c = [0; Signature::LEN];
|
|
|
|
c[..Signature::LEN].clone_from_slice(&a[..Signature::LEN]);
|
2018-01-15 23:45:26 +03:00
|
|
|
Ok(Signature::from_raw_data(&c).unwrap())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Writeable for Signature {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_fixed_bytes(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 12:30:40 +03:00
|
|
|
impl FixedLength for Signature {
|
|
|
|
const LEN: usize = AGG_SIGNATURE_SIZE;
|
|
|
|
}
|
|
|
|
|
2019-05-27 12:19:24 +03:00
|
|
|
impl FixedLength for PublicKey {
|
|
|
|
const LEN: usize = COMPRESSED_PUBLIC_KEY_SIZE;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Writeable for PublicKey {
|
|
|
|
// Write the public key in compressed form
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
let secp = Secp256k1::with_caps(ContextFlag::None);
|
|
|
|
writer.write_fixed_bytes(&self.serialize_vec(&secp, true).as_ref())?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Readable for PublicKey {
|
|
|
|
// Read the public key in compressed form
|
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Self, Error> {
|
|
|
|
let buf = reader.read_fixed_bytes(PublicKey::LEN)?;
|
|
|
|
let secp = Secp256k1::with_caps(ContextFlag::None);
|
|
|
|
let pk = PublicKey::from_slice(&secp, &buf).map_err(|_| Error::CorruptedData)?;
|
|
|
|
Ok(pk)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-05 13:27:46 +03:00
|
|
|
/// Collections of items must be sorted lexicographically and all unique.
|
|
|
|
pub trait VerifySortedAndUnique<T> {
|
|
|
|
/// Verify a collection of items is sorted and all unique.
|
|
|
|
fn verify_sorted_and_unique(&self) -> Result<(), Error>;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: Hashed> VerifySortedAndUnique<T> for Vec<T> {
|
|
|
|
fn verify_sorted_and_unique(&self) -> Result<(), Error> {
|
2018-12-05 13:28:21 +03:00
|
|
|
let hashes = self.iter().map(|item| item.hash()).collect::<Vec<_>>();
|
2018-12-05 13:27:46 +03:00
|
|
|
let pairs = hashes.windows(2);
|
|
|
|
for pair in pairs {
|
|
|
|
if pair[0] > pair[1] {
|
|
|
|
return Err(Error::SortError);
|
|
|
|
} else if pair[0] == pair[1] {
|
|
|
|
return Err(Error::DuplicateError);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
/// Utility wrapper for an underlying byte Writer. Defines higher level methods
|
|
|
|
/// to write numbers, byte vectors, hashes, etc.
|
2018-09-12 06:31:05 +03:00
|
|
|
pub struct BinWriter<'a> {
|
2018-12-08 02:59:40 +03:00
|
|
|
sink: &'a mut dyn Write,
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
|
2018-09-12 06:31:05 +03:00
|
|
|
impl<'a> BinWriter<'a> {
|
2018-09-19 01:12:57 +03:00
|
|
|
/// Wraps a standard Write in a new BinWriter
|
2018-12-08 02:59:40 +03:00
|
|
|
pub fn new(write: &'a mut dyn Write) -> BinWriter<'a> {
|
2018-09-19 01:12:57 +03:00
|
|
|
BinWriter { sink: write }
|
2018-09-12 06:31:05 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-21 03:06:12 +03:00
|
|
|
impl<'a> Writer for BinWriter<'a> {
|
2016-11-01 04:37:06 +03:00
|
|
|
fn serialization_mode(&self) -> SerializationMode {
|
|
|
|
SerializationMode::Full
|
|
|
|
}
|
|
|
|
|
2017-04-07 08:54:54 +03:00
|
|
|
fn write_fixed_bytes<T: AsFixedBytes>(&mut self, fixed: &T) -> Result<(), Error> {
|
|
|
|
let bs = fixed.as_ref();
|
2018-06-04 19:05:49 +03:00
|
|
|
self.sink.write_all(bs)?;
|
2016-11-01 01:17:53 +03:00
|
|
|
Ok(())
|
2016-10-21 03:06:12 +03:00
|
|
|
}
|
|
|
|
}
|
2016-10-23 17:08:41 +03:00
|
|
|
|
2017-04-10 09:17:23 +03:00
|
|
|
macro_rules! impl_int {
|
2018-05-29 05:45:31 +03:00
|
|
|
($int:ty, $w_fn:ident, $r_fn:ident) => {
|
|
|
|
impl Writeable for $int {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.$w_fn(*self)
|
|
|
|
}
|
|
|
|
}
|
2017-04-10 09:17:23 +03:00
|
|
|
|
2018-05-29 05:45:31 +03:00
|
|
|
impl Readable for $int {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<$int, Error> {
|
2018-05-29 05:45:31 +03:00
|
|
|
reader.$r_fn()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2017-04-10 09:17:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
impl_int!(u8, write_u8, read_u8);
|
|
|
|
impl_int!(u16, write_u16, read_u16);
|
|
|
|
impl_int!(u32, write_u32, read_u32);
|
2018-05-29 05:45:31 +03:00
|
|
|
impl_int!(i32, write_i32, read_i32);
|
2017-04-10 09:17:23 +03:00
|
|
|
impl_int!(u64, write_u64, read_u64);
|
|
|
|
impl_int!(i64, write_i64, read_i64);
|
|
|
|
|
2017-09-29 21:44:25 +03:00
|
|
|
impl<T> Readable for Vec<T>
|
|
|
|
where
|
|
|
|
T: Readable,
|
|
|
|
{
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<Vec<T>, Error> {
|
2017-09-05 08:50:25 +03:00
|
|
|
let mut buf = Vec::new();
|
|
|
|
loop {
|
|
|
|
let elem = T::read(reader);
|
|
|
|
match elem {
|
|
|
|
Ok(e) => buf.push(e),
|
2018-07-01 01:36:38 +03:00
|
|
|
Err(Error::IOErr(ref _d, ref kind)) if *kind == io::ErrorKind::UnexpectedEof => {
|
2019-02-15 16:41:19 +03:00
|
|
|
break;
|
2017-09-29 21:44:25 +03:00
|
|
|
}
|
2017-09-05 08:50:25 +03:00
|
|
|
Err(e) => return Err(e),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(buf)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-29 21:44:25 +03:00
|
|
|
impl<T> Writeable for Vec<T>
|
|
|
|
where
|
|
|
|
T: Writeable,
|
|
|
|
{
|
2017-09-05 08:50:25 +03:00
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
for elmt in self {
|
|
|
|
elmt.write(writer)?;
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-12 21:59:18 +03:00
|
|
|
impl<'a, A: Writeable> Writeable for &'a A {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
Writeable::write(*self, writer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-10 09:17:23 +03:00
|
|
|
impl<A: Writeable, B: Writeable> Writeable for (A, B) {
|
2017-06-01 00:44:44 +03:00
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
Writeable::write(&self.0, writer)?;
|
2017-06-01 00:44:44 +03:00
|
|
|
Writeable::write(&self.1, writer)
|
|
|
|
}
|
2017-04-10 09:17:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<A: Readable, B: Readable> Readable for (A, B) {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<(A, B), Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
Ok((Readable::read(reader)?, Readable::read(reader)?))
|
2017-06-01 00:44:44 +03:00
|
|
|
}
|
2017-04-10 09:17:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<A: Writeable, B: Writeable, C: Writeable> Writeable for (A, B, C) {
|
2017-06-01 00:44:44 +03:00
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
Writeable::write(&self.0, writer)?;
|
|
|
|
Writeable::write(&self.1, writer)?;
|
2017-06-01 00:44:44 +03:00
|
|
|
Writeable::write(&self.2, writer)
|
|
|
|
}
|
2017-04-10 09:17:23 +03:00
|
|
|
}
|
|
|
|
|
2017-07-12 21:59:18 +03:00
|
|
|
impl<A: Writeable, B: Writeable, C: Writeable, D: Writeable> Writeable for (A, B, C, D) {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
2018-06-04 19:05:49 +03:00
|
|
|
Writeable::write(&self.0, writer)?;
|
|
|
|
Writeable::write(&self.1, writer)?;
|
|
|
|
Writeable::write(&self.2, writer)?;
|
2017-07-12 21:59:18 +03:00
|
|
|
Writeable::write(&self.3, writer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-10 09:17:23 +03:00
|
|
|
impl<A: Readable, B: Readable, C: Readable> Readable for (A, B, C) {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<(A, B, C), Error> {
|
2017-09-29 21:44:25 +03:00
|
|
|
Ok((
|
2018-06-04 19:05:49 +03:00
|
|
|
Readable::read(reader)?,
|
|
|
|
Readable::read(reader)?,
|
|
|
|
Readable::read(reader)?,
|
2017-09-29 21:44:25 +03:00
|
|
|
))
|
2017-06-01 00:44:44 +03:00
|
|
|
}
|
2017-04-10 09:17:23 +03:00
|
|
|
}
|
|
|
|
|
2017-07-12 21:59:18 +03:00
|
|
|
impl<A: Readable, B: Readable, C: Readable, D: Readable> Readable for (A, B, C, D) {
|
2018-12-08 02:59:40 +03:00
|
|
|
fn read(reader: &mut dyn Reader) -> Result<(A, B, C, D), Error> {
|
2017-09-29 21:44:25 +03:00
|
|
|
Ok((
|
2018-06-04 19:05:49 +03:00
|
|
|
Readable::read(reader)?,
|
|
|
|
Readable::read(reader)?,
|
|
|
|
Readable::read(reader)?,
|
|
|
|
Readable::read(reader)?,
|
2017-09-29 21:44:25 +03:00
|
|
|
))
|
2017-07-12 21:59:18 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Writeable for [u8; 4] {
|
|
|
|
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
|
|
|
|
writer.write_bytes(self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-01 23:14:46 +03:00
|
|
|
/// Trait for types that serialize to a known fixed length.
|
|
|
|
pub trait FixedLength {
|
|
|
|
/// The length in bytes
|
|
|
|
const LEN: usize;
|
2018-02-22 16:45:13 +03:00
|
|
|
}
|
|
|
|
|
2018-11-01 23:14:46 +03:00
|
|
|
/// Trait for types that can be added to a PMMR.
|
2019-02-15 16:41:19 +03:00
|
|
|
pub trait PMMRable: Writeable + Clone + Debug + DefaultHashable {
|
2018-11-27 15:32:39 +03:00
|
|
|
/// The type of element actually stored in the MMR data file.
|
|
|
|
/// This allows us to store Hash elements in the header MMR for variable size BlockHeaders.
|
2019-04-13 01:41:21 +03:00
|
|
|
type E: FixedLength + Readable + Writeable + Debug;
|
2018-11-27 15:32:39 +03:00
|
|
|
|
|
|
|
/// Convert the pmmrable into the element to be stored in the MMR data file.
|
2018-12-02 22:59:24 +03:00
|
|
|
fn as_elmt(&self) -> Self::E;
|
2018-11-27 15:32:39 +03:00
|
|
|
}
|
2018-11-01 23:14:46 +03:00
|
|
|
|
2018-03-05 18:05:42 +03:00
|
|
|
/// Generic trait to ensure PMMR elements can be hashed with an index
|
|
|
|
pub trait PMMRIndexHashable {
|
|
|
|
/// Hash with a given index
|
|
|
|
fn hash_with_index(&self, index: u64) -> Hash;
|
|
|
|
}
|
|
|
|
|
2019-02-15 16:41:19 +03:00
|
|
|
impl<T: DefaultHashable> PMMRIndexHashable for T {
|
2018-03-05 18:05:42 +03:00
|
|
|
fn hash_with_index(&self, index: u64) -> Hash {
|
2018-03-22 07:58:25 +03:00
|
|
|
(index, self).hash()
|
2018-03-16 17:45:58 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-01 00:44:44 +03:00
|
|
|
/// Useful marker trait on types that can be sized byte slices
|
2017-08-03 19:57:55 +03:00
|
|
|
pub trait AsFixedBytes: Sized + AsRef<[u8]> {
|
2017-08-10 03:54:10 +03:00
|
|
|
/// The length in bytes
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> AsFixedBytes for &'a [u8] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
1
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
impl AsFixedBytes for Vec<u8> {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
self.len()
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
impl AsFixedBytes for [u8; 1] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
1
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
impl AsFixedBytes for [u8; 2] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
2
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
impl AsFixedBytes for [u8; 4] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
4
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-01-20 01:43:02 +03:00
|
|
|
impl AsFixedBytes for [u8; 6] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
6
|
2018-01-20 01:43:02 +03:00
|
|
|
}
|
|
|
|
}
|
2017-08-03 19:57:55 +03:00
|
|
|
impl AsFixedBytes for [u8; 8] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
8
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2017-10-17 00:23:10 +03:00
|
|
|
impl AsFixedBytes for [u8; 20] {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
20
|
2017-10-17 00:23:10 +03:00
|
|
|
}
|
2017-11-01 02:32:33 +03:00
|
|
|
}
|
|
|
|
impl AsFixedBytes for [u8; 32] {
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
32
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
impl AsFixedBytes for String {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
self.len()
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-08 02:59:40 +03:00
|
|
|
impl AsFixedBytes for crate::core::hash::Hash {
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
32
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-08 02:59:40 +03:00
|
|
|
impl AsFixedBytes for crate::util::secp::pedersen::RangeProof {
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
self.plen
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-08 02:59:40 +03:00
|
|
|
impl AsFixedBytes for crate::util::secp::Signature {
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
64
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-08 02:59:40 +03:00
|
|
|
impl AsFixedBytes for crate::util::secp::pedersen::Commitment {
|
2017-08-03 19:57:55 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
PEDERSEN_COMMITMENT_SIZE
|
2017-08-03 19:57:55 +03:00
|
|
|
}
|
|
|
|
}
|
2018-02-13 18:35:30 +03:00
|
|
|
impl AsFixedBytes for BlindingFactor {
|
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
SECRET_KEY_SIZE
|
2018-02-13 18:35:30 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-08 02:59:40 +03:00
|
|
|
impl AsFixedBytes for crate::keychain::Identifier {
|
2017-10-07 20:38:41 +03:00
|
|
|
fn len(&self) -> usize {
|
2018-10-23 22:09:16 +03:00
|
|
|
IDENTIFIER_SIZE
|
2017-10-07 20:38:41 +03:00
|
|
|
}
|
|
|
|
}
|
2019-03-07 22:08:29 +03:00
|
|
|
|
|
|
|
// serializer for io::Errorkind, originally auto-generated by serde-derive
|
|
|
|
// slightly modified to handle the #[non_exhaustive] tag on io::ErrorKind
|
|
|
|
fn serialize_error_kind<S>(
|
|
|
|
kind: &io::ErrorKind,
|
|
|
|
serializer: S,
|
|
|
|
) -> serde::export::Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
S: serde::Serializer,
|
|
|
|
{
|
|
|
|
match *kind {
|
|
|
|
io::ErrorKind::NotFound => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 0u32, "NotFound")
|
|
|
|
}
|
|
|
|
io::ErrorKind::PermissionDenied => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
1u32,
|
|
|
|
"PermissionDenied",
|
|
|
|
),
|
|
|
|
io::ErrorKind::ConnectionRefused => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
2u32,
|
|
|
|
"ConnectionRefused",
|
|
|
|
),
|
|
|
|
io::ErrorKind::ConnectionReset => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
3u32,
|
|
|
|
"ConnectionReset",
|
|
|
|
),
|
|
|
|
io::ErrorKind::ConnectionAborted => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
4u32,
|
|
|
|
"ConnectionAborted",
|
|
|
|
),
|
|
|
|
io::ErrorKind::NotConnected => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 5u32, "NotConnected")
|
|
|
|
}
|
|
|
|
io::ErrorKind::AddrInUse => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 6u32, "AddrInUse")
|
|
|
|
}
|
|
|
|
io::ErrorKind::AddrNotAvailable => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
7u32,
|
|
|
|
"AddrNotAvailable",
|
|
|
|
),
|
|
|
|
io::ErrorKind::BrokenPipe => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 8u32, "BrokenPipe")
|
|
|
|
}
|
|
|
|
io::ErrorKind::AlreadyExists => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
9u32,
|
|
|
|
"AlreadyExists",
|
|
|
|
),
|
|
|
|
io::ErrorKind::WouldBlock => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 10u32, "WouldBlock")
|
|
|
|
}
|
|
|
|
io::ErrorKind::InvalidInput => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
11u32,
|
|
|
|
"InvalidInput",
|
|
|
|
),
|
|
|
|
io::ErrorKind::InvalidData => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 12u32, "InvalidData")
|
|
|
|
}
|
|
|
|
io::ErrorKind::TimedOut => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 13u32, "TimedOut")
|
|
|
|
}
|
|
|
|
io::ErrorKind::WriteZero => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 14u32, "WriteZero")
|
|
|
|
}
|
|
|
|
io::ErrorKind::Interrupted => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 15u32, "Interrupted")
|
|
|
|
}
|
|
|
|
io::ErrorKind::Other => {
|
|
|
|
serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 16u32, "Other")
|
|
|
|
}
|
|
|
|
io::ErrorKind::UnexpectedEof => serde::Serializer::serialize_unit_variant(
|
|
|
|
serializer,
|
|
|
|
"ErrorKind",
|
|
|
|
17u32,
|
|
|
|
"UnexpectedEof",
|
|
|
|
),
|
|
|
|
// #[non_exhaustive] is used on the definition of ErrorKind for future compatability
|
|
|
|
// That means match statements always need to match on _.
|
|
|
|
// The downside here is that rustc won't be able to warn us if io::ErrorKind another
|
|
|
|
// field is added to io::ErrorKind
|
|
|
|
_ => serde::Serializer::serialize_unit_variant(serializer, "ErrorKind", 16u32, "Other"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// deserializer for io::Errorkind, originally auto-generated by serde-derive
|
|
|
|
fn deserialize_error_kind<'de, D>(deserializer: D) -> serde::export::Result<io::ErrorKind, D::Error>
|
|
|
|
where
|
|
|
|
D: serde::Deserializer<'de>,
|
|
|
|
{
|
|
|
|
#[allow(non_camel_case_types)]
|
|
|
|
enum Field {
|
|
|
|
field0,
|
|
|
|
field1,
|
|
|
|
field2,
|
|
|
|
field3,
|
|
|
|
field4,
|
|
|
|
field5,
|
|
|
|
field6,
|
|
|
|
field7,
|
|
|
|
field8,
|
|
|
|
field9,
|
|
|
|
field10,
|
|
|
|
field11,
|
|
|
|
field12,
|
|
|
|
field13,
|
|
|
|
field14,
|
|
|
|
field15,
|
|
|
|
field16,
|
|
|
|
field17,
|
|
|
|
}
|
|
|
|
struct FieldVisitor;
|
|
|
|
impl<'de> serde::de::Visitor<'de> for FieldVisitor {
|
|
|
|
type Value = Field;
|
|
|
|
fn expecting(
|
|
|
|
&self,
|
|
|
|
formatter: &mut serde::export::Formatter,
|
|
|
|
) -> serde::export::fmt::Result {
|
|
|
|
serde::export::Formatter::write_str(formatter, "variant identifier")
|
|
|
|
}
|
|
|
|
fn visit_u64<E>(self, value: u64) -> serde::export::Result<Self::Value, E>
|
|
|
|
where
|
|
|
|
E: serde::de::Error,
|
|
|
|
{
|
|
|
|
match value {
|
|
|
|
0u64 => serde::export::Ok(Field::field0),
|
|
|
|
1u64 => serde::export::Ok(Field::field1),
|
|
|
|
2u64 => serde::export::Ok(Field::field2),
|
|
|
|
3u64 => serde::export::Ok(Field::field3),
|
|
|
|
4u64 => serde::export::Ok(Field::field4),
|
|
|
|
5u64 => serde::export::Ok(Field::field5),
|
|
|
|
6u64 => serde::export::Ok(Field::field6),
|
|
|
|
7u64 => serde::export::Ok(Field::field7),
|
|
|
|
8u64 => serde::export::Ok(Field::field8),
|
|
|
|
9u64 => serde::export::Ok(Field::field9),
|
|
|
|
10u64 => serde::export::Ok(Field::field10),
|
|
|
|
11u64 => serde::export::Ok(Field::field11),
|
|
|
|
12u64 => serde::export::Ok(Field::field12),
|
|
|
|
13u64 => serde::export::Ok(Field::field13),
|
|
|
|
14u64 => serde::export::Ok(Field::field14),
|
|
|
|
15u64 => serde::export::Ok(Field::field15),
|
|
|
|
16u64 => serde::export::Ok(Field::field16),
|
|
|
|
17u64 => serde::export::Ok(Field::field17),
|
|
|
|
_ => serde::export::Err(serde::de::Error::invalid_value(
|
|
|
|
serde::de::Unexpected::Unsigned(value),
|
|
|
|
&"variant index 0 <= i < 18",
|
|
|
|
)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn visit_str<E>(self, value: &str) -> serde::export::Result<Self::Value, E>
|
|
|
|
where
|
|
|
|
E: serde::de::Error,
|
|
|
|
{
|
|
|
|
match value {
|
|
|
|
"NotFound" => serde::export::Ok(Field::field0),
|
|
|
|
"PermissionDenied" => serde::export::Ok(Field::field1),
|
|
|
|
"ConnectionRefused" => serde::export::Ok(Field::field2),
|
|
|
|
"ConnectionReset" => serde::export::Ok(Field::field3),
|
|
|
|
"ConnectionAborted" => serde::export::Ok(Field::field4),
|
|
|
|
"NotConnected" => serde::export::Ok(Field::field5),
|
|
|
|
"AddrInUse" => serde::export::Ok(Field::field6),
|
|
|
|
"AddrNotAvailable" => serde::export::Ok(Field::field7),
|
|
|
|
"BrokenPipe" => serde::export::Ok(Field::field8),
|
|
|
|
"AlreadyExists" => serde::export::Ok(Field::field9),
|
|
|
|
"WouldBlock" => serde::export::Ok(Field::field10),
|
|
|
|
"InvalidInput" => serde::export::Ok(Field::field11),
|
|
|
|
"InvalidData" => serde::export::Ok(Field::field12),
|
|
|
|
"TimedOut" => serde::export::Ok(Field::field13),
|
|
|
|
"WriteZero" => serde::export::Ok(Field::field14),
|
|
|
|
"Interrupted" => serde::export::Ok(Field::field15),
|
|
|
|
"Other" => serde::export::Ok(Field::field16),
|
|
|
|
"UnexpectedEof" => serde::export::Ok(Field::field17),
|
|
|
|
_ => serde::export::Err(serde::de::Error::unknown_variant(value, VARIANTS)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn visit_bytes<E>(self, value: &[u8]) -> serde::export::Result<Self::Value, E>
|
|
|
|
where
|
|
|
|
E: serde::de::Error,
|
|
|
|
{
|
|
|
|
match value {
|
|
|
|
b"NotFound" => serde::export::Ok(Field::field0),
|
|
|
|
b"PermissionDenied" => serde::export::Ok(Field::field1),
|
|
|
|
b"ConnectionRefused" => serde::export::Ok(Field::field2),
|
|
|
|
b"ConnectionReset" => serde::export::Ok(Field::field3),
|
|
|
|
b"ConnectionAborted" => serde::export::Ok(Field::field4),
|
|
|
|
b"NotConnected" => serde::export::Ok(Field::field5),
|
|
|
|
b"AddrInUse" => serde::export::Ok(Field::field6),
|
|
|
|
b"AddrNotAvailable" => serde::export::Ok(Field::field7),
|
|
|
|
b"BrokenPipe" => serde::export::Ok(Field::field8),
|
|
|
|
b"AlreadyExists" => serde::export::Ok(Field::field9),
|
|
|
|
b"WouldBlock" => serde::export::Ok(Field::field10),
|
|
|
|
b"InvalidInput" => serde::export::Ok(Field::field11),
|
|
|
|
b"InvalidData" => serde::export::Ok(Field::field12),
|
|
|
|
b"TimedOut" => serde::export::Ok(Field::field13),
|
|
|
|
b"WriteZero" => serde::export::Ok(Field::field14),
|
|
|
|
b"Interrupted" => serde::export::Ok(Field::field15),
|
|
|
|
b"Other" => serde::export::Ok(Field::field16),
|
|
|
|
b"UnexpectedEof" => serde::export::Ok(Field::field17),
|
|
|
|
_ => {
|
|
|
|
let value = &serde::export::from_utf8_lossy(value);
|
|
|
|
serde::export::Err(serde::de::Error::unknown_variant(value, VARIANTS))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
impl<'de> serde::Deserialize<'de> for Field {
|
|
|
|
#[inline]
|
|
|
|
fn deserialize<D>(deserializer: D) -> serde::export::Result<Self, D::Error>
|
|
|
|
where
|
|
|
|
D: serde::Deserializer<'de>,
|
|
|
|
{
|
|
|
|
serde::Deserializer::deserialize_identifier(deserializer, FieldVisitor)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
struct Visitor<'de> {
|
|
|
|
marker: serde::export::PhantomData<io::ErrorKind>,
|
|
|
|
lifetime: serde::export::PhantomData<&'de ()>,
|
|
|
|
}
|
|
|
|
impl<'de> serde::de::Visitor<'de> for Visitor<'de> {
|
|
|
|
type Value = io::ErrorKind;
|
|
|
|
fn expecting(
|
|
|
|
&self,
|
|
|
|
formatter: &mut serde::export::Formatter,
|
|
|
|
) -> serde::export::fmt::Result {
|
|
|
|
serde::export::Formatter::write_str(formatter, "enum io::ErrorKind")
|
|
|
|
}
|
|
|
|
fn visit_enum<A>(self, data: A) -> serde::export::Result<Self::Value, A::Error>
|
|
|
|
where
|
|
|
|
A: serde::de::EnumAccess<'de>,
|
|
|
|
{
|
|
|
|
match match serde::de::EnumAccess::variant(data) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
} {
|
|
|
|
(Field::field0, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::NotFound)
|
|
|
|
}
|
|
|
|
(Field::field1, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::PermissionDenied)
|
|
|
|
}
|
|
|
|
(Field::field2, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::ConnectionRefused)
|
|
|
|
}
|
|
|
|
(Field::field3, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::ConnectionReset)
|
|
|
|
}
|
|
|
|
(Field::field4, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::ConnectionAborted)
|
|
|
|
}
|
|
|
|
(Field::field5, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::NotConnected)
|
|
|
|
}
|
|
|
|
(Field::field6, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::AddrInUse)
|
|
|
|
}
|
|
|
|
(Field::field7, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::AddrNotAvailable)
|
|
|
|
}
|
|
|
|
(Field::field8, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::BrokenPipe)
|
|
|
|
}
|
|
|
|
(Field::field9, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::AlreadyExists)
|
|
|
|
}
|
|
|
|
(Field::field10, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::WouldBlock)
|
|
|
|
}
|
|
|
|
(Field::field11, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::InvalidInput)
|
|
|
|
}
|
|
|
|
(Field::field12, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::InvalidData)
|
|
|
|
}
|
|
|
|
(Field::field13, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::TimedOut)
|
|
|
|
}
|
|
|
|
(Field::field14, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::WriteZero)
|
|
|
|
}
|
|
|
|
(Field::field15, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::Interrupted)
|
|
|
|
}
|
|
|
|
(Field::field16, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::Other)
|
|
|
|
}
|
|
|
|
(Field::field17, variant) => {
|
|
|
|
match serde::de::VariantAccess::unit_variant(variant) {
|
|
|
|
serde::export::Ok(val) => val,
|
|
|
|
serde::export::Err(err) => {
|
|
|
|
return serde::export::Err(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
serde::export::Ok(io::ErrorKind::UnexpectedEof)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const VARIANTS: &'static [&'static str] = &[
|
|
|
|
"NotFound",
|
|
|
|
"PermissionDenied",
|
|
|
|
"ConnectionRefused",
|
|
|
|
"ConnectionReset",
|
|
|
|
"ConnectionAborted",
|
|
|
|
"NotConnected",
|
|
|
|
"AddrInUse",
|
|
|
|
"AddrNotAvailable",
|
|
|
|
"BrokenPipe",
|
|
|
|
"AlreadyExists",
|
|
|
|
"WouldBlock",
|
|
|
|
"InvalidInput",
|
|
|
|
"InvalidData",
|
|
|
|
"TimedOut",
|
|
|
|
"WriteZero",
|
|
|
|
"Interrupted",
|
|
|
|
"Other",
|
|
|
|
"UnexpectedEof",
|
|
|
|
];
|
|
|
|
serde::Deserializer::deserialize_enum(
|
|
|
|
deserializer,
|
|
|
|
"ErrorKind",
|
|
|
|
VARIANTS,
|
|
|
|
Visitor {
|
|
|
|
marker: serde::export::PhantomData::<io::ErrorKind>,
|
|
|
|
lifetime: serde::export::PhantomData,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|