Skip to content

Commit d960c42

Browse files
committed
f - simpler nonce tag calculation
1 parent 06d460e commit d960c42

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

lightning/src/offers/merkle.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,21 @@ use util::ser::{BigSize, Readable};
1515
const SIGNATURE_TYPES: core::ops::RangeInclusive<u64> = 240..=1000;
1616

1717
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+
}));
2625
let leaf_tag = tagged_hash_engine(sha256::Hash::hash("LnLeaf".as_bytes()));
2726
let branch_tag = tagged_hash_engine(sha256::Hash::hash("LnBranch".as_bytes()));
2827

2928
let mut leaves = Vec::new();
30-
for record in TlvStream::new(&data[..]) {
29+
for record in tlv_stream {
3130
if !SIGNATURE_TYPES.contains(&record.r#type.0) {
3231
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));
3433
}
3534
}
3635

@@ -94,6 +93,7 @@ impl<'a> TlvStream<'a> {
9493
}
9594

9695
struct TlvRecord<'a> {
96+
type_bytes: &'a [u8],
9797
r#type: BigSize,
9898
_length: BigSize,
9999
_value: &'a [u8],
@@ -112,8 +112,10 @@ impl<'a> Iterator for TlvStream<'a> {
112112
let start = self.data.position();
113113

114114
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];
116117

118+
let length: BigSize = Readable::read(&mut self.data).unwrap();
117119
let offset = self.data.position();
118120
let end = offset + length.0;
119121

@@ -122,7 +124,7 @@ impl<'a> Iterator for TlvStream<'a> {
122124

123125
self.data.set_position(end);
124126

125-
Some(TlvRecord { r#type, _length: length, _value: value, data })
127+
Some(TlvRecord { type_bytes, r#type, _length: length, _value: value, data })
126128
} else {
127129
None
128130
}

0 commit comments

Comments
 (0)