Skip to content

Commit b081a93

Browse files
committed
dynafed: replace calculate_root with new version
1 parent c895ff4 commit b081a93

File tree

2 files changed

+90
-39
lines changed

2 files changed

+90
-39
lines changed

src/block.rs

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -638,24 +638,34 @@ mod tests {
638638

639639
#[test]
640640
fn dynafed_block() {
641+
// Copied from elements RPC during a functionary integration test run
641642
let block: Block = hex_deserialize!("\
642-
000000a07a7159e1b793a80d826f72ddcfb11397160773ebc6e5ea10f3adb6ef\
643-
ef481eb2cb94ec7aafb983b5ef45a33d49b725088abc43a127c035ef636a8852\
644-
ecf9526d7bf2305d01000000012200204ae81572f06e1b88fd5ced7a1a000945\
645-
432e83e1551e6f721ee9c00b8cc332604b000000000101510102000000010100\
646-
00000000000000000000000000000000000000000000000000000000000000ff\
647-
ffffff03510101ffffffff0201ed455f3f6bd15c60a3e770a04cbfcc482cb1bf\
648-
95a0ac1db9bede08cac049783901000000000000000000016a01ed455f3f6bd1\
649-
5c60a3e770a04cbfcc482cb1bf95a0ac1db9bede08cac0497839010000000000\
650-
00000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1\
651-
f47155db62d63f1e047d45000000000000012000000000000000000000000000\
652-
000000000000000000000000000000000000000000000000\
643+
000000a0da9d569617d1d65c3390a01c18c4fa7c4d0f4738b6fc2b5c5faf2e8a\
644+
463abbaa46eb9123808e1e2ff75e9472fa0f0589b53b7518a69d3d6fcb9228ed\
645+
345734ea06b9c45d070000000122002057c555a91edf9552282d88624d1473c2\
646+
75e64b7218870eb8fb0335b442976b8d02010000fbee9cea00d8efdc49cfbec3\
647+
28537e0d7032194de6ebf3cf42e5c05bb89a08b100040047304402206f55bc87\
648+
1387a9840489d47624b02995e774e3b70fed56d1eb43a9a53d4fd3e102201e1c\
649+
bfbbd1079f5bea3bc216882d3fefbf6f27aa761820d3a88f12e5a5ea7ff00148\
650+
3045022100c072816f6561e73ee6c0ae32d55c3eec4da73b035425e4eb05ab50\
651+
772591b4360220311bf295010094a489d9b280d9dafb724d776a1d99b9ede31c\
652+
4b59bc2095c5c30169522103cadff18e928133df2e670a3715c4e7a81d357de3\
653+
6ddaa5016628e70a3e6a452f21021f0d8638c413ef7769cd711ce84c8f192f5a\
654+
85f0fd6d8e63ddb4d2cf6740b23b210296db75c11ea3a292a372f6c94f5013ea\
655+
eb379f701857a702f3b83f88da21be6f53ae0102000000010100000000000000\
656+
00000000000000000000000000000000000000000000000000ffffffff035701\
657+
01ffffffff020137c495f58d698979ff9124e8c7455fe79b13ddb96afa25c458\
658+
94eb059868a8c001000000000000000000016a0137c495f58d698979ff9124e8\
659+
c7455fe79b13ddb96afa25c45894eb059868a8c001000000000000000000266a\
660+
24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d6\
661+
3f1e047d45000000000000012000000000000000000000000000000000000000\
662+
000000000000000000000000000000000000\
653663
");
654664

655665
// Test that this is a block with compact current params and null proposed params
656666
if let ExtData::Dynafed { current, proposed, .. } = block.clone().header.ext {
657667
if let dynafed::Params::Compact { signblock_witness_limit, .. } = current {
658-
assert_eq!(signblock_witness_limit, 75);
668+
assert_eq!(signblock_witness_limit, 258);
659669
} else {
660670
panic!("Current block dynafed params not compact");
661671
}
@@ -670,30 +680,37 @@ mod tests {
670680

671681
assert_eq!(
672682
block.bitcoin_hash().to_string(),
673-
"4c7b60fc11a380811cfb8a17201ba54506a896eb1f53e9646d8bc2398d2448bd"
683+
"4961df970cf12d789383974e6ab439f780d956b5a50162ca9d281362e46c605a"
674684
);
675685
assert_eq!(block.header.version, 0x20000000);
676686

677687
// Full current and proposal
678688
let block: Block = hex_deserialize!("\
679-
000000a08b73cb590b11730880dd9c042101e853bcd2d5195f8efcffa66df48e\
680-
bf39d8c10a9de8013a78fb0acc86dd7e1c137581e4951b196d7c9d8f96a90bd3\
681-
c4768c575f535c5dcc010000022200204ae81572f06e1b88fd5ced7a1a000945\
682-
432e83e1551e6f721ee9c00b8cc332604b00000017a91472c44f957fc011d97e\
683-
3406667dca5b1c930c4026870151014202fcba7ecf41bc7e1be4ee122d9d22e3\
684-
333671eb0a3a87b5cdf099d59874e1940f02fcba7ecf41bc7e1be4ee122d9d22\
685-
e3333671eb0a3a87b5cdf099d59874e1940f021600142bb5aebe7c280263fa60\
686-
6c97e4f6c07ee62dddf0640000002200208c2574892063f995fdf756bce07f46\
687-
c1a5193e54cd52837ed91e32008ccf41ac0152014203808355deeb0555203b53\
688-
df7ef8f36edaf66ab0207ca1b11968a7ac421554e62102fcba7ecf41bc7e1be4\
689-
ee122d9d22e3333671eb0a3a87b5cdf099d59874e1940f010151010200000001\
690-
0100000000000000000000000000000000000000000000000000000000000000\
691-
00ffffffff0502cc010101ffffffff0201230f4f5d4b7c6fa845806ee4f67713\
692-
459e1b69e8e60fcee2e4940c7a0d5de1b201000000002540be4000015101230f\
693-
4f5d4b7c6fa845806ee4f67713459e1b69e8e60fcee2e4940c7a0d5de1b20100\
694-
0000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19\
695-
cb5bc1b1f47155db62d63f1e047d450000000000000120000000000000000000\
696-
00000000000000000000000000000000000000000000000000000000\
689+
000000a01ecf88cda4d9e6339109c685417c526e8316fe0d3ea058765634dcbb\
690+
205d3081bd83073b1f1793154ab820c70a1fda32a0d45bb0e1f40c0c61ae0350\
691+
7f49c293debcc45d1400000002220020a6794de47a1612cc94c1b978d5bd1b25\
692+
873f4cab0b1a76260b0b8af9ad954dc74b0100002200204ae81572f06e1b88fd\
693+
5ced7a1a000945432e83e1551e6f721ee9c00b8cc33260015100022200204cb4\
694+
0d59d6e1bbe963f3a63021b0d7d5474b87206978a1129fbffc4d1c1cf7e44b01\
695+
00002200204ae81572f06e1b88fd5ced7a1a000945432e83e1551e6f721ee9c0\
696+
0b8cc332600151000500483045022100ab2203a8a68d7eca8a3a0fac91e7c780\
697+
2656d937535800da82f7102e1c06f7b80220576f004cb14b95178c71e36bf947\
698+
bfea496b00b66c18d2eb8febf46362d50e2b0147304402202d4630887d661a50\
699+
b76b7b32555fd76906ad298ce24483df42310ffbf62d451802200e0d64069e58\
700+
047c271c1b4051c1ff3d1cba7d32e56abb0d8b8bc30e1bed075b014830450221\
701+
00c6b196967c661c4543802a895ae731af44862e75d9e3c65b8efdd668727a34\
702+
af022041ff4d67029052eb6305d25d0fc4813d21a939ff5316a12562d0c90389\
703+
76f8e1016953210296db75c11ea3a292a372f6c94f5013eaeb379f701857a702\
704+
f3b83f88da21be6f21021f0d8638c413ef7769cd711ce84c8f192f5a85f0fd6d\
705+
8e63ddb4d2cf6740b23b2103cadff18e928133df2e670a3715c4e7a81d357de3\
706+
6ddaa5016628e70a3e6a452f53ae010200000001010000000000000000000000\
707+
000000000000000000000000000000000000000000ffffffff0401140101ffff\
708+
ffff020137c495f58d698979ff9124e8c7455fe79b13ddb96afa25c45894eb05\
709+
9868a8c001000000000000000000016a0137c495f58d698979ff9124e8c7455f\
710+
e79b13ddb96afa25c45894eb059868a8c001000000000000000000266a24aa21\
711+
a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e04\
712+
7d45000000000000012000000000000000000000000000000000000000000000\
713+
000000000000000000000000000000\
697714
");
698715

699716
// Test that this is a block with full current params and full proposed params
@@ -713,7 +730,7 @@ mod tests {
713730
}
714731
assert_eq!(
715732
block.bitcoin_hash().to_string(),
716-
"6d6d1172376a187579396df29cd6bbf36761d504fb400eea2f314b3d6b6b44f5"
733+
"e9a5176b1690a448f76fb691ab4d516e60e13a6e7a49454c62dbf0d611ffcce7"
717734
);
718735
}
719736
}

src/dynafed.rs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ pub enum Params {
3636
signblockscript: bitcoin::Script,
3737
/// Maximum, in bytes, of the size of a blocksigning witness
3838
signblock_witness_limit: u32,
39+
/// Merkle root of extra data
40+
elided_root: sha256::Midstate,
3941
},
4042
/// Full dynamic federations parameters
4143
Full {
@@ -139,12 +141,27 @@ impl Params {
139141
return sha256::Midstate::from_inner([0u8; 32]);
140142
}
141143

144+
let extra_root = match *self {
145+
Params::Null => return sha256::Midstate::from_inner([0u8; 32]),
146+
Params::Compact { ref elided_root, .. } => *elided_root,
147+
Params::Full { ref fedpeg_program, ref fedpegscript, ref extension_space, .. } => {
148+
let leaves = [
149+
serialize_hash(fedpeg_program).into_inner(),
150+
serialize_hash(fedpegscript).into_inner(),
151+
serialize_hash(extension_space).into_inner(),
152+
];
153+
::fast_merkle_root::fast_merkle_root(&leaves[..])
154+
},
155+
};
142156
let leaves = [
143157
serialize_hash(self.signblockscript().unwrap()).into_inner(),
144158
serialize_hash(&self.signblock_witness_limit().unwrap()).into_inner(),
145-
serialize_hash(self.fedpeg_program().unwrap_or(&bitcoin::Script::new())).into_inner(),
146-
serialize_hash(self.fedpegscript().unwrap_or(&Vec::new())).into_inner(),
147-
serialize_hash(self.extension_space().unwrap_or(&Vec::new())).into_inner(),
159+
];
160+
let compact_root = ::fast_merkle_root::fast_merkle_root(&leaves[..]);
161+
162+
let leaves = [
163+
compact_root.into_inner(),
164+
extra_root.into_inner(),
148165
];
149166
::fast_merkle_root::fast_merkle_root(&leaves[..])
150167
}
@@ -159,6 +176,7 @@ impl<'de> Deserialize<'de> for Params {
159176
Unknown,
160177
SignblockScript,
161178
SignblockWitnessLimit,
179+
ElidedRoot,
162180
FedpegProgram,
163181
FedpegScript,
164182
ExtSpace,
@@ -176,6 +194,7 @@ impl<'de> Deserialize<'de> for Params {
176194
match v {
177195
"signblockscript" => Ok(Enum::SignblockScript),
178196
"signblock_witness_limit" => Ok(Enum::SignblockWitnessLimit),
197+
"elided_root" => Ok(Enum::ElidedRoot),
179198
"fedpeg_program" => Ok(Enum::FedpegProgram),
180199
"fedpegscript" => Ok(Enum::FedpegScript),
181200
"extension_space" => Ok(Enum::ExtSpace),
@@ -204,6 +223,7 @@ impl<'de> Deserialize<'de> for Params {
204223
{
205224
let mut signblockscript = None;
206225
let mut signblock_witness_limit = None;
226+
let mut elided_root = None;
207227
let mut fedpeg_program = None;
208228
let mut fedpegscript = None;
209229
let mut extension_space = None;
@@ -219,6 +239,9 @@ impl<'de> Deserialize<'de> for Params {
219239
Some(Enum::SignblockWitnessLimit) => {
220240
signblock_witness_limit = Some(map.next_value()?);
221241
},
242+
Some(Enum::ElidedRoot) => {
243+
elided_root = Some(map.next_value()?);
244+
},
222245
Some(Enum::FedpegProgram) => {
223246
fedpeg_program = Some(map.next_value()?);
224247
},
@@ -235,13 +258,15 @@ impl<'de> Deserialize<'de> for Params {
235258
match (
236259
signblockscript,
237260
signblock_witness_limit,
261+
elided_root,
238262
fedpeg_program,
239263
fedpegscript,
240264
extension_space,
241265
) {
242266
(
243267
Some(signblockscript),
244268
Some(signblock_witness_limit),
269+
_,
245270
Some(fedpeg_program),
246271
Some(fedpegscript),
247272
Some(extension_space),
@@ -255,12 +280,14 @@ impl<'de> Deserialize<'de> for Params {
255280
(
256281
Some(signblockscript),
257282
Some(signblock_witness_limit),
283+
Some(elided_root),
258284
_,
259285
_,
260286
_
261287
) => Ok(Params::Compact {
262288
signblockscript,
263289
signblock_witness_limit,
290+
elided_root,
264291
}),
265292
// We should probably be stricter about errors here
266293
_ => Ok(Params::Null),
@@ -292,10 +319,12 @@ impl Serialize for Params {
292319
Params::Compact {
293320
ref signblockscript,
294321
ref signblock_witness_limit,
322+
ref elided_root,
295323
} => {
296324
let mut st = s.serialize_struct("Params", 2)?;
297325
st.serialize_field("signblockscript", signblockscript)?;
298326
st.serialize_field("signblock_witness_limit", signblock_witness_limit)?;
327+
st.serialize_field("elided_root", elided_root)?;
299328
st.end()
300329
},
301330
Params::Full {
@@ -324,10 +353,12 @@ impl Encodable for Params {
324353
Params::Compact {
325354
ref signblockscript,
326355
ref signblock_witness_limit,
356+
ref elided_root,
327357
} => {
328358
Encodable::consensus_encode(&1u8, &mut s)? +
329359
Encodable::consensus_encode(signblockscript, &mut s)? +
330-
Encodable::consensus_encode(signblock_witness_limit, &mut s)?
360+
Encodable::consensus_encode(signblock_witness_limit, &mut s)? +
361+
Encodable::consensus_encode(&elided_root.into_inner(), &mut s)?
331362
},
332363
Params::Full {
333364
ref signblockscript,
@@ -355,6 +386,7 @@ impl Decodable for Params {
355386
1 => Ok(Params::Compact {
356387
signblockscript: Decodable::consensus_decode(&mut d)?,
357388
signblock_witness_limit: Decodable::consensus_decode(&mut d)?,
389+
elided_root: sha256::Midstate::from_inner(Decodable::consensus_decode(&mut d)?),
358390
}),
359391
2 => Ok(Params::Full {
360392
signblockscript: Decodable::consensus_decode(&mut d)?,
@@ -376,6 +408,7 @@ mod tests {
376408

377409
use bitcoin;
378410
use bitcoin::hashes::hex::ToHex;
411+
use bitcoin::hashes::sha256;
379412

380413
#[test]
381414
fn test_param_roots() {
@@ -415,10 +448,11 @@ mod tests {
415448
let compact_entry = Params::Compact {
416449
signblockscript: signblockscript.clone(),
417450
signblock_witness_limit: signblock_wl,
451+
elided_root: sha256::Midstate::from_inner([0; 32]),
418452
};
419453
assert_eq!(
420454
compact_entry.calculate_root().to_hex(),
421-
"dff5f3793abc06a6d75e80fe3cfd47406f732fa4ec9305960ae2a229222a1ad5"
455+
"f98f149fd11da6fbe26d0ee53cadd28372fa9eed2cb7080f41da7ca311531777"
422456
);
423457

424458
let full_entry = Params::Full {
@@ -430,7 +464,7 @@ mod tests {
430464
};
431465
assert_eq!(
432466
full_entry.calculate_root().to_hex(),
433-
"175be2087ba7cc0e33348bef493bd3e34f31f64bf9226e5881ab310dafa432ff"
467+
"8eb1b83cce69a3d8b0bfb7fbe77ae8f1d24b57a9cae047b8c0aba084ad878249"
434468
);
435469

436470
let header = ::block::BlockHeader{
@@ -443,7 +477,7 @@ mod tests {
443477
};
444478
assert_eq!(
445479
header.calculate_dynafed_params_root().unwrap().to_hex(),
446-
"e56cf79487952dfa85fe6a85829600adc19714ba6ab1157fdff02b25ae60cee2"
480+
"113160f76dc17fe367a2def79aefe06feeea9c795310c9e88aeedc23e145982e"
447481
);
448482
}
449483
}

0 commit comments

Comments
 (0)