@@ -15,22 +15,21 @@ use util::ser::{BigSize, Readable};
15
15
const SIGNATURE_TYPES : core:: ops:: RangeInclusive < u64 > = 240 ..=1000 ;
16
16
17
17
pub ( super ) fn root_hash ( data : & [ u8 ] ) -> sha256:: Hash {
18
- let mut engine = sha256:: Hash :: engine ( ) ;
19
- engine. input ( "LnAll" . as_bytes ( ) ) ;
20
- for record in TlvStream :: new ( & data[ ..] ) {
21
- if !SIGNATURE_TYPES . contains ( & record. r#type . 0 ) {
22
- engine. input ( record. as_ref ( ) ) ;
23
- }
24
- }
25
- let nonce_tag = tagged_hash_engine ( sha256:: Hash :: from_engine ( engine) ) ;
18
+ let mut tlv_stream = TlvStream :: new ( & data[ ..] ) . peekable ( ) ;
19
+ let nonce_tag = tagged_hash_engine ( sha256:: Hash :: from_engine ( {
20
+ let mut engine = sha256:: Hash :: engine ( ) ;
21
+ engine. input ( "LnNonce" . as_bytes ( ) ) ;
22
+ engine. input ( tlv_stream. peek ( ) . unwrap ( ) . type_bytes ) ;
23
+ engine
24
+ } ) ) ;
26
25
let leaf_tag = tagged_hash_engine ( sha256:: Hash :: hash ( "LnLeaf" . as_bytes ( ) ) ) ;
27
26
let branch_tag = tagged_hash_engine ( sha256:: Hash :: hash ( "LnBranch" . as_bytes ( ) ) ) ;
28
27
29
28
let mut leaves = Vec :: new ( ) ;
30
- for record in TlvStream :: new ( & data [ .. ] ) {
29
+ for record in tlv_stream {
31
30
if !SIGNATURE_TYPES . contains ( & record. r#type . 0 ) {
32
31
leaves. push ( tagged_hash_from_engine ( leaf_tag. clone ( ) , & record) ) ;
33
- leaves. push ( tagged_hash_from_engine ( nonce_tag. clone ( ) , & record) ) ;
32
+ leaves. push ( tagged_hash_from_engine ( nonce_tag. clone ( ) , & record. type_bytes ) ) ;
34
33
}
35
34
}
36
35
@@ -94,6 +93,7 @@ impl<'a> TlvStream<'a> {
94
93
}
95
94
96
95
struct TlvRecord < ' a > {
96
+ type_bytes : & ' a [ u8 ] ,
97
97
r#type : BigSize ,
98
98
_length : BigSize ,
99
99
_value : & ' a [ u8 ] ,
@@ -112,8 +112,10 @@ impl<'a> Iterator for TlvStream<'a> {
112
112
let start = self . data . position ( ) ;
113
113
114
114
let r#type: BigSize = Readable :: read ( & mut self . data ) . unwrap ( ) ;
115
- let length: BigSize = Readable :: read ( & mut self . data ) . unwrap ( ) ;
115
+ let offset = self . data . position ( ) ;
116
+ let type_bytes = & self . data . get_ref ( ) [ start as usize ..offset as usize ] ;
116
117
118
+ let length: BigSize = Readable :: read ( & mut self . data ) . unwrap ( ) ;
117
119
let offset = self . data . position ( ) ;
118
120
let end = offset + length. 0 ;
119
121
@@ -122,7 +124,7 @@ impl<'a> Iterator for TlvStream<'a> {
122
124
123
125
self . data . set_position ( end) ;
124
126
125
- Some ( TlvRecord { r#type, _length : length, _value : value, data } )
127
+ Some ( TlvRecord { type_bytes , r#type, _length : length, _value : value, data } )
126
128
} else {
127
129
None
128
130
}
0 commit comments