Trait bdk_chain::bitcoin::consensus::encode::Decodable

pub trait Decodable: Sized {
    // Provided methods
    fn consensus_decode_from_finite_reader<R>(
        reader: &mut R
    ) -> Result<Self, Error>
       where R: BufRead + ?Sized { ... }
    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
       where R: BufRead + ?Sized { ... }
}
Expand description

Data which can be encoded in a consensus-consistent way.

Provided Methods§

fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
where R: BufRead + ?Sized,

Decode Self from a size-limited reader.

Like consensus_decode but relies on the reader being limited in the amount of data it returns, e.g. by being wrapped in std::io::Take.

Failing to abide to this requirement might lead to memory exhaustion caused by malicious inputs.

Users should default to consensus_decode, but when data to be decoded is already in a byte vector of a limited size, calling this function directly might be marginally faster (due to avoiding extra checks).

§Rules for trait implementations
  • Simple types that that have a fixed size (own and member fields), don’t have to overwrite this method, or be concern with it.
  • Types that deserialize using externally provided length should implement it:
    • Make consensus_decode forward to consensus_decode_bytes_from_finite_reader with the reader wrapped by Take. Failure to do so, without other forms of memory exhaustion protection might lead to resource exhaustion vulnerability.
    • Put a max cap on things like Vec::with_capacity to avoid oversized allocations, and rely on the reader running out of data, and collections reallocating on a legitimately oversized input data, instead of trying to enforce arbitrary length limits.
  • Types that contain other types that implement custom consensus_decode_from_finite_reader, should also implement it applying same rules, and in addition make sure to call consensus_decode_from_finite_reader on all members, to avoid creating redundant Take wrappers. Failure to do so might result only in a tiny performance hit.

fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
where R: BufRead + ?Sized,

Decode an object with a well-defined format.

This is the method that should be implemented for a typical, fixed sized type implementing this trait. Default implementation is wrapping the reader in crate::io::Take to limit the input size to MAX_VEC_SIZE, and forwards the call to Self::consensus_decode_from_finite_reader, which is convenient for types that override Self::consensus_decode_from_finite_reader instead.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

§

impl Decodable for Cow<'static, str>

§

fn consensus_decode<R>(r: &mut R) -> Result<Cow<'static, str>, Error>
where R: BufRead + ?Sized,

§

impl Decodable for bool

§

impl Decodable for i8

§

fn consensus_decode<R>(r: &mut R) -> Result<i8, Error>
where R: BufRead + ?Sized,

§

impl Decodable for i16

§

impl Decodable for i32

§

impl Decodable for i64

§

impl Decodable for u8

§

fn consensus_decode<R>(r: &mut R) -> Result<u8, Error>
where R: BufRead + ?Sized,

§

impl Decodable for u16

§

impl Decodable for u32

§

impl Decodable for u64

§

impl Decodable for Box<[u8]>

§

impl Decodable for [u8; 2]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 2], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 4]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 4], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 6]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 6], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 8]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 8], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 10]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 10], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 12]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 12], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 16]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 16], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 32]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 32], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u8; 33]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u8; 33], Error>
where R: BufRead + ?Sized,

§

impl Decodable for [u16; 8]

§

fn consensus_decode<R>(r: &mut R) -> Result<[u16; 8], Error>
where R: BufRead + ?Sized,

§

impl<T0, T1> Decodable for (T0, T1)
where T0: Decodable, T1: Decodable,

§

impl<T0, T1, T2> Decodable for (T0, T1, T2)
where T0: Decodable, T1: Decodable, T2: Decodable,

§

impl<T0, T1, T2, T3> Decodable for (T0, T1, T2, T3)
where T0: Decodable, T1: Decodable, T2: Decodable, T3: Decodable,

§

impl<T0, T1, T2, T3, T4> Decodable for (T0, T1, T2, T3, T4)
where T0: Decodable, T1: Decodable, T2: Decodable, T3: Decodable, T4: Decodable,

§

impl<T0, T1, T2, T3, T4, T5> Decodable for (T0, T1, T2, T3, T4, T5)
where T0: Decodable, T1: Decodable, T2: Decodable, T3: Decodable, T4: Decodable, T5: Decodable,

§

