cs_mwc_bch/messages/
tx_in.rs1use 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#[derive(Debug, Default, PartialEq, Eq, Hash, Clone)]
10pub struct TxIn {
11 pub prev_output: OutPoint,
13 pub sig_script: Script,
15 pub sequence: u32,
17}
18
19impl TxIn {
20 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}