@@ -33,162 +33,113 @@ namespace database {
3333// This normalized approach is also the most efficient.
3434
3535TEMPLATE
36- bool CLASS::get_wire_header (byteflipper& flipper ,
36+ bool CLASS::get_wire_header (bytewriter& sink ,
3737 const header_link& link) const NOEXCEPT
3838{
39- const auto start = flipper.get_write_position ();
40- table::header::wire_header header{ {}, flipper };
41- if (!store_.header .get (link, header))
42- {
43- flipper.invalidate ();
44- return false ;
45- }
46-
47- // Genesis header parent is defaulted.
48- if (header.parent_fk == schema::header::link::terminal)
49- return true ;
50-
51- flipper.set_position (start);
52- table::header::wire_key key{ {}, flipper };
53- if (!store_.header .get (header.parent_fk , key))
54- {
55- flipper.invalidate ();
56- return false ;
57- }
58-
59- return true ;
39+ // Double read of header table is small, prevents need for writer rewind.
40+ const auto parent = to_parent (link);
41+ table::header::wire_header header{ {}, sink, get_header_key (parent) };
42+ return store_.header .get (link, header);
6043}
6144
6245TEMPLATE
63- bool CLASS::get_wire_input (byteflipper& flipper ,
46+ bool CLASS::get_wire_input (bytewriter& sink ,
6447 const point_link& link) const NOEXCEPT
6548{
66- // [point]
67- table::point::wire_point point{ {}, flipper };
49+ table::point::wire_point point{ {}, sink };
6850 if (!store_.point .get (link, point))
69- {
70- flipper.invalidate ();
7151 return false ;
72- }
7352
74- // [[size]script]
7553 table::ins::get_input ins{};
76- table::input::wire_script script{ {}, flipper };
54+ table::input::wire_script script{ {}, sink };
7755 if (!store_.ins .get (link, ins) ||
7856 !store_.input .get (ins.input_fk , script))
79- {
80- flipper.invalidate ();
8157 return false ;
82- }
8358
84- // [sequence]
85- flipper.write_4_bytes_little_endian (ins.sequence );
59+ sink.write_4_bytes_little_endian (ins.sequence );
8660 return true ;
8761}
8862
8963TEMPLATE
90- bool CLASS::get_wire_output (byteflipper& flipper ,
64+ bool CLASS::get_wire_output (bytewriter& sink ,
9165 const output_link& link) const NOEXCEPT
9266{
93- // [value][[[size]script]]
94- table::output::wire_script out{ {}, flipper };
95- if (!store_.output .get (link, out))
96- {
97- flipper.invalidate ();
98- return false ;
99- }
100-
101- return true ;
67+ table::output::wire_script out{ {}, sink };
68+ return store_.output .get (link, out);
10269}
10370
10471TEMPLATE
105- bool CLASS::get_wire_witness (byteflipper& flipper ,
72+ bool CLASS::get_wire_witness (bytewriter& sink ,
10673 const point_link& link) const NOEXCEPT
10774{
108- // [count][[[size]element]]
10975 table::ins::get_input ins{};
110- table::input::wire_witness wire{ {}, flipper };
111- if (!store_.ins .get (link, ins) ||
112- !store_.input .get (ins.input_fk , wire))
113- {
114- flipper.invalidate ();
115- return false ;
116- }
117-
118- return true ;
76+ table::input::wire_witness wire{ {}, sink };
77+ return store_.ins .get (link, ins)
78+ && store_.input .get (ins.input_fk , wire);
11979}
12080
12181TEMPLATE
122- bool CLASS::get_wire_tx (byteflipper& flipper , const tx_link& link,
82+ bool CLASS::get_wire_tx (bytewriter& sink , const tx_link& link,
12383 bool witness) const NOEXCEPT
12484{
12585 table::transaction::record tx{};
12686 if (!store_.tx .get (link, tx))
127- {
128- flipper.invalidate ();
12987 return false ;
130- }
13188
13289 table::outs::record outs{};
13390 outs.out_fks .resize (tx.outs_count );
13491 if (!store_.outs .get (tx.outs_fk , outs))
135- {
136- flipper.invalidate ();
13792 return false ;
138- }
13993
14094 // Point links are contiguous (computed).
14195 const auto ins_begin = tx.point_fk ;
14296 const auto ins_count = tx.ins_count ;
14397 const auto ins_final = ins_begin + ins_count;
14498 const auto witnessed = witness && (tx.heavy != tx.light );
14599
146- flipper .write_4_bytes_little_endian (tx.version );
100+ sink .write_4_bytes_little_endian (tx.version );
147101
148102 if (witnessed)
149103 {
150- flipper .write_byte (system::chain::witness_marker);
151- flipper .write_byte (system::chain::witness_enabled);
104+ sink .write_byte (system::chain::witness_marker);
105+ sink .write_byte (system::chain::witness_enabled);
152106 }
153107
154- flipper .write_variable (ins_count);
108+ sink .write_variable (ins_count);
155109 for (auto fk = ins_begin; fk < ins_final; ++fk)
156- if (!get_wire_input (flipper , fk))
110+ if (!get_wire_input (sink , fk))
157111 return false ;
158112
159- flipper .write_variable (outs.out_fks .size ());
113+ sink .write_variable (outs.out_fks .size ());
160114 for (const auto & fk: outs.out_fks )
161- if (!get_wire_output (flipper , fk))
115+ if (!get_wire_output (sink , fk))
162116 return false ;
163117
164118 if (witnessed)
165119 {
166120 for (auto fk = ins_begin; fk < ins_final; ++fk)
167- if (!get_wire_witness (flipper , fk))
121+ if (!get_wire_witness (sink , fk))
168122 return false ;
169123 }
170124
171- flipper .write_4_bytes_little_endian (tx.locktime );
125+ sink .write_4_bytes_little_endian (tx.locktime );
172126 return true ;
173127}
174128
175129TEMPLATE
176- bool CLASS::get_wire_block (byteflipper& flipper , const header_link& link,
130+ bool CLASS::get_wire_block (bytewriter& sink , const header_link& link,
177131 bool witness) const NOEXCEPT
178132{
179- if (!get_wire_header (flipper , link))
133+ if (!get_wire_header (sink , link))
180134 return false ;
181135
182136 const auto txs = to_transactions (link);
183137 if (txs.empty ())
184- {
185- flipper.invalidate ();
186138 return false ;
187- }
188139
189- flipper .write_variable (txs.size ());
140+ sink .write_variable (txs.size ());
190141 for (const auto & tx_link: txs)
191- if (!get_wire_tx (flipper , tx_link, witness))
142+ if (!get_wire_tx (sink , tx_link, witness))
192143 return false ;
193144
194145 return true ;
0 commit comments