From ae843d856f937fe17c5e6631083485e05a991d22 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Wed, 11 Nov 2020 14:25:29 -0800 Subject: [PATCH] Add comment explaining work to expanded conversion --- zebra-state/src/tests.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/zebra-state/src/tests.rs b/zebra-state/src/tests.rs index 772fc25d8..d352fbdb9 100644 --- a/zebra-state/src/tests.rs +++ b/zebra-state/src/tests.rs @@ -44,8 +44,15 @@ impl FakeChainHelper for Arc { fn set_work(mut self, work: u128) -> Arc { use primitive_types::U256; - let work: U256 = work.into(); + + // Work is calculated from expanded difficulty with the equation `work = 2^256 / (expanded + 1)` + // By balancing the equation we get `expanded = (2^256 / work) - 1` + // `2^256` is too large to represent, so we instead use the following equivalent equations + // `expanded = (2^256 / work) - (work / work)` + // `expanded = (2^256 - work) / work` + // `expanded = ((2^256 - 1) - work + 1) / work` + // `(2^256 - 1 - work)` is equivalent to `!work` when work is a U256 let expanded = (!work + 1) / work; let expanded = ExpandedDifficulty::from(expanded);