@@ -5,6 +5,7 @@ use std::io::Read;
55use anyhow:: { anyhow, bail, ensure} ;
66
77use super :: { EncryptedVote , PublicKey , Tx , Vote , VoterProof } ;
8+ use crate :: utils:: { read_array, read_be_u32, read_be_u64, read_be_u8} ;
89
910impl Tx {
1011 /// Convert this `Tx` to its underlying sequence of bytes.
@@ -64,47 +65,38 @@ impl Tx {
6465 /// - Invalid public key.
6566 #[ allow( clippy:: indexing_slicing) ]
6667 pub fn from_bytes < R : Read > ( reader : & mut R ) -> anyhow:: Result < Self > {
67- let mut u8_buf = [ 0u8 ; 1 ] ;
68- let mut u32_buf = [ 0u8 ; 4 ] ;
69- let mut u64_buf = [ 0u8 ; 8 ] ;
70- let mut u256_buf = [ 0u8 ; 32 ] ;
71-
7268 // Skip tx size field
73- reader . read_exact ( & mut u32_buf ) ?;
69+ read_be_u32 ( reader ) ?;
7470
75- reader . read_exact ( & mut u8_buf ) ?;
71+ let padding_tag = read_be_u8 ( reader ) ?;
7672 ensure ! (
77- u8_buf[ 0 ] == 0 ,
78- "Invalid padding tag field value, must be equals to `0`, provided: {0}." ,
79- u8_buf[ 0 ]
73+ padding_tag == 0 ,
74+ "Invalid padding tag field value, must be equals to `0`, provided: {padding_tag}." ,
8075 ) ;
8176
82- reader . read_exact ( & mut u8_buf ) ?;
77+ let fragment_tag = read_be_u8 ( reader ) ?;
8378 ensure ! (
84- u8_buf[ 0 ] == 11 ,
85- "Invalid fragment tag field value, must be equals to `11`, provided: {0}." ,
86- u8_buf[ 0 ]
79+ fragment_tag == 11 ,
80+ "Invalid fragment tag field value, must be equals to `11`, provided: {fragment_tag}." ,
8781 ) ;
8882
89- reader. read_exact ( & mut u256_buf) ?;
90- let vote_plan_id = u256_buf;
83+ let vote_plan_id = read_array ( reader) ?;
9184
92- reader. read_exact ( & mut u8_buf) ?;
93- let proposal_index = u8_buf[ 0 ] ;
85+ let proposal_index = read_be_u8 ( reader) ?;
9486
95- reader . read_exact ( & mut u8_buf ) ?;
96- let vote = match u8_buf [ 0 ] {
87+ let vote_tag = read_be_u8 ( reader ) ?;
88+ let vote = match vote_tag {
9789 1 => {
98- reader . read_exact ( & mut u8_buf ) ?;
99- Vote :: Public ( u8_buf [ 0 ] )
90+ let vote = read_be_u8 ( reader ) ?;
91+ Vote :: Public ( vote )
10092 } ,
10193 2 => {
102- reader . read_exact ( & mut u8_buf ) ?;
103- let vote = EncryptedVote :: from_bytes ( reader, u8_buf [ 0 ] . into ( ) )
94+ let size = read_be_u8 ( reader ) ?;
95+ let vote = EncryptedVote :: from_bytes ( reader, size . into ( ) )
10496 . map_err ( |e| anyhow ! ( "Invalid encrypted vote, error: {e}." ) ) ?;
10597
106- reader . read_exact ( & mut u8_buf ) ?;
107- let proof = VoterProof :: from_bytes ( reader, u8_buf [ 0 ] . into ( ) )
98+ let size = read_be_u8 ( reader ) ?;
99+ let proof = VoterProof :: from_bytes ( reader, size . into ( ) )
108100 . map_err ( |e| anyhow ! ( "Invalid voter proof, error: {e}." ) ) ?;
109101
110102 Vote :: Private ( vote, proof)
@@ -113,34 +105,31 @@ impl Tx {
113105 } ;
114106
115107 // skip block date (epoch and slot)
116- reader . read_exact ( & mut u64_buf ) ?;
108+ read_be_u64 ( reader ) ?;
117109
118- reader . read_exact ( & mut u8_buf ) ?;
110+ let inputs_amount = read_be_u8 ( reader ) ?;
119111 ensure ! (
120- u8_buf[ 0 ] == 1 ,
121- "Invalid number of inputs, expected: `1`, provided: {0}" ,
122- u8_buf[ 0 ]
112+ inputs_amount == 1 ,
113+ "Invalid number of inputs, expected: `1`, provided: {inputs_amount}" ,
123114 ) ;
124115
125- reader . read_exact ( & mut u8_buf ) ?;
116+ let outputs_amount = read_be_u8 ( reader ) ?;
126117 ensure ! (
127- u8_buf[ 0 ] == 0 ,
128- "Invalid number of outputs, expected: `0`, provided: {0}" ,
129- u8_buf[ 0 ]
118+ outputs_amount == 0 ,
119+ "Invalid number of outputs, expected: `0`, provided: {outputs_amount}" ,
130120 ) ;
131121
132- reader . read_exact ( & mut u8_buf ) ?;
122+ let input_tag = read_be_u8 ( reader ) ?;
133123 ensure ! (
134- u8_buf[ 0 ] == 0xFF ,
135- "Invalid input tag, expected: `255`, provided: {0}" ,
136- u8_buf[ 0 ]
124+ input_tag == 0xFF ,
125+ "Invalid input tag, expected: `255`, provided: {input_tag}" ,
137126 ) ;
138127
139128 // skip value
140- reader . read_exact ( & mut u64_buf ) ?;
129+ read_be_u64 ( reader ) ?;
141130
142- reader . read_exact ( & mut u256_buf ) ?;
143- let public_key = PublicKey :: from_bytes ( & u256_buf )
131+ let public_key_bytes = read_array ( reader ) ?;
132+ let public_key = PublicKey :: from_bytes ( & public_key_bytes )
144133 . map_err ( |e| anyhow ! ( "Invalid public key, error: {e}." ) ) ?;
145134
146135 Ok ( Self {
0 commit comments