1
- use bitcoin_slices:: bsl:: parse_len;
1
+ use bitcoin_slices:: bsl:: scan_len;
2
+ use bitcoin_slices:: number:: { read_u32, read_u8} ;
2
3
use bitcoin_slices:: { bsl, Parse , ParseResult } ;
3
- use bitcoin_slices:: { number :: U32 , number :: U8 , read_slice , SResult , Visit , Visitor } ;
4
+ use bitcoin_slices:: { SResult , Visit , Visitor } ;
4
5
5
6
struct BlockExtra < ' a > {
6
7
slice : & ' a [ u8 ] ,
@@ -14,67 +15,58 @@ impl<'a> AsRef<[u8]> for BlockExtra<'a> {
14
15
15
16
impl < ' a > Visit < ' a > for BlockExtra < ' a > {
16
17
fn visit < ' b , V : Visitor > ( slice : & ' a [ u8 ] , visit : & ' b mut V ) -> SResult < ' a , Self > {
17
- let version = U8 :: parse ( slice) ?;
18
- let version_int: u8 = version. parsed ( ) . into ( ) ;
19
- dbg ! ( version_int) ;
18
+ let version = read_u8 ( slice) ?;
20
19
let mut consumed = 1 ;
21
20
22
- let block_size = if version_int == 0 {
21
+ let block_size = if version == 0 {
23
22
let block = bsl:: Block :: visit ( & slice[ consumed..] , visit) ?;
24
23
consumed += block. consumed ( ) ;
25
24
None
26
- } else if version_int == 1 {
27
- let block_size = U32 :: parse ( & slice[ consumed..] ) ?;
25
+ } else if version == 1 {
26
+ let block_size = read_u32 ( & slice[ consumed..] ) ?;
28
27
consumed += 4 ;
29
28
let block = bsl:: Block :: visit ( & slice[ consumed..] , visit) ?;
30
29
consumed += block. consumed ( ) ;
31
30
Some ( block_size)
32
31
} else {
33
32
panic ! ( "invalid version" )
34
33
} ;
35
- dbg ! ( consumed) ;
36
34
37
- let block_hash = read_slice ( & slice[ consumed..] , 32 ) ?;
35
+ let _block_hash = slice
36
+ . get ( consumed..consumed + 32 )
37
+ . ok_or ( bitcoin_slices:: Error :: MoreBytesNeeded ) ?;
38
38
consumed += 32 ;
39
39
40
40
if block_size. is_none ( ) {
41
- let _ = U32 :: parse ( block_hash . remaining ( ) ) ?;
41
+ let _ = read_u32 ( & slice [ consumed.. ] ) ?;
42
42
consumed += 4 ;
43
43
}
44
44
45
- dbg ! ( consumed) ;
46
- let next_len = parse_len ( & slice[ consumed..] ) ?;
47
- consumed += next_len. consumed ( ) ;
45
+ let next_len = scan_len ( & slice[ consumed..] , & mut consumed) ? as usize ;
46
+ consumed += 32 * next_len;
48
47
49
- for _ in 0 ..next_len. n ( ) {
50
- let _ = read_slice ( & slice[ consumed..] , 32 ) ?;
51
- consumed += 32 ;
52
- }
53
-
54
- let _ = U32 :: parse ( & slice[ consumed..] ) ?;
48
+ let _ = read_u32 ( & slice[ consumed..] ) ?;
55
49
consumed += 4 ;
56
50
57
- let map_len = U32 :: parse ( & slice[ consumed..] ) ?;
51
+ let map_len = read_u32 ( & slice[ consumed..] ) ?;
58
52
consumed += 4 ;
59
53
60
- for _ in 0u32 ..map_len. parsed ( ) . into ( ) {
54
+ for _ in 0u32 ..map_len {
61
55
// add visit extra call
62
56
let outpoint = bsl:: OutPoint :: parse ( & slice[ consumed..] ) ?;
63
57
consumed += outpoint. consumed ( ) ;
64
58
let txout = bsl:: TxOut :: parse ( & slice[ consumed..] ) ?;
65
59
consumed += txout. consumed ( ) ;
66
60
}
67
- let _ = U32 :: parse ( & slice[ consumed..] ) ?;
61
+ let _ = read_u32 ( & slice[ consumed..] ) ?;
68
62
consumed += 4 ;
69
- let _ = U32 :: parse ( & slice[ consumed..] ) ?;
63
+ let _ = read_u32 ( & slice[ consumed..] ) ?;
70
64
consumed += 4 ;
71
- let txids_len = U32 :: parse ( & slice[ consumed..] ) ?;
65
+ let txids_len = read_u32 ( & slice[ consumed..] ) ? as usize ;
72
66
consumed += 4 ;
73
67
74
- for _ in 0u32 ..txids_len. parsed ( ) . into ( ) {
75
- let _ = read_slice ( & slice[ consumed..] , 32 ) ?;
76
- consumed += 32 ;
77
- }
68
+ consumed += 32 * txids_len;
69
+
78
70
let ( slice, remaining) = slice. split_at ( consumed) ;
79
71
let block_extra = BlockExtra { slice } ;
80
72
Ok ( ParseResult :: new ( remaining, block_extra) )
0 commit comments