bitcointx 0.0.15

Bitcoin TX utility crate
Documentation
use crate::{Script, Serializable};
use std::convert::TryInto;

pub struct TxIn {
    pub prev_hash: Vec<u8>,
    pub prev_idx: u32,
    pub script_sig: Script,
    pub seq_no: u32,
}

impl TxIn {
    pub fn deserialize_outpoint(cur: &mut [u8]) -> (TxIn, &mut [u8]) {
        let (prev_hash, cur) = cur.split_at_mut(32);
        let (prev_idx_bytes, cur) = cur.split_at_mut(4);

        let txin = TxIn {
            prev_hash: prev_hash.to_vec(),
            prev_idx: u32::from_le_bytes((*prev_idx_bytes).try_into().unwrap()),
            script_sig: Script::new(),
            seq_no: 0,
        };

        return (txin, cur);
    }

    pub fn get_outpoint(&self) -> Vec<u8> {
        let mut outpoint: Vec<u8> = vec![];

        outpoint.extend(self.prev_hash.to_vec());
        outpoint.extend(self.prev_idx.to_le_bytes().to_vec());

        return outpoint;
    }

    pub fn get_seq_no(&self) -> Vec<u8> {
        return self.seq_no.to_le_bytes().to_vec();
    }
}

impl Serializable<TxIn> for TxIn {
    fn serialize(&self) -> Vec<u8> {
        panic!("Unimplemented!!");
    }

    fn deserialize(cur: &mut [u8]) -> (TxIn, &mut [u8]) {
        let (mut txin, cur) = Self::deserialize_outpoint(cur);
        let (script, cur) = Script::deserialize(cur);
        let (seq_no_bytes, cur) = cur.split_at_mut(4);

        txin.script_sig = script;
        txin.seq_no = u32::from_le_bytes((*seq_no_bytes).try_into().unwrap());

        return (txin, cur);
    }
}