cs_mwc_bch/messages/
tx_in.rs

1use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
2use messages::OutPoint;
3use script::Script;
4use std::io;
5use std::io::{Read, Write};
6use util::{var_int, Result, Serializable};
7
8/// Transaction input
9#[derive(Debug, Default, PartialEq, Eq, Hash, Clone)]
10pub struct TxIn {
11    /// The previous output transaction reference
12    pub prev_output: OutPoint,
13    /// Signature script for confirming authorization
14    pub sig_script: Script,
15    /// Transaction version as defined by the sender for replacement or negotiation
16    pub sequence: u32,
17}
18
19impl TxIn {
20    /// Returns the size of the transaction input in bytes
21    pub fn size(&self) -> usize {
22        OutPoint::SIZE + var_int::size(self.sig_script.0.len() as u64) + self.sig_script.0.len() + 4
23    }
24}
25
26impl Serializable<TxIn> for TxIn {
27    fn read(reader: &mut dyn Read) -> Result<TxIn> {
28        let prev_output = OutPoint::read(reader)?;
29        let script_len = var_int::read(reader)?;
30        let mut sig_script = Script(vec![0; script_len as usize]);
31        reader.read(&mut sig_script.0)?;
32        let sequence = reader.read_u32::<LittleEndian>()?;
33        Ok(TxIn {
34            prev_output,
35            sig_script,
36            sequence,
37        })
38    }
39
40    fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
41        self.prev_output.write(writer)?;
42        var_int::write(self.sig_script.0.len() as u64, writer)?;
43        writer.write(&self.sig_script.0)?;
44        writer.write_u32::<LittleEndian>(self.sequence)?;
45        Ok(())
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use std::io::Cursor;
53    use util::Hash256;
54
55    #[test]
56    fn write_read() {
57        let mut v = Vec::new();
58        let t = TxIn {
59            prev_output: OutPoint {
60                hash: Hash256([6; 32]),
61                index: 8,
62            },
63            sig_script: Script(vec![255; 254]),
64            sequence: 100,
65        };
66        t.write(&mut v).unwrap();
67        assert!(v.len() == t.size());
68        assert!(TxIn::read(&mut Cursor::new(&v)).unwrap() == t);
69    }
70}