impl<T0, T1, T2, T3, T4, T5, T6> Decodable for (T0, T1, T2, T3, T4, T5, T6)
where T0: Decodable, T1: Decodable, T2: Decodable, T3: Decodable, T4: Decodable, T5: Decodable, T6: Decodable,

§

impl<T0, T1, T2, T3, T4, T5, T6, T7> Decodable for (T0, T1, T2, T3, T4, T5, T6, T7)
where T0: Decodable, T1: Decodable, T2: Decodable, T3: Decodable, T4: Decodable, T5: Decodable, T6: Decodable, T7: Decodable,

Implementors§

§

impl Decodable for LockTime

§

impl Decodable for AddrV2

§

impl Decodable for Inventory

§

impl Decodable for BloomFlags

§

impl Decodable for RejectReason

§

impl Decodable for String

§

impl Decodable for Vec<(u32, Address)>

§

impl Decodable for Vec<Inventory>

§

impl Decodable for Vec<u8>

§

impl Decodable for Vec<u64>

§

impl Decodable for Vec<Vec<u8>>

§

impl Decodable for Vec<PrefilledTransaction>

§

impl Decodable for Vec<ShortId>

§

impl Decodable for Vec<Header>

§

impl Decodable for Vec<AddrV2Message>

§

impl Decodable for Vec<BlockHash>

§

impl Decodable for Vec<FilterHash>

§

impl Decodable for Vec<FilterHeader>

§

impl Decodable for Vec<TapLeafHash>

§

impl Decodable for Vec<Transaction>

§

impl Decodable for Vec<TxIn>

§

impl Decodable for Vec<TxMerkleNode>

§

impl Decodable for Vec<TxOut>

§

impl Decodable for Vec<VarInt>

§

impl Decodable for BlockTransactions

§

impl Decodable for BlockTransactionsRequest

§

impl Decodable for HeaderAndShortIds

§

impl Decodable for PrefilledTransaction

§

impl Decodable for ShortId

§

impl Decodable for Header

§

impl Decodable for bdk_chain::bitcoin::blockdata::block::Version

§

impl Decodable for bdk_chain::bitcoin::blockdata::transaction::Version

§

impl Decodable for bdk_chain::bitcoin::hashes::sha256::Hash

§

impl Decodable for bdk_chain::bitcoin::hashes::sha256d::Hash

§

impl Decodable for PartialMerkleTree

§

impl Decodable for AddrV2Message

§

impl Decodable for CommandString

§

impl Decodable for RawNetworkMessage

§

impl Decodable for GetBlocksMessage

§

impl Decodable for GetHeadersMessage

§

impl Decodable for FilterAdd

§

impl Decodable for FilterLoad

§

impl Decodable for BlockTxn

§

impl Decodable for CmpctBlock

§

impl Decodable for GetBlockTxn

§

impl Decodable for SendCmpct

§

impl Decodable for CFCheckpt

§

impl Decodable for CFHeaders

§

impl Decodable for CFilter

§

impl Decodable for GetCFCheckpt

§

impl Decodable for GetCFHeaders

§

impl Decodable for GetCFilters

§

impl Decodable for Reject

§

impl Decodable for VersionMessage

§

impl Decodable for Address

§

impl Decodable for Magic

§

impl Decodable for ServiceFlags

§

impl Decodable for Amount

§

impl Decodable for Block

§

impl Decodable for BlockHash

§

impl Decodable for CompactTarget

§

impl Decodable for FilterHash

§

impl Decodable for FilterHeader

§

impl Decodable for MerkleBlock

§

impl Decodable for OutPoint

§

impl Decodable for ScriptBuf

§

impl Decodable for Sequence

§

impl Decodable for TapLeafHash

§

impl Decodable for Transaction

§

impl Decodable for TxIn

§

impl Decodable for TxMerkleNode

§

impl Decodable for TxOut

§

impl Decodable for Txid

§

impl Decodable for VarInt

§

impl Decodable for Witness

§

impl Decodable for WitnessMerkleNode

§

impl Decodable for Wtxid

§

impl Decodable for CheckedData

§

impl<Subtype> Decodable for ProprietaryKey<Subtype>
where Subtype: Copy + From<u8> + Into<u8>,