From 0b8d54a472d5dd01c758a87bf0da72da391fde5e Mon Sep 17 00:00:00 2001 From: JesseAbram <33698952+JesseAbram@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:02:42 -0400 Subject: [PATCH 1/7] Fix master build (#1079) * Fix master build * fix --- .../src/helpers/tests.rs | 43 ++++++++++++------- .../src/validator/tests.rs | 2 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/crates/threshold-signature-server/src/helpers/tests.rs b/crates/threshold-signature-server/src/helpers/tests.rs index abbbb9ffc..71a72e099 100644 --- a/crates/threshold-signature-server/src/helpers/tests.rs +++ b/crates/threshold-signature-server/src/helpers/tests.rs @@ -21,7 +21,10 @@ use crate::{ app, chain_api::{ - entropy::{self, runtime_types::bounded_collections::bounded_vec::BoundedVec}, + entropy::{ + self, runtime_types::bounded_collections::bounded_vec::BoundedVec, + runtime_types::pallet_staking_extension::pallet::JumpStartStatus, + }, EntropyConfig, }, get_signer, @@ -49,7 +52,7 @@ use futures::future::join_all; use parity_scale_codec::Encode; use std::time::Duration; use subxt::{ - backend::legacy::LegacyRpcMethods, events::EventsClient, ext::sp_core::sr25519, tx::PairSigner, + backend::legacy::LegacyRpcMethods, ext::sp_core::sr25519, tx::PairSigner, utils::AccountId32 as SubxtAccountId32, Config, OnlineClient, }; use tokio::sync::OnceCell; @@ -389,23 +392,31 @@ pub async fn do_jump_start( .collect::>(), ) .await; - for response_result in response_results { - assert_eq!(response_result.unwrap().text().await.unwrap(), ""); + + let jump_start_status_query = entropy::storage().staking_extension().jump_start_progress(); + let mut jump_start_status = query_chain(api, rpc, jump_start_status_query.clone(), None) + .await + .unwrap() + .unwrap() + .jump_start_status; + let mut i = 0; + while format!("{:?}", jump_start_status) != format!("{:?}", JumpStartStatus::Done) { + tokio::time::sleep(Duration::from_secs(1)).await; + jump_start_status = query_chain(api, rpc, jump_start_status_query.clone(), None) + .await + .unwrap() + .unwrap() + .jump_start_status; + i += 1; + if i > 75 { + panic!("Jump start failed"); + } } - // Wait for jump start event - let mut got_jumpstart_event = false; - for _ in 0..75 { - std::thread::sleep(std::time::Duration::from_millis(1000)); - let block_hash = rpc.chain_get_block_hash(None).await.unwrap(); - let events = EventsClient::new(api.clone()).at(block_hash.unwrap()).await.unwrap(); - let jump_start_event = events.find::(); - if let Some(_event) = jump_start_event.flatten().next() { - got_jumpstart_event = true; - break; - }; + assert_eq!(format!("{:?}", jump_start_status), format!("{:?}", JumpStartStatus::Done)); + for response_result in response_results { + assert_eq!(response_result.unwrap().text().await.unwrap(), ""); } - assert!(got_jumpstart_event); } /// Submit a jumpstart extrinsic diff --git a/crates/threshold-signature-server/src/validator/tests.rs b/crates/threshold-signature-server/src/validator/tests.rs index 20190b421..a82e0aa58 100644 --- a/crates/threshold-signature-server/src/validator/tests.rs +++ b/crates/threshold-signature-server/src/validator/tests.rs @@ -221,7 +221,7 @@ async fn test_reshare() { } // Check that rotating the network key wont work again later - run_to_block(&rpc, block_number + 7).await; + run_to_block(&rpc, block_number + 9).await; let response_stale = client.post("http://127.0.0.1:3001/validator/rotate_network_key").send().await.unwrap(); From 367fccb6d4e803a5a5935020c1567da6d57ef2ed Mon Sep 17 00:00:00 2001 From: peg Date: Tue, 1 Oct 2024 18:05:06 +0200 Subject: [PATCH 2/7] Pregenerate keyshares sets for all possible initial signer comittees (#1073) * Pregenerate keyshares for all combinations of non-signers * Dont add keyshare for the non-signer * Tidy how validator names are represented in create-test-keyshares * Tidy create test keyshares fn * Rm comment * Ignore absense of non-signer * Add publish=false to create-test-keyshares crate * Readme * Readme * Update crates/threshold-signature-server/src/helpers/tests.rs Co-authored-by: Hernando Castano * Minor improvement to create test keyshare crate --------- Co-authored-by: Hernando Castano --- Cargo.lock | 1 + README.md | 10 +++ crates/testing-utils/keyshares/README.md | 2 + .../alice/keyshare-held-by-bob.keyshare | Bin 0 -> 3472 bytes .../alice/keyshare-held-by-charlie.keyshare | Bin 0 -> 3472 bytes .../alice/keyshare-held-by-dave.keyshare | Bin 0 -> 3472 bytes .../bob/keyshare-held-by-alice.keyshare | Bin 0 -> 3472 bytes .../bob/keyshare-held-by-charlie.keyshare | Bin 0 -> 3472 bytes .../bob/keyshare-held-by-dave.keyshare | Bin 0 -> 3472 bytes .../charlie/keyshare-held-by-alice.keyshare | Bin 0 -> 3472 bytes .../charlie/keyshare-held-by-bob.keyshare | Bin 0 -> 3472 bytes .../charlie/keyshare-held-by-dave.keyshare | Bin 0 -> 3472 bytes .../production/dave-keyshare-0.keyshare | Bin 3472 -> 0 bytes .../production/dave-keyshare-1.keyshare | Bin 3472 -> 0 bytes .../production/dave-keyshare-2.keyshare | Bin 3472 -> 0 bytes .../dave-keyshare-held-by-alice.keyshare | Bin 3472 -> 0 bytes .../dave-keyshare-held-by-bob.keyshare | Bin 3472 -> 0 bytes .../dave-keyshare-held-by-dave.keyshare | Bin 3472 -> 0 bytes .../dave/keyshare-held-by-alice.keyshare | Bin 0 -> 3472 bytes .../dave/keyshare-held-by-bob.keyshare | Bin 0 -> 3472 bytes .../dave/keyshare-held-by-charlie.keyshare | Bin 0 -> 3472 bytes .../production/eve-keyshare-0.keyshare | Bin 3472 -> 0 bytes .../production/eve-keyshare-1.keyshare | Bin 3472 -> 0 bytes .../production/eve-keyshare-2.keyshare | Bin 3472 -> 0 bytes .../eve-keyshare-held-by-alice.keyshare | Bin 3472 -> 0 bytes .../eve-keyshare-held-by-bob.keyshare | Bin 3472 -> 0 bytes .../eve-keyshare-held-by-dave.keyshare | Bin 3472 -> 0 bytes .../test/alice/keyshare-held-by-bob.keyshare | Bin 0 -> 2192 bytes .../alice/keyshare-held-by-charlie.keyshare | Bin 0 -> 2192 bytes .../test/alice/keyshare-held-by-dave.keyshare | Bin 0 -> 2192 bytes .../test/bob/keyshare-held-by-alice.keyshare | Bin 0 -> 2192 bytes .../bob/keyshare-held-by-charlie.keyshare | Bin 0 -> 2192 bytes .../test/bob/keyshare-held-by-dave.keyshare | Bin 0 -> 2192 bytes .../charlie/keyshare-held-by-alice.keyshare | Bin 0 -> 2192 bytes .../charlie/keyshare-held-by-bob.keyshare | Bin 0 -> 2192 bytes .../charlie/keyshare-held-by-dave.keyshare | Bin 0 -> 2192 bytes .../keyshares/test/dave-keyshare-0.keyshare | Bin 2192 -> 0 bytes .../keyshares/test/dave-keyshare-1.keyshare | Bin 2192 -> 0 bytes .../keyshares/test/dave-keyshare-2.keyshare | Bin 2192 -> 0 bytes .../test/dave-keyshare-held-by-alice.keyshare | Bin 2192 -> 0 bytes .../test/dave-keyshare-held-by-bob.keyshare | Bin 2192 -> 0 bytes .../dave-keyshare-held-by-charlie.keyshare | Bin 2192 -> 0 bytes .../test/dave/keyshare-held-by-alice.keyshare | Bin 0 -> 2192 bytes .../test/dave/keyshare-held-by-bob.keyshare | Bin 0 -> 2192 bytes .../dave/keyshare-held-by-charlie.keyshare | Bin 0 -> 2192 bytes .../keyshares/test/eve-keyshare-0.keyshare | Bin 2192 -> 0 bytes .../keyshares/test/eve-keyshare-1.keyshare | Bin 2192 -> 0 bytes .../keyshares/test/eve-keyshare-2.keyshare | Bin 2192 -> 0 bytes .../test/eve-keyshare-held-by-alice.keyshare | Bin 2192 -> 0 bytes .../test/eve-keyshare-held-by-bob.keyshare | Bin 2192 -> 0 bytes .../eve-keyshare-held-by-charlie.keyshare | Bin 2192 -> 0 bytes .../src/create_test_keyshares.rs | 20 ++--- .../src/helpers/launch.rs | 6 ++ .../src/helpers/tests.rs | 35 ++++---- scripts/create-test-keyshares/Cargo.toml | 2 + scripts/create-test-keyshares/README.md | 17 ++++ scripts/create-test-keyshares/src/main.rs | 84 +++++++++++------- 57 files changed, 112 insertions(+), 65 deletions(-) create mode 100644 crates/testing-utils/keyshares/README.md create mode 100644 crates/testing-utils/keyshares/production/alice/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/production/alice/keyshare-held-by-charlie.keyshare create mode 100644 crates/testing-utils/keyshares/production/alice/keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/production/bob/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/production/bob/keyshare-held-by-charlie.keyshare create mode 100644 crates/testing-utils/keyshares/production/bob/keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/production/charlie/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/production/charlie/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/production/charlie/keyshare-held-by-dave.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-0.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-1.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-2.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-held-by-alice.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-held-by-bob.keyshare delete mode 100644 crates/testing-utils/keyshares/production/dave-keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/production/dave/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/production/dave/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/production/dave/keyshare-held-by-charlie.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-0.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-1.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-2.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-held-by-alice.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-held-by-bob.keyshare delete mode 100644 crates/testing-utils/keyshares/production/eve-keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/test/alice/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/test/alice/keyshare-held-by-charlie.keyshare create mode 100644 crates/testing-utils/keyshares/test/alice/keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/test/bob/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/test/bob/keyshare-held-by-charlie.keyshare create mode 100644 crates/testing-utils/keyshares/test/bob/keyshare-held-by-dave.keyshare create mode 100644 crates/testing-utils/keyshares/test/charlie/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/test/charlie/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/test/charlie/keyshare-held-by-dave.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-0.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-1.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-2.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-held-by-alice.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-held-by-bob.keyshare delete mode 100644 crates/testing-utils/keyshares/test/dave-keyshare-held-by-charlie.keyshare create mode 100644 crates/testing-utils/keyshares/test/dave/keyshare-held-by-alice.keyshare create mode 100644 crates/testing-utils/keyshares/test/dave/keyshare-held-by-bob.keyshare create mode 100644 crates/testing-utils/keyshares/test/dave/keyshare-held-by-charlie.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-0.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-1.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-2.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-held-by-alice.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-held-by-bob.keyshare delete mode 100644 crates/testing-utils/keyshares/test/eve-keyshare-held-by-charlie.keyshare create mode 100644 scripts/create-test-keyshares/README.md diff --git a/Cargo.lock b/Cargo.lock index 807a0ba74..8070e6e3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2519,6 +2519,7 @@ dependencies = [ "entropy-shared", "entropy-testing-utils", "entropy-tss", + "sp-core 31.0.0", "synedrion", "tokio", ] diff --git a/README.md b/README.md index 0d7d3d69d..2e2d584dc 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,16 @@ It is however only intended for use with test networks and has no secure private Everytime a change to the chain's interface happens, metadata needs to be pulled. You'll need to install Subxt using `cargo install subxt-cli`. Then [run a development chain](#getting-started-with-docker) and then invoke [the `./scripts/pull_entropy_metadata.sh` script](./scripts/pull_entropy_metadata.sh). +## Regenerating test keyshares + +To speed up running tests, some tests use pre-generated keyshares rather than running a distributed key generation during the test. If you need to regenerate these keyshares because something has changed in either Synedrion or the identities of the test TS servers, you can run: + +```sh +./scripts/create-test-keyshares.sh` +``` + +from the project root. For an explanation of how the test keyshare sets are structured, see [`create-test-keyshares`](./scripts/create-test-keyshares). + ## Support Need help with something not necessarily related to `entropy-core`? diff --git a/crates/testing-utils/keyshares/README.md b/crates/testing-utils/keyshares/README.md new file mode 100644 index 000000000..84645bb23 --- /dev/null +++ b/crates/testing-utils/keyshares/README.md @@ -0,0 +1,2 @@ +See [`create-test-keyshares`](../../../scripts/create-test-keyshares) for an explanation of how +these are generated and what the different keyshare sets represent. diff --git a/crates/testing-utils/keyshares/production/alice/keyshare-held-by-bob.keyshare b/crates/testing-utils/keyshares/production/alice/keyshare-held-by-bob.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..b0f17866c1449059e2a753deb0f071e8917abf42 GIT binary patch literal 3472 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 G?fyT)o+cy! literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/alice/keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/production/alice/keyshare-held-by-dave.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..5ae742022253e5ce3660c661a12110b1c3120564 GIT binary patch literal 3472 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 E5AA~&761SM literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/bob/keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/production/bob/keyshare-held-by-alice.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..9a912171111a5bab2c222dcd6b1828a5cadc2fd3 GIT binary patch literal 3472 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 IJR{4009kxBbpQYW literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-alice.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..2ee39900df1f68d53e69b00730b9b8342b4e1dfd GIT binary patch literal 3472 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 Ruh8x@TA@yK;P223{{t;hDJ=j1 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-bob.keyshare b/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-bob.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..81c53944d1779cb4fe07ad3847e6532b888d40b5 GIT binary patch literal 3472 zcmbW3hdUIGAIEVnBRhr5{BohprE z%3j%f#}$wx)P}J7Pz(x# zL_yKccD`5zxQ~{hystCF0c%Sq42I9u^c|j(7598unm$jQK^XH8KACYDcyixm9nGa5 z069e%$^s5|g}B}`K$@dnp)kWh50s{li>C_%MRa9uRY)+tc_;XM5$#5kL>C!S16`62&DzOl-@;s7?k~KW!v)kG z&)A+)m3+Ce2XJPw!f4SapVAk7W;OeYwv6Y_^k#k`QhNDcJDwJR>GcEI^y8L;7Qs9k z+9(UVmjqzE@I`d~Xm`qBR{C&m?VC1LE2`N{f#6$m&yBqX-_XlbpZ>)y(GlilKYv$v zr|?QuhqO5uo7h&Wx0;poa-}$d-aKX1ilSp(ONa}%Nvnz!dC;pQ4IY`ER2ChN+Kv?Y-fXg`fhRm$2Il29 zk{okoB`VB2EfN?+W?WBm15}h49e!erR-45;VM98BR9eZ`*BT|pZte-!uZ%Z_{Zb~ zP|{hjyQ8`=VyV%)63_N6c417a>ryZ)P@rhJCVy!-({D)GKb4pXA6cE}6VsLD0PMNW zUmdMxy{okV2gFIys}MDbc3a&`ZN38!%2`-3!3aY9DR+~GO4{M5G-@=LUa)_1Gki>N z!6;6$$#1e^M539U7R!Rs?D<>n z`;-8lT?f%<&n3eQj;`U38i$%$Gs2%I(}TrJgc0P2!5RkqmhKbc#*XEm&$F9!1hV$z z%sD&^WIIbGC(_`1KjoCS^D9wrEI+8H+HJnv2yxzE`Cq5mb_IX<3b2s!rVMq!yis0Iulc?LMDer{S8`76I2dMN3A%& z%6j~%#OcKjfEKbxif`=mKSDqt6xVy})&Ui_E|0XwEFLX;>HBUoi&z?7YxAd+p1Zb& z3k!{aZu!;HdSWJwotm&`yaKca`(+^tx8isktd3FUoM*F-;+)=`Ye-rrv)0ZQ2q+}o z;}{G4exz0X5&xf zxlnSsM7eL!J(UqS4S$yyndb1jN`&&_=+=I~{O~XDE9>|Y5Sv!RKNrik*T*;hsW2*+ z+05`vX4qyZtnMm3j;$5i`KqU69aHw8IFy8AO4tnqtZeg_CB>sx5 zyI@TD`~;hJnJyl~94qtjU9(W@Om@BGqq|I9x|!L=h3o5KFutR6z#6FuZ-1goi_rM> zhEp{5;UY;&c~T+q(?BZSv3%z_#a-b;D8&8B1qq4TYUO=53S+yJ-l+dkQKipvLwbH+ zUQ4NO+SKBudvu6m%7W>J=^irFd5>-oB?qjy|K}ks!0umciRaIx*8^qbKAwA(*F`SM zcE2%zgghs|u|_Uu`|Wvz3Um*4$@0J_;&p$ zV_jNz0g~}}z-c4vhE7e@pOk2Hz%ei1DMHMcqJyve=pT1u#xl5_9c)tdT5tf;g}yhr z-^O%)e4pU=VvnZY;#Rb)#C*=}Fkr)@Yie2a+~dN2;Mosf2M=q@4T`#}%#PGWYCvw? zkjI~fzGGf5@C5K)KZn0FpRgO>9Go@$%O|! zX!6qLW9INv&b~F9w3i{4NjO#feusQZM7GRdMf*(qo?RY??cT#E*=QtUuBb8|s^DBh zacTwX?G6UgUo#8^eU0x}vWj$XuH`?sP-1kR;y!N`)zGj?jU3|@0t;NTn4pDakJ&y8 z*UZX$_{b0TbU+UmmMLGa3`{0nU_MWK{_Kw2NBObq@or(TaXZo-q&kZQjTX`XoDfHu zivJbs@RW*Em%W0|jgNANB_NYq1;O^qS4Bvi_2%i_-qM}L4-CF(JYlj)s~lB&G6^vt zF9Qn1{5iy#@H?r|^yDh9!yI-eP-DSy=?Lbvmvg(nPk0S_Rut8_CZ6lR7tV5!ry|>A z+Jd#pFQAXr)^*ZP0uk*yZRLir99{rcS{whN(UM4MiL}$16A8dLu@uQ4JO?hTqy`?P zUhL90DstM_ASCc1GVA2RZt$^4#@yIg6?#}6=x(>J)e)ChnW^~nqa92xwg}hpiur}+ zcio(`+5!!jYW1Xj$tZCTV|seCIXBt3zWR-WL@L(S=X3h2>Pl~}ugbvgnTvG$Oy;`B KnuvE8#{U2#nKrfn literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/production/charlie/keyshare-held-by-dave.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..4bf9c77318385e076c264f2d5687065eb3dcf16d GIT binary patch literal 3472 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 ME%rbk*@ENvA92AgQvd(} literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/dave-keyshare-0.keyshare b/crates/testing-utils/keyshares/production/dave-keyshare-0.keyshare deleted file mode 100644 index 9158d42d7b42bebb252e88a8631eb03e5c4303d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 O*a|3J`ZhLMkoiCNy(upM diff --git a/crates/testing-utils/keyshares/production/dave-keyshare-1.keyshare b/crates/testing-utils/keyshares/production/dave-keyshare-1.keyshare deleted file mode 100644 index 695bf5969da2d2815d1fe4855bf31967517acaec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 Rm|I~hq;h3xa3nkB{{RUxCtv^o diff --git a/crates/testing-utils/keyshares/production/dave-keyshare-2.keyshare b/crates/testing-utils/keyshares/production/dave-keyshare-2.keyshare deleted file mode 100644 index 702cc0def9590796c033e5a14ef7de6ab3f610e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 JtuW*2e*nqs6RQ9K diff --git a/crates/testing-utils/keyshares/production/dave-keyshare-held-by-bob.keyshare b/crates/testing-utils/keyshares/production/dave-keyshare-held-by-bob.keyshare deleted file mode 100644 index 2176adf506710028b355e9d88ecf3b25b80f0559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 zcmbW3i8~XHAICLot`s>JYUaMLjL9_{n=R%V8r|7{f-M?}spV`o4S5 zQj{bIr=~6v>x@GA!Tc`TU`RMWIMSAW6>Apa8x%%>BkYN2J-7uHWrf3f`p~sJE;>>m z9REAVH2=2czYzidB_fbWEY;Q#7J|7-BH$LA>p=2 zGkYH^%)b#i|6W@f01jR{`Qm4*3Ybsyu0NSuR7)cBor7xMuJrPDnAaT||6hAcbE05k zQ!B*K9tc)+KL5Mk-oxAXicz9c4^2!8C^hw6R(~xn4d7c0zM)=#leFxw?Z0I<-ZaP5 zn3~{kwWZqFxadgwzWVEySF2k!WvzknB9n$CpCdZfN&;XOx!fVj?D@2$6YZo!^FWN3 zX*9AEf)?zhyq*(@X$YKQ-X)j%g6Xnmy5<_H1|XsUy`1D6;g+HhaKfE05Mf`Cx-(UT zKe&b;YlSN;+t6Yz8`OCb**Ph@#VoqccZd^NYI}7~@913R-0z=>JbxsV`e(Chte`)@ zgW?-&891Bzrbt0ndt8W|47b}x+#Do{Nd4ggCd*lE#_f+kk6BA12YP}1c!ia3H@lA< zLk~14L<_W(Zj9cpPUS)*%kOo?_At9GX2+fCzvpMBIf>s|v*Tdi=QIz_xn}{wJ8+az zqmPk2Wy%?pKadio-h5C(o*C~=R(XH6k8*ar>X~wA{PH8t0V?BpQp*2vOPqi#T`(R% zEFL0uN7!=lPt0oe>xw4t@2uGuakwHS40cS7hxmY&;T=z#hZ+^RAoZ4)N+h1;t>$L4 zill~e?hOOFggT=e^r7&k7Hhwy8T=S=&;b7xc~Yf;f7MYIGdvJ*_x>at(4p%6Jb?pI zsab22XB00)Cgb^X zjhghzOh}327=(!y%S+m=0r35U=GMv5vhROPSMMzn@cnIv`ZX4t(<|X&bz0@pjeesp zYF5aE9x=8PUC@QN;vg)wcra?e*&R`ImUzQ*B|4`#z-Y9J(Fytf$%GkOj{5cRU(qEQ*`NIYE!8&3ayjGglu2~Rz zqEE0|1Qti+4tgBeX0xvR6H`rhQ3q6*8_pLdJ~*0m4vZJ{u=#dTP#kOVY${UHh(TZo zX1{hzxFaOtgA)*M;|*lA<|KZPsXiXOU89^~>GtH<$-_6LT`9k*m zM`oQ_{`Gsq@!Cz3j2KCMd3DJN%z4B{Xy2n6(FbEUzID06kP$RH)$jksQ>QrSDL4%cZvw^vHRI@BE)vuobe zN5KL&htFzWs{5W`m>Ls=bBUTBd}deTAIw7?psO!5y4y|Lg0xzVi{JPHngRLSqS_5Y zg2C#ZiDEZM*4sIIz|>Ly2=NWxJCO693r6f!%P-JEGnOT`ZzROGBu2Z(_*_!SpusN` zgl_V|hy@2nXuAi>est~z z-Z>INbQ?x0JtBYhS0!$}VR`1odONvxu3dQ%9C0gPOE{#r@$CA3rz>F>T%J*6;M#aZ z7}Jj{R(+YL5e+RV)oVIAL1J@b*i%fu?tY?a=4)hkjgkW_f@d2) zpB!cB1M0NZ%?dc&os+%cH7aQ2Q5~nPFQ_HDzay?co~+Z+kF*}xoPzD?6ywGc4otfF zIMFKL;Dz%-;CbQRn+~2hCSQ_MF#-nTS}}geOFGg8aIwR`Xt6&`e+3KI+rpd8&b#)^ zh;AaUxjifVvA~cGU2W`hp;g4Dy_?s`=~H8}Rjprf3saOwQ)lL)ZeE~mj&7X{7eh$B z+m2LG9uA!<+|6@azJE=vFf~+3GT)cn<0;wVSY^LGm?1u7ghA?=<_`{Cr9aQ*yHnN9dSVh@f|3gZV|RjnYKDzyI$GA=Odfx9=fUi3=Y71jI`AI9 z$xe=la5lAMvb}m73bqb3&iwg$$N%${`mcG5rP)#%mGU9_%{5ywxrWq}p`am^G_yU7ZdHAm**3VXq&}HoNep!&h>UaSxgQ z520Xbxl^?rc;>FHk?)Oo-lvj2+HmO3;yrp){h)zEMrT{PiL=OkMtNTG#8K({ndP^) zUL{{+rj-%Ds<7ArE$ga=t4pbcW-@?e%o;R~If*tM54>1auRD9J!)n;hpcZAdTQSv< z8{(GT9{9Y9c2n0*!>bAk2dh2x)e$~NcvEVTx0T2RJo1|<)QV7aIk2)sE9?r}Q=lN6?J9$(lgbOG*%PO2!US5Ju8!<1ddYU=sqxIU! z-HhgsY%#v*qy45xtPKA?Ew5PhR~CqWO#UFr)*~4R$&ESFIKd}-Y`{ZQxJ^7ZD+t$> z|2pFHi0VfE0>?X}iso>%`29XnsnM5ptFafD_!*qQSW}G722b3F8tOpBFX^Y6qabb%)`$Rwi+O^22rVnMk_)^IKC8SAwjQwM?NV` z7;YqwzLpC3c&L*;Y~64kmA2vPIh<{9 diff --git a/crates/testing-utils/keyshares/production/dave-keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/production/dave-keyshare-held-by-dave.keyshare deleted file mode 100644 index 24c31777057e8dec19c7e92a1475635e1fdcc1ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 zcmbW3i8~XHAIF*HY?UzNh*3G`9&j~F zAt6VI2+i;J7yQ0Y-_IZLdY;$wen0Q$Bd>zQSffy0Fs~b?Xe+E29El6_#pnil`Um0R z2y>!=DqJ6fGQwh<-NO`|ZV*TSk%smH#Gm6?4ZW5$P4g`c9HJLIDlwTkvtl4 zmP!6^nIa7T{}|;}P%1_tFiU645G#^`IT~(^cO?+eWD?vQV~)nau^u-mcqLSz9!`Pc z0dvJW{}U1LKOzE&#JJ%Iut2o06&_2nFwpZLySV6wx+=hoF+?}7aJ03O84`{|>YBS7 zq5p}<^!M7L0RDjGbG1L4rTIC)554VJ!3qK?qZTrK2cj!`K`uFD&|iCtGNE9+Q>#SE z2N4W-A$v>p@acm`1t_r4QyraLQe{o2(O-*;0yvfeGN8FwLBoNnf&01>Z|8gDrY1qn zI5$&M8zn){hQH4HnaJ+(%JACvK*n0bt<%)OwOjwuZjuznxpcb0Jx0sk@0kAJNm{y@ z`9(KA;odC)z24~9?|}AYU-;ADF3^*Rr2EZ3k2wx}MnD`XWnSE-JQBF*B(VIn`fQ|J zV&|qvag+1ms-MYOR!@5si_$S)_m zcLr=0e>M#y79(ArT|pBjEO+a0slMP{v=_i|y)5$_X7o8B{2;c6gbW^b-O82A5vYrN zXUX?0e~AtFM+Dj^_Y0@B<+8y39{92*`?4YJNR6R=p}?!G^~|*C ze4*j=M^r#3S4YGfH3p2Y#D1;IzbqG!J%7{WcXv|hcxt@6T^%v-rTdL*z!0-g(V@E?J>9QY zDrH4iX9Eif<03rm-z|uBovKWZ-w^p|KOx?k z=ng8p^r|Bw@XTk|h{`YhdGn3}9kaIe1e@V%8$4MhFI&E7e1r__uq5^R~@m}v*leeo83 zR)dvk#`%gyvcfc{Qpctfmw7(+PZFzY(xum~$p8~wkK;_Q10|V%#)ozESJO!}e#ME7WAAB2CG95`mTm&ZPoV26xqdbE9X{&-1DqjYu~Bgz=9XrxzwMC3YqH& z>%vZU#ZHOoOzcfSe*BfJyY-@47ltjbFemTYbARhackBheR(8Mc=JdF&$ci%odzDhjh7K*ea2(q%xpzaDJJa#SIaJ)#1dDk^vl-jtiS$3BsE zTyzoGP2HVS%Y9tD`a`T#p3oP!&-6W z&pp+;*|#52V-(-gx+4YEu0jPT(aMNzN?*gUvt7MN&`z*n=fm#ECAYCK>nJ^^6_dry z%eR32Uv_|`RVt|+`S)82uu^k#2`EmIPW^29(Q5Vk2*?uhyY1T}l!liI3cA}aW=97) zFZ2Px*Ez1a+@r%QhonWRS)#LZ&q(%u;;T&eByVG#*qQGKjUuWYFa zhxzSLh2`z5w_-JuBK@&8;WI<8%nH2&*xUxgpo{g6W-~Zug=X!77EeGUAbSt2_=bx! z0O}man_*?VmwpIL8uJd}+h)%ZQFdO`qOTi%gXHN>8)EuK0zC^O6+dWSjxQWi|Ai6> z)0xwn<{!*CF;imKTy7kEUe*kmd`nL2ku^C}#GJ^!m*$`iN?Yn3Njykabo3MdY~2OS zIpsohX@*KZv-|2TL)>kdcFu}&wY2Tn@Td(4x$m>f9oSnhym{1Ni$CChk({q?TYril zSBox?smpwumF_Q>sDfwXj~{6zY8sL%Hk8u+dFRJ5=X<=m28h>F-XXgxB`shfYQec(s*!Z3U;VefE|xL*6HG4 zGLYsESXAcXU*PV&XW@+P;fS{^K)_%utJ+W5txi<{EcD=S3iP>|HGb|I9K2Ci+4jRM zcn5jQ;Z@#`#cpxRdVQY_xg_e&=z>yupKK3Z#<+o%n)DPlLQOwtFs^7a=sd z7b-19rA*}=WI3!nz9pNNM3EHC_O$!pEZ9USH{Tmd<{Q>RBUN=X!z91_Xs;}dB|(Ii zn-X*3IF3hUWI3y^3!MfQn({F*R_IIO2e)6aZJ0%U2xz9KehPkYuR&HwRbK*m_yV5h z4UlTXjC6twz1eO)oT{)^$M7@2?&;YgtQ0X+mGXuOJrzu;QmTn@n{8~rq*DnUqkYZ zXB9LKa`a5FsRt>LlZ4{-yY`gf8GFyAchx0w5gZ$?_5b3R;Ju0xu8(OcpH4nja``mm zxMcVEwZCVC3F`qf(<#3yWz$);RR30qv$fUu97|=%A!RG*yj(f@3X+pC<8=GtgKH_` z*Pu}D+VXgvJ2vM^Ik|S<+}yor`Tb$~htCN_)^u{*MjcMQABZ_K`$>c@0q+=$??gQ- zovhQ3>J%`gL$=<#?c0tW_O|4`LL-kcy#)We%v4Drx}Tug>qW+;<<(iN+4*aKumk0I z!mXY=#l$t~X}V9-ri|wLa#EhI7$56N+4TzcKE_@$H|E#sQV|7I^&#i`{>Q=iTDPSTzLY_x%&eGP6L@8b zq2m^xM2xS!$)HUy0@uMr8UA&umHSWH|<}ekOKu4$- zjc)sFK$amBPgAFHVHkMqg4xc%RoCL%sW1d@2tD-DIlQPoG*dDtU$Qt>PdkzM1+8*r z64kJLp#x#AwRv(k#t3Kv@5u^g`%)Z5J1yqI`s4~v=gmm1EJJ3rdTz=%>sn_UsJ7X4 zbvJ&d^KwL-9=#34h=GpCSp_n`Qkg;HSC8XyP6%(ck$0zYs$g6)STP5!SDO@d;bBi=lyz~&+~cS%If-1Jv{?Aa|?(+l4OlFbj2WG1TSZ2c#w+< z#KgeLjTnNo0i*OZ&GmHA?#4)#3k5R`8P5FNyyMz(mOGVHkFX}gm=XkCtU~n4cug*E z4y&@dzPfQB#1d~AXzi+kMrxX1T`Vk+Uap#G12ob=(~#gq#)9?zVdg4i0>lN2zrggr z!~9?3-?jWVB8##*90m6^3U;QbyIs>Xcd;UoVFY!5WRRB?$~YLKr$V&G__)Drd=TbP zBw7^>`!^!%-)l>=Xtam4R>~ThEMNZ0yK)IQ;eMFt<{FkfXoiUHO4$L3|FyR?i|@T! zQu~6CS_xG*g$Ef-1^;zRFm-G_UH)tNZda3o<=3gEYiv$k)PDv>5eY#HL(v;nA5uSP z0_9%aZYyPaOj>^i78|xQxpQvidxYP~XfQFuUpM90V0pnN!GRslZbrF!B<@>WRGFvt zU7P2^agNeIP#z73$+Ou&NL101@tMV)@{^pa(=#s(;{!@?B=*X4$1*oiihqEgQ<@iw zsQH%P1%;ExrW6GVIHi2*>6$*X=NHQs=G>Lw$;EzqF`r{2`bzdEwNt^}tMjac*-JN1 z65}=<^Im)IJ%++{!rxmtHOq0W#!M!@=>0alyqVNP5(0Va8WCN5Ihh=0QuwQd*RGK}sjKZpe*K=L{Sv!rfo+*FlnOfP6yU&BD zC1&T<7fCNtFpU~3oa8A9{9V7qMZW6=35L0cp0>qqDHzpLj0y`Iw!v-tpGc5l7?llA z_YjkaV=pp8HOs7FI=F60TSPJhOWA;%m-N;;$0~KB@2F>AK5bh%K4&kPOLBfglowFU zc)Ki7lPa$Ck}o8gE}2kzpc@?P6q)|48d)dBjslRJyY^HO=mXG0qHNaL9=EpYwwvDf zsIvlPl>p~|qD9m?<#cV2Jo~9sT-X|K>5Vkr>=QnLs^@qO-fMCBRu@aOnrsEUqffBa zQ(Z5F-QzE&N*49cGH-x+{1+G{WJIoHd(F_Eam;j;U8DuLX7?GMzQ8f?FW>ZdrWKH|?VkBzrs zi1?CaYyVvSkeJ}{_Oj;yltrP{PnIu5>}`AoF5}4qaWTQ`Ak18Mc+&2zAB&?rQUSF_ zrmIbPRZ0W}Q#*rJ@uN5)G;q0_)9*Oo)lo|^Fx|Rg5Ai+5DS-_s2>2t_JJ@leiwF?` zr9RNH;bKKb*#r-P2v4j3`b$Z(I+Ra77ju*&XAxiPSaw~7-&s_yV)gAz)!%Lr{nfZk zI1nZ8+T^pshys}|n{=Z6`IoYBR5YlSLpd+JHC>XS1Z{hQDRYPvW33R40oNfc@7BC7 z+&4oN#(LiHozB8sD#`&U@+q}cb3i=Y8*(Z1%ECyy$v{} z1oP>&+-pj~nLn~W`vyr*@EbyGC)mN-4}-nz!qYhoqX|cc^pgN8!s(dv1l7O!T+LE= z*z6~DwuQyKn}#X`w2y48XvDbBLw!CZJS|4CALUGx(>wU)MnD&AfCAu~JGn}+@%y#2 z9Um%vObSQ5`(6%^CNe@2Ief5la3j;xv{1q=y1=U~{%tgf*V^S_dFZGu>v%C_cE#c_ zCcNGjI58=0`Tl6yD9+@=_Zg|t?!_NSQ`Hn%+q{q7^75iziI@k$rG<|Qt)I-!7O`Bk zknC5_^`R}?2tqoFzp2A+))kcLcQ8FUycFeYlc&!;=8-byfa2(@dcdUh+1yM&YuhKy zatgxKmv8?AhsEKDEAJBGra!xQqECwqrD7J2(xiNCJtizRBF-o2YNI8(|DZYE8Z`szt#!Csi{% zok|r2``qo0wneuW!Ji#?jO+Ut9VfGaKO~%E9Kk^Y)2I{1fk0bn)W}blNhNH5!&KXk zu(-~5k#we&DOnj<+i=?-;QQak>q#YDz8Ugk$<1ho`&w(W;O&pSG3U7Dr5Jm5Gnr@y zT?N1mPp&)=h3d#W>DomkkdNxOSLq?pon!%_w=tBZL|8*Tw)MTLBTYDg5Rxt?>SJUv z1LwKqw_8Ss6EqCL)T%XYy2ANt0*unW40q;Gh~MYUkD+;@|imGlUMyPs22wj zVR{?8XN)S&d?}`2%7%6E9wn!a6(cjWE=#$#-EP46Z;bx^mSDNwlVa3(wH&wC=io)8 z28yl1k0b4-i35Ebf>T$H`3u{QA*AQmPuu5fOSBk7?RL~weyMSL9s~PI$GMWdBkEBN2{`2%tS%e8RN5)2c+@kFv-W^+()pc z8ETHB1F8&^!+yX-C)iS$x1Xw5EV=D}!^&)Qklh8a{DMSZ44IT1^Hn%!g0b?%wX-;DjuWR1hims@K0 zXbL!N0+V~_3r?xb>Aw*J7dxILzak3VD@#UayibA|pW0p?Zsh9fwZI5M&<5E);&JU# zXOUXSa@!_Q=XJA&?XLaA{FNK9_o6xsr_2bu5!)e0Vo{*Uf;E`m(MU~4{(na z@%)fx4hULLBIzm|x5{9P&%69q8BSEIiJS{)${x&JQc;Rxg~Jkx*c_zCI5-5B%*-D= z&a{vs^M`cLh~SGdF-^>uP!#JkPZ#G7{N*LrbO6gk7{-3lw7ffXW~i$rq}lH>JA50Z z-n;vgW8>L3X}N8lv@5UpvU2m*w|I)}h92mrKFeI%;b%9RCtVFtzQG2*Zb7Dj1J*0W z^f?|z?jt>IznBvm%6-SQC$zH6O(3JOIW4$#B})&AfgD@M4V9Lmv+_zo+m4nDcS&hY zuIc4vYq&uRxH`ND5Z$9vPVYO$tYxG zWv1^LnRmkP_ZR%WPruI}@Oqxt^L{_?=cA&buVE4dw!~WoS-YyD5L%`f7c3Ux<*J1; zL?H~dj0jF73`jo!W}!+VfL$&<7sVKfX1(I|jao13A{tubASBKuDXEVgVRZUx z?gXpK-!d;T{qJM`FHsi?HFUGUf&&mf))*sKG#p0oa&|Tdc2NbJ8d|v#LlHJ0Bvi`+ zs)uqnLHrw$MMc8^Y2arZ;!M_XyQXE~V&y}E5i|l2!CqEKlMpmim1vFjb%WXX!YyH9Te593In~x(yKhYi~&wzXx?b zT?;mAYOyzA3w#+5jwuRFZADp}+igfhE91T5UyDn!_C%si949PNzuvqD)7Vnlz@|Lns0KhYm!%@yATszi0t`*8v4U1awy{nF&!X8Gecb|rkvlH^o72&S8D@X3_K!DGE_|phxS%+`;v+LY z(1h)1ej$@0%epJ@;7B~|B8G~4|0B2A?Lp8@PtpE+yWn>&3rnEq5>r)<*4Ar2{Uwoo z2V3?ZAkG5Z>-LA2vVC$ghvM@44#T6)=&XL|crb9(8El$!L;3t+j}&Ws<^R(qGH|R6 z6A=&R83q1)ZFP$tPFn%UHFzhmlou@SC3i}3C~}QOIROo|_vf<5`oZ!CI$v-^GeWS{PfJukkQ)h1&&Hyd?y=4eLj97FJ-Ft z9VsxulnIh`1(GIU+c>R3czT>HUz^rWGn9y2^`OWjh@YNu$GSR1zCE&E*r&?r2Q4NvtD z5sPOpF-Nvt{)z5Bds`A4MdL4HliQGi{_GjA(u=vP@ksWxZP~=Uz4&7v=XXQ}KBdft zWwF{cQRUY>p(#}H#4@^GNSsqt#)}$6y#zZF;N#r8rv^vSfjLC!?DL=8I%_&_c|XXT z<14QMINyvBQty%1vpw`2%*(@t|2$WA)BFY%h^uEiHxNj-us>R z1EpysZ07oJgNsk(IM6`~MmlzP9CaZ<7n$jx64DQ`@Po9CYR8A%KLs(j`Q#Bt%A@aA$#MC2rE54f*^Y+kr#hp-+R}Jnis#LT3^`z-XTIzA5t?BGx-i0H@=rzz`p7NN@>qC{9Lg=0bWaLfC(Z;SWM zk;QQyIvrjumR&y~aoU=2EE~sbE3JboE|oEFz~1*`=I^c`Tkr0FqQ%l?^2t05f5yl# zGT`Z+`Bpo6Qs8PK4T9e9!uzeke`o{z@PsPx4LXe(r?tIw#z>Pcp&s(J*z6AAlrqe> z-*T@t6=#uafBqeUn&|%pzLjVP>tcj>*+pb<8pRL}8Pt=&Jh;;_=LvFfnD@ZzA)m?2&?F9D%)EiI*=b4`;Wm};%_i>_3V6=iC8r|nn=R`^DR^!L%ZQC= zw3VBjlC*3-oH33!{qWDM#J9f1-v~3cRB79SkKPIj!rzJL^pLXR++ypZxw#S+DXjRQ z#$#W~!i`{rqv*SO%trmwa{X?mB8JR8Kbr!5u5pjlaR(&FKy^A3oSyB>KlSx*}!)^~*Lp?wAS6^?gv zzbMA$Q<}&Ff{m}hy8P@!FeSC%8A>b^FyxBa@^DwtW-r@Jm85zHz^fPe-dHu9~p|)7N;l1te%{keNBbQGl$oKdp==yYYwu|%VI3E_$ElJp$qdG&!{tg zd`6z+)muEaqysNqapmO|+{<01EPjk`(M?dBY7uYy)1dRf{Ku`hKTOs*yh4Sg_9rbq zhYh)uPt*mcH0F#y@FA)0qLep8fd}O&sLbYMn8~TF<&l=Nz5Q4;KNw~B$X7JJOM=vN zI!GEdN)_NvTlpl$%X&^=JHa5}vd%|#2Dp2t`0;Gpr6ti_8-u;<1EA~63#E%H3wdrY zGCi|ER{=t5-q*YfDZR>g7MEnHa!FPO0T_69|<3DRVHuegc7VLrUaYCLS z9$El`*OGno6puSDV@fZ&{81fAQm>7g4{Uuj{CG)K`5vnQEU|>mL2{gfgKx>)BK=7g zR)WME+BYkNFUdl;GRq*z)@PnA&eH=F#DD4lmcO8B`z139?z*#IdfP+W{AJk$Gv5@+MG`Z~rH(%X9uAQp&Ux=#dk=v};FUY37Z%mG40uzTLF z8>!WWzE3Gvnm?*Hne;j9O#WI>2N0K%CjvH$=8 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/dave/keyshare-held-by-charlie.keyshare b/crates/testing-utils/keyshares/production/dave/keyshare-held-by-charlie.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..e56bd6bdd3de4dfaf85daa304e592d30977012b5 GIT binary patch literal 3472 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 J#;w?!{{a~}AYuRj literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/production/eve-keyshare-0.keyshare b/crates/testing-utils/keyshares/production/eve-keyshare-0.keyshare deleted file mode 100644 index a79f3962a7fcdc85ffd2e7949ffab0fa74ad5717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 Qq1h&f=I)*hqp!e!01YoEK>z>% diff --git a/crates/testing-utils/keyshares/production/eve-keyshare-1.keyshare b/crates/testing-utils/keyshares/production/eve-keyshare-1.keyshare deleted file mode 100644 index 6f79608fcf89ed702983df0eb3b350f94a341ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 L-#?I|L-YOz;L;rg diff --git a/crates/testing-utils/keyshares/production/eve-keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/production/eve-keyshare-held-by-alice.keyshare deleted file mode 100644 index c9ff36c6e0411be8637727acca773c87d43396f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 HTD<-PR~0r5 diff --git a/crates/testing-utils/keyshares/production/eve-keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/production/eve-keyshare-held-by-dave.keyshare deleted file mode 100644 index 8f8d8a98e913cead294b0d666b89c55107fbfda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3472 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 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/alice/keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/test/alice/keyshare-held-by-dave.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..41689821365f495e29bff929383daa86773df813 GIT binary patch literal 2192 zcmbW1dpr|r7{}S7&KjE?*HkVY*Qnt$8gktjvzTqJoyv7sGA!CBv$G=PmZRLN>EyUX zjK&$$g^;C=XdID{lw6ky$)R)poj>%^```DE_jx|w-}Al?9O3BdheA=zDQ+GZUn~Xb zh^I%nI>bgqpCuvf2|msiNGDem4(l2iMmGs?^9luMuB+*NaY?cYtii$1B5HnT+~+4# zFc&i7rC;3fiOPpvK=^iRYD#T=q~Qn@0vB)Y9q1kJ8)`zpAditkyu2`xp-6%&0pp6q zh6m9|W~f*+-h>uz9zqKIUPS;L;pFKQ?M4rdLy#?y_z<5c8af;ii#ZqRn*%e%s<&08A30t-h^m>J%BI z&Y#9f8RDz$>Kxew&%?Ql`?C06A;&tC{v?rvir5#$B)1t>7?qnmU@*L z7<%2So9YJCvpI~u{92q!5SgGX`95q%p{haV!h)+VH}x|+5(gQOwU&7EmH|-C#K?3e zRDTVbjv_?`w8eU29u!wFw?e)GHPw7_vSb<8k4{jU;|U&X8?J zn*0yU5*S^*#x}G`BSiSgF$*~U)@Hd;(yb(M_3%6Jd#GKv)=%IdX8{NE+0bi^$EZ3T^w4{ZX+vPv^$!;+@;bx7+W9=!xCZR4n}>TF%g{ZMS|w|J)SeN zUd8(<3JzYfS@8Im!IGPlIe}}B4lQpmu(kAId1OgTYD&_ciS(F%P^p#=df(ngk_7$? zUw1m?mUdf?k$#D9@8tYZ>VZ}7Pg#-UE7bZ{)YG9tnT?eRKiB)crUy0RJ6I4wC2{RE zZZ$$%#)-?nTzB3yp@|!A1u`b43qw#}{ylutE)%`uxs@1{QqFuvfd!E*`4+lpR;$Y9xYHy@xDe zcAONfrRu26?7Bd`Sb9`+QIJX8Mf+rDrXYph(*FnklEw=5+uC9oPW|0Z{V3k^n#=hl zEdS<>042O-d3YQv{!R1z8J*!JVSh;60g!q1U=StFD6D(YncNcEbx4dM2VLN4Jra*T z-+M!4E|S<)A{rrrhKt$`FOAEuPo+&HDs}R)Hyz>dXD8AD_n?jNR;p(|D$mM$)j$l4Kkm8>TZuJC{_iihUMJ;29RDtTbzqKp~a zVDM_a^p4%$J?QRM&H#gKCR*N^U)Tsgom}!#_jVRSZAQ`Wg^^{_YqfK<)XXi?Tv9mJ(KMJmxV%; zdj=TRZb0Qf%p>sgGCGEkkrCDIV0C6U^a%QvRr;iw0^ICKev2R=*du$MF&S$jQD6|GoM|FVWu9|a{8pVi&kk&D|DQa<5TW4o0Md4RDIRml;I}qS7zkS$4?;n#kICd zFJ(Nc_IQ~;uW4$0V=~`S1U$bNgf0I3)a2hG$n@%=KvE!A+|2F-T#gtmhL7-!D5}l2 qUzm0Z+~l!^v?FP`gUTHn{x*6YhQsVJ=q+Qfd#AzxBJWKdCGkHKJ{;o! literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/bob/keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/test/bob/keyshare-held-by-alice.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..c4741402ac623e61ceea3d8dce5dd191737d2ac2 GIT binary patch literal 2192 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 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/bob/keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/test/bob/keyshare-held-by-dave.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..fbd5288bd15c5c056037ad5e41a2544a6c972264 GIT binary patch literal 2192 zcmbVMYdq5n7-m{-xsH_7FD%b6G-@Hsyp-#6igAaB5P-FPGd- zl-pUEG0L@Ea>*r^qZEadozME9pYwiuKD^KSd*0`HUp*rL>uPOHGp6AjF%&zRDS&4N zW3A|cp_fRemP9fdVQPc5wztE2`7`xBan4kbDpMEIzJDqLdw=SXDM6l_*C`~$RnEw* zj?Ng+m$A;mnZ|s02`_UpW zu5bciiU+KS{`Qz(F@p4rYzQ`?IHpgyksrbo?@JC2Lj@SoF^nKG!Jg>^=+h`pA$};= z5H#KrLo^_we#I!VbJhCXZ8$JO`JbC0^&T@;D$q3B3{^jRBiABVjGCI~kX2-&zph5BWm>GPyEGAEVj+O6^ zUDF-B8woVNOY`Bxu`dHIJNBDfA-Z{r2SqqW$(Dd|iwtMSr zRzj0uam971%vt8bPN}F`JM)rlV-pP%Qi0KnzOVc!DOu4zId7fRv z|MBv|NgbFZ=D6U63gA%T47YF>ff#u0g4fkI1C^;W+I5dd|Jh}ZxSk-cWB&Op^zfbL zn^QPBUJxJ}9pt+_9|c^+d`=dJ?|W0-yy&1g&$C4&v(%7BACwd7bRAm?J=q)l6mz@H z0kz1q=E?OcTUpm4?uZCe{)#YDA^g#f3{2YNmmUIm@F z`fiF%p~5I@?QwE0&<_(dCn?R)^U;>a`@Mby3U8gb6*Xk7rtBe$zTQ|oyLQ_oCQs6! zU)38d`!&p~0AEg+jR!m)hDyL4-ygMGbm8rR%3q9|UmBAZQ=VsyIY`ubT(hd0OdVW6 z!$r*SO|OErHDJ$W-B{*{4Ll2Dw|pIB#lFA4Z##eIw2H8Oj_KRFUBh zW4m?0>g$_8BsFVh*gYX6tEJ-hxNTVigU9%~hxT-B88duZiUb|$@WK}H?jBaUe}wKZ zYReku;pRYgW+k;NU8^zD1$MpQUVmwqk-xfG*Qxu4!APZZ?D&&{buL=IuZbt-)>lc7 zDAcL9AsM@GYw7FL18;W^73$sDb@RoOH#e5hoDmc0b6N{e`RJac;No)!kl#8!36m2{ z=={0dKf0tBy+1xEjj2g2yQJ1sfNd&;{^;p}U$QvBzr}?LKE@`ss^! z_#d7)!8Y1OYgOMD*v>^t+1_yA-6JFR65j11SzawAsgqyzqml6HLELI!sBNn6sRNa!VZI%!Eld{v|9Et`;tjLvrh>srIm`Z?ci`3 na6?i8EUEKYJo1#x#q#Lcs_^KckZfdfF6r{CgPaM$wvqY|y!08- literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/charlie/keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/test/charlie/keyshare-held-by-alice.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..d7d2ebd1f8853fda06a9c3f9473f9ce4acc79936 GIT binary patch literal 2192 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 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/charlie/keyshare-held-by-dave.keyshare b/crates/testing-utils/keyshares/test/charlie/keyshare-held-by-dave.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..04df936feb244e4812cc94a5cc7343e445a3d165 GIT binary patch literal 2192 zcmbW1Yd8}M7{@c0qTy*njA~R8$=1+_m~A$bOdA`OI@4H%tJ)HyCc&A?GoZo zunRmB5aeosB2jVsE$j&xCr1K}5d#0?kefFE+U&ql0{v6tD-ZI#>OsB8(z&vCSZk@O z;Tr^@jG2LbkcF+)6S{8ol7X3F%$(Tf6dHx??hPm5Ee^ZV-Q4hg-WDVR2~V(aJnhAD zMPLH4E^yXqbGj?-SB`-H9Z_gB!N(yJ6Gh#Gf=ubEp{ z7V)|y>^88+l9mqoQUbe}CA)rspKq5vL*AJ9{cGZ$gf)Zf$_houk>^4ps^Ohotxqzy zO+A>$?FvXrmpDfs7&18yS@XQdgZfZ))sJ$;v`FRMT#RM%i#q?nB7#Q&W%gi{+59H%4<`w-cywQ@f$@7w$hSflS*{*2L`;rxTjaBit@dEU z>ED?p6`{H?Xs@2*V)qpGg1!^gLJdz7U;dk1M5`7WQV^5fiWLKnjZR%3e@2d&msyFqQl+aeJGZ7k-w(<#l5nJDZRfp+ z0};3>-K>_BpbbTzO$tX!4;Kh>(-1>QF7=p|LbG=E%yBjM@Rv1)tC zez6Wio#$ON9`yq|wciq8CzHgbJ1HvdFsQv$cO8VCy%_KG zUL;f!#doWi!uvyymuKqt;BeY~jM9FDT<=)hME{TR+Q1(h$a+%JGM3s2lAB@E0l zbRHxwQ%2{I4g#L$=X#Wuac8^EOjz9$v=UTAKe#I#{yMA(rxD#r;Ll2yq7n;aVi%&j zaGnZnqpKqI&QR%Zfyk+1oh9r%qPs~RKn)Ce&MnrEU2j50bI<~4J4@e?>d z0M}zTzQyQPf@;4vBo2+L=YA45cU9jI7(69j)2K-xx1`^-8*}JzTy9onm_>0rYF5qv zjbCOGwh+|o&|rBkHuapf+-ttdpK`EEA9)jy%@w(vqz7?@%fhE_+hc+s4pU;)9Lh)xQwZ1JHw`dEK5pwvRI@ zaQ28nb|Y4+H&Io7v{6CMfv+rKJ7h_{ee+X_g&jGTR1=ocDLrdUrd0ihyOLD{NPOj} z-`RtIg0%-)v-z)1ioX@C6R)Rdd0=%SiZ`vA@9US`em^wPfWsm%_QuP|Fsn$7l_RDE zG6^2Aix2VQ2JGo{eh&mJwA+qvv2pPFkzYhG7|Sy%fLZ%1iU(%Ty4_ZT7TdE!TO=Xj f#3LN|)3l-dCyiOoR%I!Z5z3IP*&jdsg_ZI@l93i` literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/dave-keyshare-0.keyshare b/crates/testing-utils/keyshares/test/dave-keyshare-0.keyshare deleted file mode 100644 index 852a008e5253356815c648f98144981a2ec92a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbVMYd8~n93B&j6dm_2B&SGa*jRE7W~^b@%`GOox!-TgTCqwBMaLy_X(4tPqSk3B zmpI5RxwVRkqr@JP%RJT2`MN&naem+455M>Qz5n-p{>ETC8yE~pb;CoV5#gRVM+(*f z9vDg@*(Z=e5ERmb8hj4nWr~JD-C(wu0B3}>&g;hVxgb|1MwWtn+j)3s6PHhh&=u(^ zEz7S4T|8J&pfT7E>>Lkq_jix?q<}C8C<;f$;}M}0C$TwuY((z3U-NAq^b&Sf6mCuQwsjX=4Sfg}+?( z7=E8l0r8|%xn&mp*L)djlKoh2%z$LJ@65PV*`uHA?lU@J@nv$&Rq1%-ejM?)ufvTw z@isOsqV0*YdQt}rip*K9>XQ39{aSX_yPD8u=qT9D=f2*HTJ0$2;o=Kt`vE@t(DqSi|e7M2&ol_yap--7T#CqOC z0dRl$h_G;Otp~K~Z!6d8bmd4?st?Wl2F2XR7OD8stKV3vdm!`qiJ+QGm=$_Vt7FRfy4TrTl_eN!hu(v(vmhM(Gxptk+pu`?K4;KtGEB|sdNqf z;0@!(J!o}+>-aRxk8!&;;HwLbFH$^8>r&fV5zS0wU1^JyI$@liul!|peRt3-6Dvpv zV#;;+%kaA@h(}L)vupXw(8EpP-sq#R(ET%#fhBLjek9R zvj6F7`#28#y?rCUc-7@%@T8i8(Rei_;FHu3k`i#sE!CC2k)V`?*T<|_DwfBA$E$mYX)vUldo{wh_~^46pw z64zuO$X`5WJ>fOXSQ)#Xl+;}+(h=PrsW)@D8F>eLqIW2CIs1`GRxzzR)wNCkdx6^?7p?TVx8-KeRiPo-(ykM8_>qt8ipnpiA}GP4! z_R+Uy{2x(xOA=4`BY0y@(c~ooX8sv^GC5ZjQ9dlokNG-xabJ6$sbfh>x@Ug!z;O#+ zt*;SBb+MyYL=Z5w9Qh=%wScYOgAr=P9c&#kITzLeSeM}rQJ=GfvAG4fd%1&7)6ltj zfL~cIvqSwSk#6x5*Od;dF&2D#p<=2ihl}5{@t{F1?4W7bn&r0e1F<|`FO;nSV7(Ci zJ98cF-fK|<%a1i#02TWeCcKY}(_pov6(nEK;sosaoY=-uE#5xkfgimb0cDEq2^tEo z8RpH3S_`ORnbXs1`*Mb9$pF1a3ENLmtWa1TO3D#LGb1Gc{SZ`zZs!-m9$T zFquKs?$IQxiawqpuxC<-MVR&KwCbZ7drs@IRmSZc%I-O>9NJWW$y0lmvlZY);6N_b7e%IeI$huLuaefE&Y{y<+P4s}u%_lo4<6Q)+u)J%_0N~YN q{u)zDp-!8W)VMm@39v+>iqD8tO0Q>g1)jL}y!7<0>>pbsf&T^9*d}-Y diff --git a/crates/testing-utils/keyshares/test/dave-keyshare-1.keyshare b/crates/testing-utils/keyshares/test/dave-keyshare-1.keyshare deleted file mode 100644 index c8d74bab5957fd8cad7cf3391dd8937a3fb3caae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbW1dpHwn9LL9$k`$F(>O?pd!sgae&%qjN*_K_56j+*PIk_}`a_TN{`dXk{eGYC`}zG|Gs_c}$S^B{Cn3y@4#L7A zC_K%@1@1?OU=dh20&&B zc{tG=1BEz4?Xg}+_^%x0%q$%+4na;FYN#c{8sbcI4Pe8VmMnO&?aw6);Sn^XX_epY z|HE?l)nQ;HV+_(pW;Jcl{!u=nt}pIT9gm7IE>HyX^3nO3?v*~}ts}ky;dDYfrCjht z4E!y(SCT&UtsS)JX|LGeboF3xj628rHr?9Y9-;h(*kva7vOA&K)Vuf!b|E4;2Q1+7 z{qdXZ!6o9A3V8&XEdY9UA29e*Pv#p+y5F|SudcaTRh_^+ur=tsclN5w;=LE``KSFR z&p<0f%NiVEI_?!S{grLYu*J{Sudcb~l*TkRz-zgP(wus^-K2qtG}W&YOWVCCxHxgR zH&?O6Q$f_0M=?5jrl3SL4>?d1a0X-a7SlDpI`Ah2*+V&`LjKFeSa^E=7M@@vq4`n6 z^o1(b4|J*Z2CBT3V+j1(G339PYYPmRmT+2i?b+b_o5(5*j7VHRI23$T&7W+QH+2 zPrB~!8sRTRv(?u`>TF2(E!JJLh^lGNm>HZKA?C%(BJTp&(yz{EJ~SpUGqaL{WfG)b zp1!S`dFipX4F)Sb=N)LRxYGBz7RW+B-(>mILsKrjpPH0a-;4y(eWWH2IZHO3K|%*s z(zxeSx?pbA6aFmTS<^KIQGoG}!m8n^!ob{~jUx6xQk z%-=QJ(jg^@xmu@0RGF=~V0SxKq7k~kK?pwY-vU@ts1!1qvn3%ZJp99y*G^-QsTlzI zQ3|(Z_b-sH^Ap#V_b)aR|9GWluB?a;+p%0$q3*xm-2a=+hJbw`0uLg}UJS7P%=&}7 zgdubsDTbznfIovWJk!HRLqj#P>u>U+FKO|;wtczK$lsN*dEC{d@6SL8SLQ&{*fJPt zU8}718I_@Ma!h^i-5yRfK<{bz=3{il%CW;vx)r3MBCC9;U1Sh=O{76ippBxNB_p+U zv}Ye09Xuo*7ksrdZ{#Wvn?BK@+Zj1`N!Y@=`_$R+%IvJ6H%!iR^^FCDV}}5Hu4m8t zE4<$IvM=g*UZ=ni*gmY2O`0IK9`EFsxsB-+s12NOeDu(1L4VEsIXCTXNOdTRA9)QT zOXR3pDgu{d3gac|tvFny&5D82>+IX<%NLax=UVm%ido%i@l{*t18t<^{;4@R%) diff --git a/crates/testing-utils/keyshares/test/dave-keyshare-2.keyshare b/crates/testing-utils/keyshares/test/dave-keyshare-2.keyshare deleted file mode 100644 index 35b76af5f50760626b393c491ac67df3d8bae616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbW2dpHwn9LL9$5{imkI#D?lU2I~Fdcuq~Htd2Clg;LSoy(#XJCUTKTyl?b*kOoT zwUGOfT<4OenCy^PNrWeM&cFIYkMsWb{p0<9pU?aK{hn9f&=O-AY(po98&V-qdrzl8 z8r<736cOp~ghA19Fpw_+7es|S2U*#hA+TU9Tv{u(e?e2E|8&Hdpt&9XgCb+QMq^K< zq!wke(pRLOf}?=?h8BjX2qQ-i#|Q!ighfEncuxlhgg*s}MPd<1sI@nVhBvSXh1-K@ z-bS8y4=upPNBTcUGZ+j>wRbQIMFbM?))br-+}oc_wv6-y8KIF*RNu=8X9EljY7aBV zdZ7@%a+K2FEcdS*ft$zH1`;rHoDUE4v*vBh6cdD!S~ROlDY=fFLWSMiB{x_dwrOr{ zV3t?Xfpo8Wc3Dq$xfZsPqz=#xBp!3i0WFd$c$ZMin+DegR-%oRnMPr{Fhw;TUXrv#51}1Xa@9r(H*G1az%%os-_NT1_UMM)m_nGnVLew6YR>E}= z{+}+#UY`Ims1wk3_t54o8mragDu;!gN}`zP<7`=QR;g`izAM+ax^3K#$N!YvL8|6G z76N}O9u((HfA0V-dYH>L+Qc0VNpPh@?oc4E=1BQI=WczeS3Susr+g~@z%E3mvcNnh zCjh_A99$_}tC2>!(|ACSo+CP68{9d%;-3CC>GhcF)pHA6uBlGfgNtzvix2+pD7EvS za)EKfA2nLRwOngv-f-Jj;ES^_UdKDJsuG$S5p_&t6{|r?l{g%osq}4fX_wC=6DN%H zVam38$Ozg?NP5OD>`K8r^hj->3r4RW(=A#b_>+Qal8!05|K)I;Z#RD%@2DsC^e0Cg z<}1F))h0K%hnbyTR<*rK;%wU^n8Dxvb2yy+^k?Z8g4-RBsYm$YDF(^O6VrO8X=;f z$KBa`$2m)}G?fi2wbyn0Ezwo2oUCR}oq0Pq?p%^6VWa_Q%iru>-Zv$C=Rdp`A`znw zl^ixzHmEw=zC~v(%YL`5dQ#Q9;?t-yf4@{|yU}Tf!H>=IN`2!&6yN2Oh4dwpu3)}p z=sl6g6AEu`-4p&SMj#Y5UJO9=5C8etbXidGz*Yh6$Mm)R%^3#P`SD4F%-EijXLyxv z$2ohyw015Ng-ms80a;=yWUF>y#rwh!HuAxj16lz~GF(2jr9d2(o`o+=@3onLPR{_` zi_)2`s=ugolb@HibU=l^aP_safxIj}V)x3U8kK;91_9qqwgessU zJ)gdBvUC%7M)_&v-z=7KZvIGt?V_^Mh}g3FZ1R^#Zo$LRK5zOYv&R6MHwxwh zWP10$8j3kr(#6vSc8qBi5GS46&UMlC2@{9d%EJ~`MTIsChd0chBWUbIsld=2Mm$uK zLRT`B1+FBN-4*Aw;cyI-H66L$f;%}YSLCRdS~YnUp*_lXpDR#?+ll7_GH%WTfH!;v p-UDV7lCb?~M8D{PsA&fZW64EC`?zg!t z;_$TTy; zIddEx4gHNx>LU*4sm-p-m% zH2YsU0{(T}8uzapfm_Fh0%LhnMbOmmu`ymmC=1798pvjOT~l)X{3e4lD{1#0v}JB6 zz@pnCchqNUKLo^|WAl&TB)VcM6Wiv~Wvbsi$a9A|Z5bR2P+M;BO6rRq>f|wFx{;N5 zaO7%L^zsnqAzLvov2-$f%a*`_JixSJ&9fcju+aLSb20%}Q`%(&TynIw(ddx>wrnQO zt!rYp*f5=2bIekysS6;#aXx-0H6PAs)>^T%%`2Lb2yVBnhJhM8{7cTOW~jxMMUd1q zFUXxP5wU54FLULY?6GyJjrSGC?s|Il5S0$+upJZQUyGqcDk=G`wqxmJA}1ud^mYFK z>GGMxoLMq~d0ij>-M;WL!I&4HpEu3lB3TWf!*KKxZ6 z#5{b#q5szNh!35>pfthPiH}V^AA1QsoTDAG#vR9Lf zI}B6>J5@<8HDZhau8B>eo37UnOT8k!*S2=O-U+g&G%I{M-p&kNuW2H@=Ptz@x}|IT zb#LU<(@BZl#h2A=SYw`?b7w=wjioc&`)+KSzx7=L2CrN|@K0uREFM~LVlL?_iJmh0 zewLVsN~w`6?e{gj=N>|-}s_lpeyrb-Nc_(HBNR%5vgsi`J zh)2L%2HpP#Y%Fo3GAM{U!BB3>^^hKzu&Lk$){93pnzi-&c3-*U8QCkcTkYnhGoB>G zOTXm|rX}&SR6=7H=WCCFaoidG76)k(A+UPo82#CS(LEuaOXKqsG5&TG=BvL2Eb5xKV)d_ABI8a0Rw? znXFl$3u+4LcV(~~5a3QnW_#@Bl^XGM7C*`OtigwMR?vku@lV1fvPukwQD1&KuMm)s zY`dCYRl2oL916HAb3#_inNeW?=CtOkUmDQ4nIqFIDd&r8Q|nqNiGan5Y)qRcj$S%= zpd9pq%DFWf+j?bZ*pu#ql$X_=kJpd;tNZFB70{+l=Lj$S1Ne1w%M5}$7Q=xE!Nt&) zeTkSf!J-P%9;-EkuGt0YCeFaK!TM`W7LF8vyu=qPDffNkO`p_msZ1kusAK=*aB#y} zana}L?RA&77eK`#8D4RZLRh=P9U9Qg_!NMR-VIR4HETkYJU`VKL?0+6=l^&LmLGlB zKsthzb5y2)`O7BXNciciu4}>_f3%{v-vboF;XcqjsZI0CkKO$Apz^kZWB@(>x~XE2 zW?{=*uL*rzI8088sJMq{i=9(NR7AVrNXc-SWa?~jc${2%oX&P*1u diff --git a/crates/testing-utils/keyshares/test/dave-keyshare-held-by-bob.keyshare b/crates/testing-utils/keyshares/test/dave-keyshare-held-by-bob.keyshare deleted file mode 100644 index f1e36e8c1ff16f3104651d28fc99651dc5c511ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbVMYd8~n9M(o{(kh`kN!Cp+r^hmvm2GxoW>Yi6*xYR{yO_B|DKaCXMJ3%6x!;#^ zlteDYTq~6nx=2MXnIq9TU!4znoZq+i!|#26@Be+Dzp*LaloDa)?Cl)EV8ducggxEQ z$%)8gBWNTVk%X`d@Cl`x;6(%~EHuE(kM0f7HPn)KZW6x;K5)-9uY`34`yaha^VC;5nW9j za0n_6OY^4?f5!-1zHKNlMWkK;&G?a$9AXFM5JYUO_KlDedO;swUFD6ddc6fL+cy;8 z-07S%6gH{_0ZAtOC0ht9JCZBXS|_h)R=v7&i*M|=Y~xUX(M(-P`qQNTb`d+d6H!3~ zC(KnQ&Gh5$`ftCLR{S+<*;jHp^tqdY3qWGMbs2@HI-c9{xj)6nEE0>MRoC!Me^lb` z_VylB?z@z$#6y_G1<|3}i~BLG>^=apy%dcg{Ho+iXnG5RojI85lh!eMhN-i2aLRex zImS)4Dh@Uz7sejKFhE-t@9VC|3_nSgUT9%v!$O?B6-f6Js6vZqC!4P4YIEwV3Mc>nxwjYte;x&K z5>NT`UU(A!t{oViS^8zxiZT>r^)m4;YH}Z)4Ps4HXZ`i1(4IlI{w_< zHdE+YbfOx)Otm)WE>h>G!FmH%^Y?GkbJ|>&)Nj9IbsdqZ0Uhf@2J#j6jV9M+&7CWh zV+~7J8670H_~pgg{; zPZ(|ax^hjSrxA-Y9L(FlFXof2#mSv! z2Xne83eTkcd$&bm$@@FN1mQPKlaB_O6je35gYkId(At<_#ivR8tvV>TCm%g2t$STP zdxQF}+A4%g>Z1k^AYq4}@M~11H>3emv{f}i?tQ)Dif)||dYj|b(|NeihGD2tDB!y0E^YMyW;qtjYtDtazqCA?t=Xum6HaI~>X<5uH%_TxIW&%Jb>FnH z4Ae#AT^LGfKC(LQQRgP=v#R!o3p)?P!Z8S4v_r#wQrF=~N$tc8lf=j4cn}%55ZbgM z4VPIuZGiB`oA;xu)gYaA-{4tb%zT5hFBPzD-MSC zd>m7*byv=VDkU&OQt!oZ)Wkk@Xtwk`fMsXyu!Ld^kJ|dP{vt{jwcrKisLf=%X6Rke+nd9&MK2 zG|^+v_#_*kq{o-vG;K|wonU$$cTseKR3X0Lr=vN_WA!B#f>CT^=2ngh&`q=bj7z&H l$x8jxz8?kiso4^}J;s8|+XEp5^?^j=52d1`i#z-u^bh8m5(EGM diff --git a/crates/testing-utils/keyshares/test/dave-keyshare-held-by-charlie.keyshare b/crates/testing-utils/keyshares/test/dave-keyshare-held-by-charlie.keyshare deleted file mode 100644 index b9cdbc7a2b6cf6a95c33dd2ea1a4eee2c5d6d8a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbVMYdq5n7_N<&G!dy^TBanIIxa(t88)oHOJ;^K<+crDGjrEHMjUdf(65M0ZgX81 zO>(DPLZU(lMdhAJMdy5VKIrGX-<}We^ZcIodEZx47XvtBv2;DUl`W2BNk?Mv;Y`4k z?aK-#B25TR7WznY0BdatczB0vxm!6I1YF zr|QmH`t*Y}H_NHGW#ihasf*RM4%Kt?a113;wFo$*4UyvDfb*v!2><~HAT517gNQm< zwi#Y4$VZPt^!O7a=wC(?3uqHNFd3frG^S ztc+V8!aVj?%1hyW&DnI`^sNb!ja<07O|EZYYFwc0ccsz!105;=1~E}QINn3)t9!y3 z%W@pTf2SthS{VNb+rNH4mL+R>!_~sXZa-&%t-QJc{f%mYSW_ziTCp{+@9XO==Gilj zHkzasiwTucAv%dN((C&b_qNJ&!xcxPJ0B!R7EqW{?_kQ4b|h7$Ch;7+cMGXB_~k49 z>mA8yv3yze*mFTO!TM`vbI@m3#uz24^IO;3T#xuS>S=7JD_@Nb6$|FfeuFsWeykgx zPW{AAF;Bd%%s8~`h%vqvx4S4hidg5zHym(SxVaiqj6Sxce8IlSR=n27Dm4n`?RVH> z5nY3hl_Zu))Nmi8V87I))tvRm-=}ihoj26)d}MqVnIQ|G89@0mgikdVcIN!NQPg3o zUbp6$BFsyH^p^kF9 zt%YuJ1=SCX7XR)sD3zQd-=Tz#fWE39*DoGfOgl5mM0AuKE$hULf-PaAx);}mJ(F}1 z%>#_@p!FfHN2d9S%4F3BE>rgHlxsOV;+bf4y?tAMNLS?TfS6YT_n%$tJLJaXB-ug# zfs9m6w%VnHrG=*lA!e*ulV(p@DFy|)aq)aTzmD*zIj<6iZr zNH_Py;h?*6$_g?*(F+ecu>eyWu1*z2*6?~i# zsW~l@58o0)4os}RNRy26tVL6kZh~BmuZeeDb^&4!aMDhSliu>I@BeCr9Qg3Q)@mOX z=B0{a~R(^vUoXIs!B_do>*L@+#0W<&k5gV!e>RowEF2qz_7wNpB$SI|8F z%7!$_AF)o2F2ASS7DKp9cE8{x>=u`RdO>=pxgs<5CC8c5rcD|9X`)~kxz1##PIjEJ j%%t{@!qvoFj>-{D=4~ZkXkooCPIID^eRlm0{|Eg82$~#V diff --git a/crates/testing-utils/keyshares/test/dave/keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/test/dave/keyshare-held-by-alice.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..1432a01522aa968d113857728a0b7cc44a1ff3af GIT binary patch literal 2192 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 literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/dave/keyshare-held-by-charlie.keyshare b/crates/testing-utils/keyshares/test/dave/keyshare-held-by-charlie.keyshare new file mode 100644 index 0000000000000000000000000000000000000000..090e697fac72f6c3ee257fd44aba4d41d9f88059 GIT binary patch literal 2192 zcmbW1YdjNb9LF=)PO@5r#5O5Kim}aD^>LXEA#F1f?QCW)4cU&_luIkJaiR-K6DdTw zRJ1Or9JxkRWbWHkiZh&wb)s|Lt{3&u^X~iN`TaiM&;R*9)^NA|Zb$ZVLgL_bB+8fO zAI-vq!KHytt%7b zYr_gh(1;YsiXR`9{}Y{DTs-K$eh4NmI)LaIO2A^m86hEV@iZHRw}(GHl8ZZFyWa)n z>*9mMsniw7z=aq)1-7#h2~v zyfJKqs4-=aHY>rTQ=3F`hm+&BJqK~lq>x42 zq9~^U%4@P2B(14SLK?Ny>p5ts{5}N3{qbz!s3C;8hgM%|YQf>tpUNHQ)MnN$$!)ok zDZq!jx<+-a&7jOhpQ326X4ZP;`;fxwC!bjZBdaRu9^Fo{e@)YVYx{y3_C)jP#NGJX}E#x?Azo$Tb2yLNqT27T~zU?fC= zaV0E38DG+aFmu9Q7XUSoae5E7O_nrTe6+)q*x`<4B}?a$HTn44dcbpGbGBz!l#=;m zH!WU@qhHZxMY{dM=u{k_x*yNfxV$%55VN(-whExEsZ2rMFTqg972h7ukm7Gc!sTAN z*_!KuXo=nSJOmpeDraqd3pwLZZE${;h))?cuXH@r#hfl9Wx$rwGSU+fb+atPV01Fm6a8n8=1yDLu zaUq59;OsF0M+PApSJMAl)pT(~VR%PPstgJP;d@L%yWJF%(sQ0>!J+0z>4j-we-34y zeE>!Mv-{=tVIwtXa^4LO?f_RcKueM}^A3wQttN+u(*`%+g z3Vm1Ci#4k!j^^bTPB5C^?}KsFi)z#@CvK)#m8Rz2+5qFHCfHWp`Bz^S&-|oUUC<}= z)Nc>rrg47nlqa4ytq=0*x>7w7gnoR}NWVCL4gQj$T`b22vx9{;H)$rKIiSo@wepUP zuN61jCxfz7lqHm@FztvOS1a2*oZU8aBDG_IdH=BJBLiT+eu6AHYZysAaoT<_%peuH zI?X4Bu|_lKVi*^^26zHoCIFA9U;GzPk<V# z=S>AjCqsYO|I8c_NCFNW&W0UpU)8>~wJK)pLJR*Xmg~}}9o{4R2cTDr7^glHNh8*Y zFO3wqznES#C442FIlfq6w8MP2L8qMZ%x)$5gaz;pR3$c}oqMD;D)ZPC5pczknXp7H$%`^C?8rZjRnaxMc6#LkeBv5kByiWsT ztc*pi|8kIyMg-0kmJ+MHVx>8oc~(`y2E8JUQwLk$EY;{rcB6l|rR7IugY3KQ^V{B= z$<($P+I5eC2S^pwcsS;9ZCX8blbXqbH?e%Bh}#NX)#zsW$Wj|8da~&da%!V{l3?MR z-|SoZ+_l47b*?|($>a4;ntp zGwb7r@vFOVtkcA4O3UKV5Pg3!RclsFR=L9_SNwElt@|7GrFU%|-%7RX#2Sk{BJqu` q@$usE8^uyhgL_=qaGcTX3pW~yNfI@JD~oEPOC0`2fB0^Q%J?6+KOc_( literal 0 HcmV?d00001 diff --git a/crates/testing-utils/keyshares/test/eve-keyshare-0.keyshare b/crates/testing-utils/keyshares/test/eve-keyshare-0.keyshare deleted file mode 100644 index 3d92ff4a3b0f575df1ab20d5a19140c1645c24a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmXpob#Zid_DT;7Gb{GUj|}xr3vqYN%uPvgt4K98^Ye;G&#v-_G7fUK40Lu1&hYhM zQaGmgzh#H)Z-=+7vfAI?9Blhu|J%bLrcPyJzl75EnuY4j2Bt2izU5}&N#W&@X@NeT@30Ta+f(p*W%L`DNsw;;Dd zpURXn({yvoz|@HR64y-AVvma4h#=p}5NE^e$dH0`*Qf&bKu3>YqhMD;CNh)mZAIqn zt1>&X@3U=T|E#Iy^6}b!{Zx)Ad(CG>MFq;=aeh5jm}Gw|GHu8#uYM9ewN!QUhlxAH z#QuHm_!6`Kjl-w?XRat*Jd~75vd0yf)75jN$f7R@>FN4R6kKE!LQE|4XX=gW{*#LMCivec;X|Bv<_Q7MsplN!M3a zPnbW=ohdl2ZKY@7L7}e-UjILTtdgE5J}c|abEcEE5=R(Oy@|@(Rk|=dRM_0Dd;6|E zch7m8&A&W9U$Q>jVE?IaTYp>qyeb^<|JUiS3N{uk?E8(T{$lZ)JE^rb|8&5d8+fd^|5H z>+$}>ri)ZG1s1uz2@9KLvopn+E8pfxb>!D;qKBk{OeS54W_;S1+qh}!dLCohg17!< ze{P{u+@s*k3H>QS^*f47nx~<97>!4ADph2* zIFTB_ZYgr@+t=Fv3|p7Z?v_vNFxjdYvv_x2|DjG1#kmuIRmDFqd^0UQe3nQDn|~rl z-WG?18?Tf;2`x8Oy7YQ}q92dJ5}&N(e~$>;ggq{Lql^IB}! z)}B2(NpSOjqdBY$b(@ccv@?Bt<-rihDY)^9T%gA%S4~6K&9N?Gc>PaCS*F^o^60>c ztL2)B39}N#eUIH*c)zn}^I@g{25sg|2d5`&-7TJMZyF-(Jz?$k{fSrX1sWE*eEM59 zRoPX|Q?=LXnzCPEKyQTeXZxSAkLxyDnw{qm>1=O0TB*9w!oo_fTI`K!>kh;2zuO13tdA@43+G|PE0!Qj;^UD>tyNx7RRv%S2Sl4X-) zRFwR)>%7#8WtTTJY8d-|(~)Re&~n9Ved*=)CGL;C@dl~Z{WrT9KTq4dJiaw=d2i1P z`KnVv7h68=ZduK+9avJOJ;?dM@PzeUM%PMr-YpuO(>2vgtC_D?PBh7Xexm5$?uw5t qr_RroQB^wjAUgW>Jh`VbtM@xNoQ^K~&)D@x+0o_F2^A^4{s#ax_Y@ca diff --git a/crates/testing-utils/keyshares/test/eve-keyshare-1.keyshare b/crates/testing-utils/keyshares/test/eve-keyshare-1.keyshare deleted file mode 100644 index c42a6bd227809efe1a9b93c9b22b2177e3e9c025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmXpobuslVHw#Y+FON(!4EC_}3r!6R^Tvkw?d!F zlrqzFbIZWgi2M@QOw(eIirk1G-^vhY!|ceAf^^rY0{1{ik6@!<)r%$f zKNodHksRO2mqI08D=0&Mz@t&6ybtMQ<;BZ9RL|+FY&uwcgLKKin?K3M%>?Td-MX z)A{8!K7IX@+oe$TD>z)~N}sF4eIklQ`uoQlr~Y^;`M%@a^zNah!c(K7=hjQeiOb@b z2W|Ipi-d=K(){BU^E^j%q4|9)#jehCwjzrPW!8ojvP_%4@k;Qlo6=`HH!dl%+j>}M zO515s2Wi!F1{JKft8*LPoab7sG2{N1RQ(6VPq&3k*vR_8ol8ir`0Xt=owJgzudJRh zf0{c}a9Z0+&%%R3UlqLmfBsk{Jx_dA)}7}}Cu=2+Frs=BmA9*OVR)#pxm)-4U3>1H z^EjJ-d49fReYnB?Q{T4!w)%NhIN<-U(_a;AELzz28%_Pi;x~6vYis`LfH^n#c7E8( z8ttO`rIVv#&a3>ATY+n4Obp(=dqbqe-wiinCT@RY#A)B8FM{9x!VfDBKic?sUQ*WM z{fA8#sb~r;a(fdNHp^ybiZfTf&6DcLuh&EmNd=iqx)RO!v@y4F)714m#&FTDkM3`HF}dQe&keap!I=~KQ-bPu6qhtlL-jBkkMz96Y;htr zfZbB$+PAN@{~5L}o!u>;*kQ6&F=p}Zy#7O-B8qb-{;G<9UifBOdiX4n4mSTpj=U`n z2{&FTeG*!3s&wh~{6s$@4z6IaVM z6BA}7iu)eBweWst&*sBS0SwyAn+{G-*t%Oh+1@ln*n7g-?fVn2*b6i)bounRY^t)W znx|^7)iq_m!hqfg=g;;(V;|RTwlq7>A=262bhJ{R?E}XJgSmoXUlJo)gqap6z1``N zU8df|c4fo;FT&OA5Bw(G-(3H4$C0BpOsIi~%4>)c=XmsT@hubgO-|NKPJ!QB-fT~3{! nEu*S*>_K$&>v?idWmfNZa5x=Z^q;ZokFul7r4uSrc>NCm9wZgk diff --git a/crates/testing-utils/keyshares/test/eve-keyshare-2.keyshare b/crates/testing-utils/keyshares/test/eve-keyshare-2.keyshare deleted file mode 100644 index 1eda2078556bf4707f9fbf084e2a262ebfe7192c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbW1c{~$*9LG0fj?@z-$~i|;vXLoFj@iuEY&LU0wV9S2Gxt@F$dR5`69QvN0JgrrAjOYy+lrw2K?O#OpgJX2A@f!2mDD z-e*ZW+<4RPEe?Vs>=5`UQ#ZO>l*b7pGS-aX>PMwwgHD){abzsc%+cRB-1U%M7@A}h z?r-YnO4kHz{=|Mb+MrN4CW&eqhGluUI-a1|qy2*z3{142ktqS^&J2jfdLD8?nUPSo zbELbMQ?>A7V~3(?4(W?ADSqBq|bd-8XsN-TEcSKi4yY4qtmYN$*& z;!8h$GK=Pa5_oXMu@pSuU8K5kKDvQlaN(i*gNi_M=bv^cNEy)D!4*-pwCsBBL`lyb zbw%#%=bRixN<@k}v@Pl2S8>S3|C*6iYkd|THnMkmgQoUg6Ic6V>dPZ2Kmenbdjz&P z#?JkpUWQFHTRzzaaih%Zf5Ul?1uB*u7MVjcGhSIjuCrCEsBCdgevN=!_*SJWqoyMC zXkClJ<#U~i)+)NM;L#G6l|hNq-7@9-3Pg*3u%WQg2bAm@i6MI#dG)ZFL9jvBZuF%2 z2xz|eiX7+MZ3lL<{E{YaePJ$Er9`Rl)cY~9m#39mfg3S5s>X;iH&=zjnDY-CAANX* z?PB$pvUVr9!TBA_bzjX_UMmpSS38$9kw;P_`Nnyx;)LSd)Kpd{v1njN!)%>|m!0ln zhE#OXBrAN7bhjXf+|c;`HvHkP(ZhCw#3&z`;2^08*Pgnnw6--5WVqrdYy zW|~SZL^d!`GA!gsoX3(-@!1|1lU#upa5O0>>3&|d>>;&~8Ry7vZ#!a`+l8`mnB)pI ziMedpM-g}YQuLbBfci(WfA&R&OG15E_*u?I;GfjicL{W)-H#|~1`#eVon8mj{dx7g z1})vB4(eUr6nybn1_WB1vl@GBj6Ka^x)nmw!Ok?P;9BeB1Cv_w@;4D$eN&}0f-HQv zOz5OS`{!H_XXv7faT?I!?%<5fcc*_*IwhvHkAqi_!VRi)0}}XZ4OiNJV?@P0C9o|q zQQR`e(ylJsf=yd`gHTNb59S$&G~O6m$Z^8suW6fb1CRaQ?88J5Ln=OSU(Do(2!)u8 z;I(OD{QBGh&3npJ9HEUXztfQoEMcr$kRi9;?yc!}NRI5YQ5=XIOE+{jS+ro!#^H6M zIeK6JPX8&yjgs>&3)*rJ=>wOJZ)^3PhxN-}(b0Ryt91Xp!+<;wBajf*4zXL!#kX<~DeSO7^{u126v!p@`hjU;$J zcDpv^-}2#sf^^U7e0Oc+ARgiNK0;ufq`eGdf>%! z)J2+mih@`;rCtphu;Ho3~(<q0LRvb9Now mS5O_ivRs#fx?tvkI!*MXVev~BGA+I9A9%Ksleh!vOs diff --git a/crates/testing-utils/keyshares/test/eve-keyshare-held-by-alice.keyshare b/crates/testing-utils/keyshares/test/eve-keyshare-held-by-alice.keyshare deleted file mode 100644 index 4281330bc501088e8710623eb15741294abf0859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 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 diff --git a/crates/testing-utils/keyshares/test/eve-keyshare-held-by-charlie.keyshare b/crates/testing-utils/keyshares/test/eve-keyshare-held-by-charlie.keyshare deleted file mode 100644 index c5537a9d5d4a5d3c2ffc2fd998d048bd9135a584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2192 zcmbW1c{~$*9LIBYjfav4HEVO`$|PfMh8i&S9i6_{w86uIP=1c~7Gyi58O6ul-8{@g9frjaJZYCuP8zld zxDCPt=VgWZl_THYV?%gl!Q`YHbmVxPvgpDPuDS2zIS#+LT$SEo?bt(hPo;6YybH^zJ}s%^Yegnt9BcfUv3b8rY>WCkFZ83pyUxgaZZ4T*MZ zvQ|lnn6$E@(3P7fbq;jzx$i+0D$B}$ZhG4~>gLb|#z)^%Al>)*#29m7T$OeC#;v1l ze2TpD)QwN=Wd_Mw?tj#a?7WXn9Ex@oCh%P^e_o%io8OrYyU;S26dd+tt8(t=m#^Nv zp}y=&&3974Pt`);!13$Fk~{aok!d-`osqWumlb-6HEAb~d{J`ABGW!4dTrC&*w!<} zztg3hxt&uO8dS~d>XNGP-SVKqy(JrgpHi1efH>HLDuXq^8)tBgK))t;9zXEzXHcuS zERnsHqirmzBR-Iz6YnW#SkVx3i6CSbKlM^qRx$MfX4#^HFw+Kz9~2|?HLA9|^y)*Xul^Fkysz+lwHRh>#1&ey*MK%7lv zxGCym$)jY>T8b4Yl)vIx4>WMz_jK9IQIButk-PH8U3z0JXNj+toT}2<6<9>fd1Og+ zoq+MsIZ>pdceZ9PGMU~kB;HwYJ8*vzD@Pdun1-Z-wseSZ$?GQ+v~#=!gH%_SEaxP2 ztEgl3kbji=qtEdC$jMx*vTH}evV~Smdt0ANo#|F=`l~i}?6{j#HM+y5 zfqPc!B+=>4$q+^KDzX1F)KJTF@mX3*u#j`*yL2-f9_eeUp-95#x{gud(EEVu!pTv! z>_)q{j_YkgInFW2rlJbyHk+^Jm7d|b7>7;%b!w6r!*ho08)Kvk+$4e4E)$visnSYJ*NcWJRGl_`|7 zPK^ajOh>NgZuGTkm32CtE82=^pFhlvY0FFRI)CLxpOmJG^y*5N|`I6&TLwaNHrL(mWQV zVg8a|Rl2uN9Kr`uXB_T-p{AV$?r(HEOvx|IE>0L^prrJh9l1^#r4;t+^R~RHBd^Pq z($gie3y$4fIa^&d26WJ*qlJ6$m`owQ_J^v1?^;5Gw$8{gVICQGAEml)z|ED?M~0_R z2vl@qFf$4FQ0m_4PE`qM@~yJmd%+^MtBUp>Mlp-Spt0fNTn0{%W?Q2cJ(ZL-%yGd0--Bq|Lo+oBf9}d3A#CxD2a4(bGsU#?J$5MD zWWQm~Qo17{h{|y`c}64Ciht{)JbU9I%EA09@yV^|LP=#-kXti1yeJoqQIrx mBr%~XT_2tZ>P0mcfD<{LlkF0)&3EOR-+BmNh1P+)^8W?e;uZ%0 diff --git a/crates/testing-utils/src/create_test_keyshares.rs b/crates/testing-utils/src/create_test_keyshares.rs index 7b80de562..0d95a5c84 100644 --- a/crates/testing-utils/src/create_test_keyshares.rs +++ b/crates/testing-utils/src/create_test_keyshares.rs @@ -30,36 +30,32 @@ use std::collections::BTreeSet; /// threshold keyshares with auxiliary info pub async fn create_test_keyshares( distributed_secret_key_bytes: [u8; 32], - alice: sr25519::Pair, - bob: sr25519::Pair, - charlie: sr25519::Pair, + signers: [sr25519::Pair; 3], ) -> Vec<(ThresholdKeyShare, AuxInfo)> where Params: SchemeParams, { let signing_key = SigningKey::from_bytes(&(distributed_secret_key_bytes).into()).unwrap(); - let signers = vec![alice.clone(), bob.clone(), charlie.clone()]; let session_id = SessionId::from_seed(b"12345".as_slice()); let all_parties = signers.iter().map(|pair| PartyId::from(pair.public())).collect::>(); let mut old_holders = all_parties.clone(); - old_holders.remove(&PartyId::from(charlie.clone().public())); + // Remove one member as we initially create 2 of 2 keyshares, then reshare to 2 of 3 + old_holders.remove(&PartyId::from(signers[2].public())); let keyshares = KeyShare::::new_centralized(&mut OsRng, &old_holders, Some(&signing_key)); let aux_infos = AuxInfo::::new_centralized(&mut OsRng, &all_parties); - let alice_id = PartyId::from(bob.public()); let new_holder = NewHolder { - verifying_key: keyshares[&alice_id].verifying_key(), + verifying_key: keyshares.values().next().unwrap().verifying_key(), old_threshold: 2, old_holders, }; - let mut sessions = signers + let mut sessions = signers[..2] .iter() - .filter(|&pair| pair.public() != charlie.public()) .map(|pair| { let inputs = KeyResharingInputs { old_holder: Some(OldHolder { @@ -82,7 +78,7 @@ where }) .collect::>(); - let charlie_session = { + let new_holder_session = { let inputs = KeyResharingInputs { old_holder: None, new_holder: Some(new_holder.clone()), @@ -92,14 +88,14 @@ where make_key_resharing_session( &mut OsRng, session_id, - PairWrapper(charlie), + PairWrapper(signers[2].clone()), &all_parties, inputs, ) .unwrap() }; - sessions.push(charlie_session); + sessions.push(new_holder_session); let new_t_key_shares = run_nodes(sessions).await; diff --git a/crates/threshold-signature-server/src/helpers/launch.rs b/crates/threshold-signature-server/src/helpers/launch.rs index a90331b97..102c44d66 100644 --- a/crates/threshold-signature-server/src/helpers/launch.rs +++ b/crates/threshold-signature-server/src/helpers/launch.rs @@ -74,6 +74,12 @@ pub enum ValidatorName { Eve, } +impl std::fmt::Display for ValidatorName { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", format!("{:?}", self).to_lowercase()) + } +} + /// Output for --setup-only flag #[derive(Deserialize, Debug, Clone)] pub struct SetupOnlyOutput { diff --git a/crates/threshold-signature-server/src/helpers/tests.rs b/crates/threshold-signature-server/src/helpers/tests.rs index 71a72e099..4e85966fd 100644 --- a/crates/threshold-signature-server/src/helpers/tests.rs +++ b/crates/threshold-signature-server/src/helpers/tests.rs @@ -216,23 +216,14 @@ pub async fn spawn_testing_validators( } /// Add the pre-generated test keyshares to a kvdb -async fn put_keyshares_in_db(_index: usize, validator_name: ValidatorName) { - // Eve's keyshares are used as the network parent key - let user_name = "eve"; - - let string_validator_name = match validator_name { - ValidatorName::Alice => "alice", - ValidatorName::Bob => "bob", - ValidatorName::Charlie => "charlie", - ValidatorName::Dave => "dave", - ValidatorName::Eve => "eve", - }; +async fn put_keyshares_in_db(non_signer_name: ValidatorName, validator_name: ValidatorName) { let keyshare_bytes = { let project_root = project_root::get_project_root().expect("Error obtaining project root."); let file_path = project_root.join(format!( - "crates/testing-utils/keyshares/production/{}-keyshare-held-by-{}.keyshare", - user_name, string_validator_name + "crates/testing-utils/keyshares/production/{}/keyshare-held-by-{}.keyshare", + non_signer_name, validator_name )); + println!("File path {:?}", file_path); std::fs::read(file_path).unwrap() }; @@ -299,8 +290,7 @@ pub async fn jump_start_network_with_signer( let validators_names = vec![ValidatorName::Alice, ValidatorName::Bob, ValidatorName::Charlie, ValidatorName::Dave]; let mut non_signer = None; - let mut keyshare_index = 0; - for validator_name in validators_names { + for validator_name in validators_names.clone() { let mnemonic = development_mnemonic(&Some(validator_name)); let (tss_signer, _static_secret) = get_signer_and_x25519_secret_from_mnemonic(&mnemonic.to_string()).unwrap(); @@ -310,14 +300,21 @@ pub async fn jump_start_network_with_signer( // Ignore the error as one confirmation will fail if submit_transaction(api, rpc, &tss_signer, &jump_start_confirm_request, None) .await - .is_ok() + .is_err() { - put_keyshares_in_db(keyshare_index, validator_name).await; - keyshare_index += 1; - } else { non_signer = Some(validator_name); } } + if let Some(non_signer) = non_signer { + for validator_name in validators_names { + if non_signer != validator_name { + put_keyshares_in_db(non_signer, validator_name).await; + } + } + } else { + tracing::error!("Missing non-signer - not storing pre-generated keyshares"); + } + non_signer } diff --git a/scripts/create-test-keyshares/Cargo.toml b/scripts/create-test-keyshares/Cargo.toml index 63180cc38..fae22e389 100644 --- a/scripts/create-test-keyshares/Cargo.toml +++ b/scripts/create-test-keyshares/Cargo.toml @@ -7,12 +7,14 @@ homepage ='https://entropy.xyz/' license ='AGPL-3.0-or-later' repository ='https://github.com/entropyxyz/entropy-core' edition ='2021' +publish =false [dependencies] entropy-testing-utils={ version="0.2.0-rc.1", path="../../crates/testing-utils" } tokio ={ version="1.40", features=["macros", "fs", "rt-multi-thread", "io-util", "process"] } entropy-shared ={ version="0.2.0-rc.1", path="../../crates/shared" } entropy-kvdb ={ version="0.2.0-rc.1", path="../../crates/kvdb", default-features=false } +sp-core ="31.0.0" # Unreleased version of Synedrion with support for child key derivations. synedrion={ git="https://github.com/entropyxyz/synedrion", rev="1d210d149dfeb0dca1dd41d7fac4d0bf03c686fa" } diff --git a/scripts/create-test-keyshares/README.md b/scripts/create-test-keyshares/README.md new file mode 100644 index 000000000..ecefbdceb --- /dev/null +++ b/scripts/create-test-keyshares/README.md @@ -0,0 +1,17 @@ +# `entropy-create-test-keyshares` + +This is used to create sets of pre-generated keyshares. These are used in some of the `entropy-tss` +tests to speed up the test by not needing to run a distributed key generation during the test. + +Since keyshares are linked to the identities of the holders, and the initial signer set is selected +randomly during the test, there is one keyshare set generated per possible combination of initial +signers. + +Since we have 4 nodes, and 3 signers, we refer to each set by the name of the node who is **not** in +the signer set (which is the one who will act as the relayer node). + +So set 'alice' consists of ['bob', 'charlie', 'dave'] and set 'bob' consists of ['alice', 'charlie', +dave'], etc. + +There are also different keyshare sets for 'test' or 'production' parameters used by Synedrion. Test +parameters are less secure but mean that the protocols run much faster. diff --git a/scripts/create-test-keyshares/src/main.rs b/scripts/create-test-keyshares/src/main.rs index 5c386ce43..0dbd2bbca 100644 --- a/scripts/create-test-keyshares/src/main.rs +++ b/scripts/create-test-keyshares/src/main.rs @@ -17,60 +17,76 @@ //! The base path for where to store keyshares is given as a single command line argument //! If it is not given, the current working directory is used use entropy_kvdb::kv_manager::helpers::serialize; -use entropy_shared::{DETERMINISTIC_KEY_SHARE_DAVE, DETERMINISTIC_KEY_SHARE_EVE}; +use entropy_shared::DETERMINISTIC_KEY_SHARE_EVE; use entropy_testing_utils::create_test_keyshares::create_test_keyshares; use entropy_tss::helpers::{ - launch::{DEFAULT_ALICE_MNEMONIC, DEFAULT_BOB_MNEMONIC, DEFAULT_DAVE_MNEMONIC}, + launch::{ + ValidatorName, DEFAULT_ALICE_MNEMONIC, DEFAULT_BOB_MNEMONIC, DEFAULT_CHARLIE_MNEMONIC, + DEFAULT_DAVE_MNEMONIC, + }, validator::get_signer_and_x25519_secret_from_mnemonic, }; -use std::{env::args, path::PathBuf}; +use sp_core::sr25519; +use std::{env::args, iter::zip, path::PathBuf}; use synedrion::{ProductionParams, TestParams}; #[tokio::main] async fn main() { let base_path = PathBuf::from(args().nth(1).unwrap_or_else(|| ".".to_string())); - let (alice_pair, _) = - get_signer_and_x25519_secret_from_mnemonic(DEFAULT_ALICE_MNEMONIC).unwrap(); - let (bob_pair, _) = get_signer_and_x25519_secret_from_mnemonic(DEFAULT_BOB_MNEMONIC).unwrap(); - let (charlie_pair, _) = - get_signer_and_x25519_secret_from_mnemonic(DEFAULT_DAVE_MNEMONIC).unwrap(); + let keypairs_and_names: Vec<_> = [ + (DEFAULT_ALICE_MNEMONIC, ValidatorName::Alice), + (DEFAULT_BOB_MNEMONIC, ValidatorName::Bob), + (DEFAULT_CHARLIE_MNEMONIC, ValidatorName::Charlie), + (DEFAULT_DAVE_MNEMONIC, ValidatorName::Dave), + ] + .into_iter() + .map(|(mnemonic, name)| { + let (pair, _) = get_signer_and_x25519_secret_from_mnemonic(mnemonic).unwrap(); + (pair.signer().clone(), name) + }) + .collect(); - let names_and_secret_keys = - [("dave", *DETERMINISTIC_KEY_SHARE_DAVE), ("eve", *DETERMINISTIC_KEY_SHARE_EVE)]; + let secret_key = *DETERMINISTIC_KEY_SHARE_EVE; - for (name, secret_key) in names_and_secret_keys { - let test_keyshares = create_test_keyshares::( - secret_key, - alice_pair.signer().clone(), - bob_pair.signer().clone(), - charlie_pair.signer().clone(), - ) - .await; - let test_keyshres_serialized = + for (_keypair, name) in keypairs_and_names.iter() { + let (keypairs_this_time, names_this_time): (Vec, Vec) = + keypairs_and_names.iter().filter(|(_, n)| n != name).cloned().unzip(); + + let keypairs_this_time: [sr25519::Pair; 3] = keypairs_this_time + .try_into() + .map_err(|_| "Cannot convert keypair vector to array") + .unwrap(); + + // Create and write test keyshares + let test_keyshares = + create_test_keyshares::(secret_key, keypairs_this_time.clone()).await; + let test_keyshares_serialized: Vec<_> = test_keyshares.iter().map(|k| serialize(k).unwrap()).collect(); - write_keyshares(base_path.join("test"), name, test_keyshres_serialized).await; + let keyshares_and_names = zip(test_keyshares_serialized, names_this_time.clone()).collect(); + write_keyshares(base_path.join("test"), name, keyshares_and_names).await; - let production_keyshares = create_test_keyshares::( - secret_key, - alice_pair.signer().clone(), - bob_pair.signer().clone(), - charlie_pair.signer().clone(), - ) - .await; - let production_keyshres_serialized = + // Create and write production keyshares + let production_keyshares = + create_test_keyshares::(secret_key, keypairs_this_time.clone()).await; + let production_keyshres_serialized: Vec<_> = production_keyshares.iter().map(|k| serialize(k).unwrap()).collect(); - write_keyshares(base_path.join("production"), name, production_keyshres_serialized).await; + let keyshares_and_names = zip(production_keyshres_serialized, names_this_time).collect(); + write_keyshares(base_path.join("production"), name, keyshares_and_names).await; } } -async fn write_keyshares(base_path: PathBuf, name: &str, keyshares_bytes: Vec>) { - let holder_names = ["alice", "bob", "dave"]; - for (i, bytes) in keyshares_bytes.iter().enumerate() { - let filename = format!("{}-keyshare-held-by-{}.keyshare", name, holder_names[i]); +async fn write_keyshares( + base_path: PathBuf, + name_of_excluded: &ValidatorName, + keyshares_and_names: Vec<(Vec, ValidatorName)>, +) { + for (keyshare, name) in keyshares_and_names { let mut filepath = base_path.clone(); + filepath.push(name_of_excluded.to_string()); + let filename = format!("keyshare-held-by-{}.keyshare", name); filepath.push(filename); println!("Writing keyshare file: {:?}", filepath); - std::fs::write(filepath, bytes).unwrap(); + std::fs::write(filepath, keyshare).unwrap(); } } From f8cd3a27211fe2341847f0f0578d3bd95f1ed7bd Mon Sep 17 00:00:00 2001 From: peg Date: Tue, 1 Oct 2024 23:26:44 +0200 Subject: [PATCH 3/7] Small fixes to `test-cli` (#1084) Small fixes to test-cli --- crates/test-cli/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/test-cli/src/lib.rs b/crates/test-cli/src/lib.rs index 8713c9774..9bc063167 100644 --- a/crates/test-cli/src/lib.rs +++ b/crates/test-cli/src/lib.rs @@ -76,6 +76,7 @@ enum CliCommand { /// interface. programs: Vec, /// Option of version numbers to go with the programs, will default to 0 if None + #[arg(short, long)] program_version_numbers: Option>, /// A name or mnemonic from which to derive a program modification keypair. /// This is used to send the register extrinsic so it must be funded @@ -311,7 +312,7 @@ pub async fn run_command( program_version_number, ) .await?; - Ok(format!("Program stored {hash}")) + Ok(format!("Program stored: {}", hex::encode(hash))) }, CliCommand::RemoveProgram { mnemonic_option, hash } => { let mnemonic = if let Some(mnemonic_option) = mnemonic_option { @@ -409,7 +410,7 @@ pub async fn run_command( if !programs.is_empty() { println!( - "{:<11} {:<48} {:<11} {:<14} {} {}", + "{:<64} {:<48} {:<11} {:<14} {} {}", "Hash".blue(), "Stored by:".green(), "Times used:".purple(), @@ -420,7 +421,7 @@ pub async fn run_command( for (hash, program_info) in programs { println!( "{} {} {:>11} {:>14} {:<13} {}", - hash, + hex::encode(hash), program_info.deployer, program_info.ref_counter, program_info.bytecode.len(), From 121714f63a10e902fdffe3188a12f9e7ee80abf9 Mon Sep 17 00:00:00 2001 From: JesseAbram <33698952+JesseAbram@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:52:16 -0400 Subject: [PATCH 4/7] Fix master build (#1088) * Fix master build * fix * Fix race condition * increase TEST_RESHARE_BLOCK * add logger to sign eth * fix do jump start * fmt --- crates/shared/src/constants.rs | 2 +- .../src/helpers/tests.rs | 29 ++++++++++--------- .../src/validator/tests.rs | 3 +- .../tests/sign_eth_tx.rs | 3 +- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/crates/shared/src/constants.rs b/crates/shared/src/constants.rs index c2bc4d689..e592a9889 100644 --- a/crates/shared/src/constants.rs +++ b/crates/shared/src/constants.rs @@ -75,7 +75,7 @@ pub const MAX_SIGNERS: u8 = 15; pub const SIGNER_THRESHOLD: u8 = 2; /// For testing to line up chain mock data and reshare_test -pub const TEST_RESHARE_BLOCK_NUMBER: u32 = 7; +pub const TEST_RESHARE_BLOCK_NUMBER: u32 = 9; /// Program version number, must be incremented if version number changes pub const PROGRAM_VERSION_NUMBER: u8 = 0; diff --git a/crates/threshold-signature-server/src/helpers/tests.rs b/crates/threshold-signature-server/src/helpers/tests.rs index 4e85966fd..ef3b37c7e 100644 --- a/crates/threshold-signature-server/src/helpers/tests.rs +++ b/crates/threshold-signature-server/src/helpers/tests.rs @@ -365,6 +365,7 @@ pub async fn do_jump_start( rpc: &LegacyRpcMethods, pair: sr25519::Pair, ) { + run_to_block(rpc, 2).await; let block_number = rpc.chain_get_header(None).await.unwrap().unwrap().number + 1; put_jumpstart_request_on_chain(api, rpc, pair).await; @@ -374,21 +375,23 @@ pub async fn do_jump_start( let validators_info = query_chain(api, rpc, selected_validators_query, None).await.unwrap().unwrap(); let validators_info: Vec<_> = validators_info.into_iter().map(|v| v.0).collect(); - let onchain_user_request = OcwMessageDkg { block_number, validators_info }; + let onchain_user_request = + OcwMessageDkg { block_number, validators_info: validators_info.clone() }; let client = reqwest::Client::new(); - let response_results = join_all( - [3002, 3003, 3004] - .iter() - .map(|port| { - client - .post(format!("http://127.0.0.1:{}/generate_network_key", port)) - .body(onchain_user_request.clone().encode()) - .send() - }) - .collect::>(), - ) - .await; + + let mut results = vec![]; + for validator_info in validators_info { + let url = format!( + "http://{}/generate_network_key", + std::str::from_utf8(&validator_info.ip_address.clone()).unwrap() + ); + if url != *"http://127.0.0.1:3001/generate_network_key" { + results.push(client.post(url).body(onchain_user_request.clone().encode()).send()) + } + } + + let response_results = join_all(results).await; let jump_start_status_query = entropy::storage().staking_extension().jump_start_progress(); let mut jump_start_status = query_chain(api, rpc, jump_start_status_query.clone(), None) diff --git a/crates/threshold-signature-server/src/validator/tests.rs b/crates/threshold-signature-server/src/validator/tests.rs index a82e0aa58..3bdefba2e 100644 --- a/crates/threshold-signature-server/src/validator/tests.rs +++ b/crates/threshold-signature-server/src/validator/tests.rs @@ -220,8 +220,9 @@ async fn test_reshare() { ); } + let current_block_number = rpc.chain_get_header(None).await.unwrap().unwrap().number; // Check that rotating the network key wont work again later - run_to_block(&rpc, block_number + 9).await; + run_to_block(&rpc, current_block_number + 3).await; let response_stale = client.post("http://127.0.0.1:3001/validator/rotate_network_key").send().await.unwrap(); diff --git a/crates/threshold-signature-server/tests/sign_eth_tx.rs b/crates/threshold-signature-server/tests/sign_eth_tx.rs index 16f946baf..e8564065f 100644 --- a/crates/threshold-signature-server/tests/sign_eth_tx.rs +++ b/crates/threshold-signature-server/tests/sign_eth_tx.rs @@ -26,7 +26,7 @@ use entropy_testing_utils::{ constants::{AUXILARY_DATA_SHOULD_SUCCEED, TEST_PROGRAM_WASM_BYTECODE}, spawn_testing_validators, test_node_process_testing_state, ChainSpecType, }; -use entropy_tss::helpers::tests::do_jump_start; +use entropy_tss::helpers::tests::{do_jump_start, initialize_test_logger}; use ethers_core::{ abi::ethabi::ethereum_types::{H160, H256}, types::{RecoveryMessage, Transaction, TransactionRequest, U256}, @@ -46,6 +46,7 @@ const GOERLI_CHAIN_ID: u64 = 5; #[tokio::test] #[serial] async fn integration_test_sign_eth_tx() { + initialize_test_logger().await; clean_tests(); let (_validator_ips, _validator_ids) = From 4af5c9e04b14a0c823eb2f63d3d30f116994bf11 Mon Sep 17 00:00:00 2001 From: peg Date: Tue, 1 Oct 2024 23:53:38 +0200 Subject: [PATCH 5/7] Avoid panic by checking that we have a non-signing validator before selecting one (#1083) Check that we have a non-signing validator before selecting one --- crates/client/src/client.rs | 3 +++ crates/client/src/errors.rs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 89c49514b..bf2a36ebb 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -116,6 +116,9 @@ pub async fn sign( let message_hash = Hasher::keccak(&message); let validators_info = get_validators_not_signer_for_relay(api, rpc).await?; + if validators_info.is_empty() { + return Err(ClientError::NoNonSigningValidators); + } tracing::debug!("Validators info {:?}", validators_info); let block_number = rpc.chain_get_header(None).await?.ok_or(ClientError::BlockNumber)?.number; diff --git a/crates/client/src/errors.rs b/crates/client/src/errors.rs index 163059b11..24705ae55 100644 --- a/crates/client/src/errors.rs +++ b/crates/client/src/errors.rs @@ -96,8 +96,6 @@ pub enum ClientError { TryFromSlice(#[from] std::array::TryFromSliceError), #[error("User is not registered on-chain")] NotRegistered, - #[error("No synced validators")] - NoSyncedValidators, #[error("Cannot confirm program was created")] CannotConfirmProgramCreated, #[error("Cannot confirm program was removed")] @@ -108,4 +106,6 @@ pub enum ClientError { CannotQuerySynced, #[error("Verifying key has incorrect length")] BadVerifyingKeyLength, + #[error("There are no validators which can act as a relay node for signature requests")] + NoNonSigningValidators, } From db02efe5287f85be7f1f42f6b77f23469a8d0327 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 08:12:10 +0000 Subject: [PATCH 6/7] Bump clap from 4.5.18 to 4.5.19 in the patch-dependencies group (#1091) Bumps the patch-dependencies group with 1 update: [clap](https://github.com/clap-rs/clap). Updates `clap` from 4.5.18 to 4.5.19 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.18...clap_complete-v4.5.19) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch dependency-group: patch-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- crates/test-cli/Cargo.toml | 2 +- crates/threshold-signature-server/Cargo.toml | 2 +- node/cli/Cargo.toml | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8070e6e3e..7b9815faa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1307,9 +1307,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ "clap_builder", "clap_derive", @@ -1317,9 +1317,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", @@ -14173,12 +14173,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" dependencies = [ "rustix 0.38.37", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/test-cli/Cargo.toml b/crates/test-cli/Cargo.toml index 1c3599c8c..be65c76cb 100644 --- a/crates/test-cli/Cargo.toml +++ b/crates/test-cli/Cargo.toml @@ -10,7 +10,7 @@ edition ='2021' [dependencies] entropy-client={ version="0.2.0", path="../client" } -clap ={ version="4.5.18", features=["derive"] } +clap ={ version="4.5.19", features=["derive"] } colored ="2.0.4" subxt ="0.35.3" sp-core ="31.0.0" diff --git a/crates/threshold-signature-server/Cargo.toml b/crates/threshold-signature-server/Cargo.toml index bd49ebd0d..186749bf7 100644 --- a/crates/threshold-signature-server/Cargo.toml +++ b/crates/threshold-signature-server/Cargo.toml @@ -63,7 +63,7 @@ bip32={ version="0.5.2" } bip39={ version="2.0.0", features=["zeroize"] } bytes={ version="1.7", default-features=false, features=["serde"] } base64="0.22.1" -clap={ version="4.5.18", features=["derive"] } +clap={ version="4.5.19", features=["derive"] } num="0.4.3" snow="0.9.6" sha3="0.10.8" diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index e1305e632..7a7510111 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -19,7 +19,7 @@ name='entropy' [dependencies] # Third-party dependencies -clap ={ version="4.5.18", features=["derive"], optional=true } +clap ={ version="4.5.19", features=["derive"], optional=true } codec ={ package="parity-scale-codec", version="3.0.0" } futures ="0.3.30" hex-literal ="0.4.1" @@ -99,7 +99,7 @@ pallet-staking-extension={ version="0.2.0", path="../../pallets/staking" } project-root="0.2.2" [build-dependencies] -clap={ version="4.5.18", optional=true } +clap={ version="4.5.19", optional=true } pallet-balances ={ version="29.0.0" } substrate-build-script-utils={ version="11.0.0" } From d1f2c96af27c2ed56b98a54e7e6d98603e3a655c Mon Sep 17 00:00:00 2001 From: Hernando Castano Date: Wed, 2 Oct 2024 11:16:21 -0400 Subject: [PATCH 7/7] Trigger attestation check during `validate` (#1063) * Switch to using a `StorageDoubleMap` instead * Use loose coupling between attestation and staking extension pallets With the tight coupling we're not able to build out a mock runtime for the staking extension pallet since the compiler isn't able to verify that we have an implementation of the staking extension pallet for our mock attestation pallet (yeah, bit of a roundabout thing...). The loose coupling gives us a bit of flexibility here, and also allows us to scope the iteraction between the pallets in a more fine grained way. * Update test mocks to use loose coupling * Appease Clippy * Add associated types to runtime implementation of `pallet_attestation` * Change how an X25519 public key is grabbed from storage We can't rely on the `ThresholdToStash` or `ThresholdServer` storage entries being populated anymore. * Update attestation pallet to use new interface * Write happy path test for full `validate` + `attest` flow * Fix compliation of `pallet_propagation` tests * TaploFmt * Remove `dbg!` statements * Use `Weight::zero()` instead of `0.into()` * Fix staking pallet tests * Add new event for `validate` extrinsic * Inline some imports * Add some docs around the key provider and attestation queue * Clean up docs around validation queue * Use counted double map for validation queue We're going to try and use this to limit the number of entries for benchmarking purposes. * Use new NMap key syntax for staking tests * Add limit to number of pending attestations in queue * Add test for max pending attestations * Hardcode pending attestation limit The compiler is complaining abou a missing `Div` implementation which I'm not really sure how to work around. * Add benchmark for Staking Extension's `on_initialize` hook * Fix a few staking pallet benchmarks * RustFmt * Add hack for writing to Staking pallet storage from Attestation benches This isn't the best solution, but for now it needs to be done since the `attest()` extrinsic expects certain Staking pallet specific data structures to be populated before it has try and verify an attestation. * RustFmt * Run through benchmark for `Staking::on_intialize()` * Run through benchmark for `Attestation::on_intialize()` * Add new method to key handler for dealing with PCKs * Bump TDX Quote and fix staking tests * Clean up `KeyProvider` implementation * Fix attestation benchmarks * Fix staking benchmarks * Rename `X25519KeyProvider` to `KeyProvider` This reflects the more generic nature of the trait now. * RustFmt * Add check for expected values in test * Add note about pallet ordering for `on_initialize()` * RustFmt * Clean up some small things * Use randomness in quote generation * Add test randomness provider to Propagation mock * Add `CHANGELOG` entry * Change method comment into doccomment * Clarify accounts used in `ValidationQueue` * Add error type for missing PCK --- CHANGELOG.md | 6 + Cargo.lock | 4 + crates/shared/src/types.rs | 31 +++ pallets/attestation/Cargo.toml | 2 + pallets/attestation/src/benchmarking.rs | 64 ++++-- pallets/attestation/src/lib.rs | 81 ++++++-- pallets/attestation/src/mock.rs | 5 + pallets/attestation/src/weights.rs | 45 +++++ pallets/propagation/src/mock.rs | 7 + pallets/registry/src/mock.rs | 4 + pallets/staking/Cargo.toml | 12 +- pallets/staking/src/benchmarking.rs | 66 +++++- pallets/staking/src/lib.rs | 164 ++++++++++++++- pallets/staking/src/mock.rs | 28 ++- pallets/staking/src/tests.rs | 188 +++++++++++++++++- pallets/staking/src/weights.rs | 49 +++++ runtime/src/lib.rs | 6 + runtime/src/weights/pallet_attestation.rs | 48 +++-- .../src/weights/pallet_staking_extension.rs | 36 +++- 19 files changed, 771 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f74fd62a0..799c37ac1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,11 @@ At the moment this project **does not** adhere to As such, `UserSignatureRequest` no longer requires the `validators_info` field since the the relayer adds that in after. The response received from the validator is now a `Vec` from the signers. +- In ([#1063](https://github.com/entropyxyz/entropy-core/pull/1063)) the + `pallet_staking_extension::validate()` extrinsic was changed so that in order to populate certain + data structures related to a candidates state (namely `ThresholdToStash` and `ThresholdServer`) an + attestation from the Attestation pallet must have been received. Success of the `validate()` + extrinsic **does not** mean the caller is a candidate or validator. ### Added - Jumpstart network ([#918](https://github.com/entropyxyz/entropy-core/pull/918)) @@ -52,6 +57,7 @@ At the moment this project **does not** adhere to - Fix TSS `AccountId` keys in chainspec ([#993](https://github.com/entropyxyz/entropy-core/pull/993)) - No unbonding when signer or next signer ([#1031](https://github.com/entropyxyz/entropy-core/pull/1031)) - Add relay tx endpoint ([#1050](https://github.com/entropyxyz/entropy-core/pull/1050)) +- Trigger attestation check during validate ([#1063](https://github.com/entropyxyz/entropy-core/pull/1063)) ### Removed - Remove `prune_registration` extrinsic ([#1022](https://github.com/entropyxyz/entropy-core/pull/1022)) diff --git a/Cargo.lock b/Cargo.lock index 7b9815faa..d5f173300 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6702,6 +6702,7 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", + "rand_chacha 0.3.1", "rand_core 0.6.4", "scale-info", "sp-core 29.0.0", @@ -7414,6 +7415,7 @@ dependencies = [ "frame-support 29.0.2", "frame-system", "log", + "pallet-attestation", "pallet-bags-list", "pallet-balances", "pallet-parameters", @@ -7423,6 +7425,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "rand_chacha 0.3.1", + "rand_core 0.6.4", "scale-info", "serde", "sp-consensus-babe 0.33.0", @@ -7432,6 +7435,7 @@ dependencies = [ "sp-runtime 32.0.0", "sp-staking 27.0.0", "sp-std 14.0.0", + "tdx-quote", ] [[package]] diff --git a/crates/shared/src/types.rs b/crates/shared/src/types.rs index 0cf844dd3..c96910380 100644 --- a/crates/shared/src/types.rs +++ b/crates/shared/src/types.rs @@ -131,3 +131,34 @@ impl QuoteInputData { Self(hasher.finalize().into()) } } + +/// A trait used to get different stored keys for a given account ID. +/// +/// Not every account ID will have an given key, in which case the implementer is expected to +/// return `None`. +pub trait KeyProvider { + /// Get an X25519 public key, if any, for the given account ID. + fn x25519_public_key(account_id: &T) -> Option; + + /// Get a provisioning certification key, if any, for the given account ID. + fn provisioning_key(account_id: &T) -> Option; +} + +/// A trait used to describe a queue of attestations. +pub trait AttestationQueue { + /// Indicate that a given attestation is ready to be moved from a pending state to a confirmed + /// state. + fn confirm_attestation(account_id: &T); + + /// Request that an attestation get added to the queue for later processing. + fn push_pending_attestation( + signer: T, + tss_account: T, + x25519_public_key: X25519PublicKey, + endpoint: Vec, + provisioning_certification_key: EncodedVerifyingKey, + ); + + /// The list of pending (not processed) attestations. + fn pending_attestations() -> Vec; +} diff --git a/pallets/attestation/Cargo.toml b/pallets/attestation/Cargo.toml index ded3b1a93..71b394843 100644 --- a/pallets/attestation/Cargo.toml +++ b/pallets/attestation/Cargo.toml @@ -21,6 +21,7 @@ sp-staking ={ version="27.0.0", default-features=false } frame-benchmarking={ version="29.0.0", default-features=false, optional=true } sp-std ={ version="14.0.0", default-features=false } pallet-session ={ version="29.0.0", default-features=false, optional=true } +rand_chacha ={ version="0.3", default-features=false } pallet-parameters={ version="0.2.0", path="../parameters", default-features=false } entropy-shared={ version="0.2.0", path="../../crates/shared", features=[ @@ -54,5 +55,6 @@ std=[ 'pallet-parameters/std', 'sp-io/std', "sp-runtime/std", + "rand_chacha/std", ] try-runtime=['frame-support/try-runtime'] diff --git a/pallets/attestation/src/benchmarking.rs b/pallets/attestation/src/benchmarking.rs index 16b4de2ad..e532da0da 100644 --- a/pallets/attestation/src/benchmarking.rs +++ b/pallets/attestation/src/benchmarking.rs @@ -13,11 +13,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use entropy_shared::QuoteInputData; -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller}; -use frame_support::BoundedVec; +use entropy_shared::{AttestationQueue, QuoteInputData}; +use frame_benchmarking::{account, benchmarks, impl_benchmark_test_suite, whitelisted_caller}; use frame_system::{EventRecord, RawOrigin}; -use pallet_staking_extension::{ServerInfo, ThresholdServers, ThresholdToStash}; use super::*; #[allow(unused)] @@ -64,18 +62,16 @@ benchmarks! { // Insert a pending attestation so that this quote is expected >::insert(attestee.clone(), nonce); - let stash_account = ::ValidatorId::try_from(attestee.clone()) - .or(Err(())) - .unwrap(); - - >::insert(attestee.clone(), stash_account.clone()); - >::insert(stash_account.clone(), ServerInfo { - tss_account: attestee.clone(), - x25519_public_key: [0; 32], - endpoint: b"http://localhost:3001".to_vec(), - provisioning_certification_key: pck_encoded.to_vec().try_into().unwrap(), - }); - + // We also need to write to the queue (whose specific implementation writes to the staking + // pallet in this case) to ensure that the `attest` extrinsic has all the information about our + // attestee available. + T::AttestationQueue::push_pending_attestation( + attestee.clone(), + attestee.clone(), + [0; 32], + b"http://localhost:3001".to_vec(), + pck_encoded, + ); }: _(RawOrigin::Signed(attestee.clone()), quote.clone()) verify { assert_last_event::( @@ -84,6 +80,42 @@ benchmarks! { // Check that there is no longer a pending attestation assert!(!>::contains_key(attestee)); } + + on_initialize { + // Note: We should technically be using `MaxPendingAttestations` but we don't have access to + // that here... + let s in 1 .. 250; + + let caller: T::AccountId = whitelisted_caller(); + let nonce = [0; 32]; + let block_number = >::block_number(); + + let pck = tdx_quote::SigningKey::from_bytes(&PCK.into()).unwrap(); + let pck_encoded = tdx_quote::encode_verifying_key(pck.verifying_key()).unwrap(); + + for i in 0..s { + let threshold_account_id: T::AccountId = account("threshold", 0, i); + T::AttestationQueue::push_pending_attestation( + threshold_account_id.clone(), + threshold_account_id.clone(), + [0; 32], + b"http://localhost:3001".to_vec(), + pck_encoded, + ); + } + }: { + use frame_support::traits::Hooks; + let _ = AttestationPallet::::on_initialize(block_number); + } verify { + // Here we'll just spot check one account instead of `s` accounts since if one was written + // all were + let threshold_account_id: T::AccountId = account("threshold", 0, 0); + assert!(PendingAttestations::::get(threshold_account_id).is_some()); + + // We want to ensure that all the requests that we added to the `T::AttestationQueue` were + // also added to `AttestationRequests` + assert!(AttestationRequests::::get(block_number).unwrap().len() == s as usize); + } } impl_benchmark_test_suite!(AttestationPallet, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/pallets/attestation/src/lib.rs b/pallets/attestation/src/lib.rs index ae09ea549..daa9d5738 100644 --- a/pallets/attestation/src/lib.rs +++ b/pallets/attestation/src/lib.rs @@ -47,10 +47,17 @@ mod tests; #[frame_support::pallet] pub mod pallet { - use entropy_shared::QuoteInputData; + use entropy_shared::{AttestationQueue, KeyProvider, QuoteInputData}; use frame_support::pallet_prelude::*; + use frame_support::traits::Randomness; use frame_system::pallet_prelude::*; + use sp_runtime::traits::TrailingZeroInput; use sp_std::vec::Vec; + + use rand_chacha::{ + rand_core::{RngCore, SeedableRng}, + ChaCha20Rng, ChaChaRng, + }; use tdx_quote::{decode_verifying_key, Quote}; pub use crate::weights::WeightInfo; @@ -63,11 +70,17 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + pallet_staking_extension::Config { + pub trait Config: frame_system::Config + pallet_parameters::Config { /// The overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Describes the weights of the dispatchables exposed by this pallet. type WeightInfo: WeightInfo; + /// Something that provides randomness in the runtime. + type Randomness: Randomness>; + /// A type used to get different keys for a given account ID. + type KeyProvider: entropy_shared::KeyProvider; + /// A type used to describe a queue of attestations. + type AttestationQueue: entropy_shared::AttestationQueue; } #[pallet::genesis_config] @@ -89,7 +102,7 @@ pub mod pallet { } } - /// A map of TSS account id to quote nonce for pending attestations + /// A map of TSS Account ID to quote nonce for pending attestations #[pallet::storage] #[pallet::getter(fn pending_attestations)] pub type PendingAttestations = @@ -117,10 +130,10 @@ pub mod pallet { UnexpectedAttestation, /// Hashed input data does not match what was expected IncorrectInputData, - /// Cannot lookup associated stash account - NoStashAccount, - /// Cannot lookup associated TS server info - NoServerInfo, + /// The given account doesn't have a registered X25519 public key. + NoX25519KeyForAccount, + /// The given account doesn't have a registered provisioning certification key. + NoPCKForAccount, /// Unacceptable VM image running BadMrtdValue, /// Cannot decode verifying key (PCK) @@ -149,13 +162,9 @@ pub mod pallet { // Parse the quote (which internally verifies the attestation key signature) let quote = Quote::from_bytes("e).map_err(|_| Error::::BadQuote)?; - // Get associated server info from staking pallet - let server_info = { - let stash_account = pallet_staking_extension::Pallet::::threshold_to_stash(&who) - .ok_or(Error::::NoStashAccount)?; - pallet_staking_extension::Pallet::::threshold_server(&stash_account) - .ok_or(Error::::NoServerInfo)? - }; + // Get associated x25519 public key from staking pallet + let x25519_public_key = + T::KeyProvider::x25519_public_key(&who).ok_or(Error::::NoX25519KeyForAccount)?; // Get current block number let block_number: u32 = { @@ -165,7 +174,7 @@ pub mod pallet { // Check report input data matches the nonce, TSS details and block number let expected_input_data = - QuoteInputData::new(&who, server_info.x25519_public_key, nonce, block_number); + QuoteInputData::new(&who, x25519_public_key, nonce, block_number); ensure!( quote.report_input_data() == expected_input_data.0, Error::::IncorrectInputData @@ -177,21 +186,24 @@ pub mod pallet { let accepted_mrtd_values = pallet_parameters::Pallet::::accepted_mrtd_values(); ensure!(accepted_mrtd_values.contains(&mrtd_value), Error::::BadMrtdValue); + let provisioning_certification_key = + T::KeyProvider::provisioning_key(&who).ok_or(Error::::NoPCKForAccount)?; + // Check that the attestation public key is signed with the PCK let provisioning_certification_key = decode_verifying_key( - &server_info - .provisioning_certification_key + &provisioning_certification_key .to_vec() .try_into() .map_err(|_| Error::::CannotDecodeVerifyingKey)?, ) .map_err(|_| Error::::CannotDecodeVerifyingKey)?; + quote .verify_with_pck(provisioning_certification_key) .map_err(|_| Error::::PckVerification)?; - // Remove the entry from PendingAttestations PendingAttestations::::remove(&who); + T::AttestationQueue::confirm_attestation(&who); // TODO #982 If anything fails, don't just return an error - do something mean @@ -200,4 +212,37 @@ pub mod pallet { Ok(()) } } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(now: BlockNumberFor) -> Weight { + let pending_validators = T::AttestationQueue::pending_attestations(); + let num_pending_attestations = pending_validators.len() as u32; + let mut requests = AttestationRequests::::get(now).unwrap_or_default(); + + for account_id in pending_validators { + let mut nonce = [0; 32]; + Self::get_randomness().fill_bytes(&mut nonce[..]); + PendingAttestations::::insert(&account_id, nonce); + requests.push(account_id.encode()); + } + + AttestationRequests::::insert(now, requests); + + ::WeightInfo::on_initialize(num_pending_attestations) + } + } + + impl Pallet { + pub fn get_randomness() -> ChaCha20Rng { + let phrase = b"quote_creation"; + // TODO: Is randomness freshness an issue here + // https://github.com/paritytech/substrate/issues/8312 + let (seed, _) = T::Randomness::random(phrase); + // seed needs to be guaranteed to be 32 bytes. + let seed = <[u8; 32]>::decode(&mut TrailingZeroInput::new(seed.as_ref())) + .expect("input is padded with zeroes; qed"); + ChaChaRng::from_seed(seed) + } + } } diff --git a/pallets/attestation/src/mock.rs b/pallets/attestation/src/mock.rs index 3513578c4..682ef9ec7 100644 --- a/pallets/attestation/src/mock.rs +++ b/pallets/attestation/src/mock.rs @@ -70,6 +70,9 @@ frame_support::construct_runtime!( impl pallet_attestation::Config for Test { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); + type Randomness = TestPastRandomness; + type KeyProvider = Staking; + type AttestationQueue = Staking; } parameter_types! { @@ -309,12 +312,14 @@ impl Randomness for TestPastRandomness { } parameter_types! { pub const MaxEndpointLength: u32 = 3; + pub const MaxPendingAttestations: u32 = 4; } impl pallet_staking_extension::Config for Test { type Currency = Balances; type MaxEndpointLength = MaxEndpointLength; type Randomness = TestPastRandomness; type RuntimeEvent = RuntimeEvent; + type MaxPendingAttestations = MaxPendingAttestations; type WeightInfo = (); } diff --git a/pallets/attestation/src/weights.rs b/pallets/attestation/src/weights.rs index 3c8ef6e18..10f4734d2 100644 --- a/pallets/attestation/src/weights.rs +++ b/pallets/attestation/src/weights.rs @@ -44,6 +44,7 @@ use core::marker::PhantomData; pub trait WeightInfo { fn attest() -> Weight; + fn on_initialize(s: u32, ) -> Weight; } /// Weight functions for `pallet_attestation`. @@ -65,6 +66,28 @@ impl WeightInfo for SubstrateWeightInfo { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:0) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::AttestationRequests` (r:1 w:1) + /// Proof: `Attestation::AttestationRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::PendingAttestations` (r:0 w:250) + /// Proof: `Attestation::PendingAttestations` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `476 + s * (174 ±0)` + // Estimated: `3938 + s * (2650 ±0)` + // Minimum execution time: 23_000_000 picoseconds. + Weight::from_parts(5_800_748, 0) + .saturating_add(Weight::from_parts(0, 3938)) + // Standard Error: 68_033 + .saturating_add(Weight::from_parts(6_715_648, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2650).saturating_mul(s.into())) + } } impl WeightInfo for () { @@ -84,4 +107,26 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(3)) .saturating_add(RocksDbWeight::get().writes(1)) } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:0) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::AttestationRequests` (r:1 w:1) + /// Proof: `Attestation::AttestationRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::PendingAttestations` (r:0 w:250) + /// Proof: `Attestation::PendingAttestations` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `476 + s * (174 ±0)` + // Estimated: `3938 + s * (2650 ±0)` + // Minimum execution time: 23_000_000 picoseconds. + Weight::from_parts(5_800_748, 0) + .saturating_add(Weight::from_parts(0, 3938)) + // Standard Error: 68_033 + .saturating_add(Weight::from_parts(6_715_648, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(RocksDbWeight::get().writes(1)) + .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2650).saturating_mul(s.into())) + } } diff --git a/pallets/propagation/src/mock.rs b/pallets/propagation/src/mock.rs index 2d99b152d..3a2cc01d6 100644 --- a/pallets/propagation/src/mock.rs +++ b/pallets/propagation/src/mock.rs @@ -300,14 +300,18 @@ impl Randomness for TestPastRandomness { }) } } + parameter_types! { pub const MaxEndpointLength: u32 = 3; + pub const MaxPendingAttestations: u32 = 4; } + impl pallet_staking_extension::Config for Test { type Currency = Balances; type MaxEndpointLength = MaxEndpointLength; type Randomness = TestPastRandomness; type RuntimeEvent = RuntimeEvent; + type MaxPendingAttestations = MaxPendingAttestations; type WeightInfo = (); } @@ -372,6 +376,9 @@ impl pallet_parameters::Config for Test { impl pallet_attestation::Config for Test { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); + type Randomness = TestPastRandomness; + type KeyProvider = Staking; + type AttestationQueue = Staking; } // Build genesis storage according to the mock runtime. diff --git a/pallets/registry/src/mock.rs b/pallets/registry/src/mock.rs index 3101f1760..805f469bf 100644 --- a/pallets/registry/src/mock.rs +++ b/pallets/registry/src/mock.rs @@ -297,14 +297,18 @@ impl Randomness for TestPastRandomness { }) } } + parameter_types! { pub const MaxEndpointLength: u32 = 3; + pub const MaxPendingAttestations: u32 = 4; } + impl pallet_staking_extension::Config for Test { type Currency = Balances; type MaxEndpointLength = MaxEndpointLength; type Randomness = TestPastRandomness; type RuntimeEvent = RuntimeEvent; + type MaxPendingAttestations = MaxPendingAttestations; type WeightInfo = (); } diff --git a/pallets/staking/Cargo.toml b/pallets/staking/Cargo.toml index 60beae497..48e9cfeae 100644 --- a/pallets/staking/Cargo.toml +++ b/pallets/staking/Cargo.toml @@ -34,6 +34,12 @@ entropy-shared={ version="0.2.0", path="../../crates/shared", features=[ "wasm-no-std", ], default-features=false } +# We only use this in benchmarks and tests. Since the benches don't run with the `test` feature we need to +# import it here _and_ as a `dev-dependency`. +tdx-quote={ git="https://github.com/entropyxyz/tdx-quote", rev="cb167f2", features=[ + "mock", +], optional=true } + [dev-dependencies] frame-election-provider-support={ version="29.0.0", default-features=false } pallet-bags-list ={ version="28.0.0", default-features=false } @@ -43,9 +49,13 @@ pallet-timestamp ={ version="28.0.0", default-features=false } sp-io ={ version="31.0.0", default-features=false } sp-npos-elections ={ version="27.0.0", default-features=false } +rand_core ="0.6.4" +tdx-quote ={ git="https://github.com/entropyxyz/tdx-quote", rev="cb167f2", features=["mock"] } +pallet-attestation={ version="0.2.0", path="../attestation" } + [features] default=['std'] -runtime-benchmarks=['frame-benchmarking'] +runtime-benchmarks=['frame-benchmarking', 'tdx-quote'] std=[ "sp-npos-elections/std", "sp-staking/std", diff --git a/pallets/staking/src/benchmarking.rs b/pallets/staking/src/benchmarking.rs index 6e3731f2f..69aefbf7d 100644 --- a/pallets/staking/src/benchmarking.rs +++ b/pallets/staking/src/benchmarking.rs @@ -99,10 +99,17 @@ fn prep_bond_and_validate( if validate_also { assert_ok!(>::validate( - RawOrigin::Signed(bonder).into(), + RawOrigin::Signed(bonder.clone()).into(), ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + + let validator_id = ::ValidatorId::try_from(bonder) + .or(Err(Error::::InvalidValidatorId)) + .unwrap(); + + ThresholdToStash::::insert(&server_info.tss_account, &validator_id); + ThresholdServers::::insert(&validator_id, server_info); } } @@ -115,7 +122,6 @@ benchmarks! { prep_bond_and_validate::(true, caller.clone(), bonder.clone(), threshold, NULL_ARR); - }: _(RawOrigin::Signed(bonder.clone()), vec![30]) verify { assert_last_event::(Event::::EndpointChanged(bonder, vec![30]).into()); @@ -253,7 +259,6 @@ benchmarks! { let threshold: T::AccountId = account("threshold", 0, SEED); let x25519_public_key: [u8; 32] = NULL_ARR; prep_bond_and_validate::(false, caller.clone(), bonder.clone(), threshold.clone(), NULL_ARR); - let validator_preference = ValidatorPrefs::default(); let server_info = ServerInfo { @@ -265,7 +270,7 @@ benchmarks! { }: _(RawOrigin::Signed(bonder.clone()), validator_preference, server_info) verify { - assert_last_event::(Event::::NodeInfoChanged(bonder, vec![20], threshold).into()); + assert_last_event::(Event::::AttestationCheckQueued(bonder).into()); } declare_synced { @@ -395,6 +400,57 @@ benchmarks! { verify { assert!(NextSigners::::get().is_some()); } + + on_initialize { + let s in 1 .. T::MaxPendingAttestations::get() as u32; + + let caller: T::AccountId = whitelisted_caller(); + let threshold_account_id: T::AccountId = account("threshold", 0, SEED); + + /// This is a randomly generated secret p256 ECDSA key - for mocking the provisioning certification + /// key + const PCK: [u8; 32] = [ + 117, 153, 212, 7, 220, 16, 181, 32, 110, 138, 4, 68, 208, 37, 104, 54, 1, 110, 232, + 207, 100, 168, 16, 99, 66, 83, 21, 178, 81, 155, 132, 37, + ]; + let pck = tdx_quote::SigningKey::from_bytes(&PCK.into()).unwrap(); + let pck_encoded = tdx_quote::encode_verifying_key(pck.verifying_key()).unwrap(); + + let validator_id = ::ValidatorId::try_from(caller) + .or(Err(Error::::InvalidValidatorId)) + .unwrap(); + + for i in 0..s { + let threshold_account_id: T::AccountId = account("threshold", 0, i); + let server_info = ServerInfo { + tss_account: threshold_account_id.clone(), + x25519_public_key: NULL_ARR, + endpoint: vec![0], + provisioning_certification_key: BoundedVec::try_from( + pck_encoded.to_vec(), + ) + .unwrap(), + }; + + ValidationQueue::::insert( + (Status::Confirmed, threshold_account_id), + (validator_id.clone(), server_info), + ); + } + }: { + use frame_support::traits::Hooks; + let _ = Staking::::on_initialize(Default::default()); + } verify { + // Here we'll just spot check one account instead of `s` accounts since if one was written + // all were + let threshold_account_id: T::AccountId = account("threshold", 0, 0); + assert!(ThresholdToStash::::contains_key(threshold_account_id)); + assert!(ThresholdServers::::contains_key(validator_id)); + + // We'll also want to ensure that our queue was indeed emptied out during `on_initialize` + let confirmed = ValidationQueue::::iter_prefix((Status::Confirmed,)).collect::>(); + assert!(confirmed.len() == 0); + } } impl_benchmark_test_suite!(Staking, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/pallets/staking/src/lib.rs b/pallets/staking/src/lib.rs index 6fafa0a00..16bd2c23e 100644 --- a/pallets/staking/src/lib.rs +++ b/pallets/staking/src/lib.rs @@ -64,6 +64,7 @@ pub mod pallet { use frame_support::{ dispatch::{DispatchResult, DispatchResultWithPostInfo}, pallet_prelude::*, + storage::types::CountedStorageNMap, traits::{Currency, Randomness}, DefaultNoBound, }; @@ -93,6 +94,8 @@ pub mod pallet { type Randomness: Randomness>; type Currency: Currency; type MaxEndpointLength: Get; + /// The maximum number of pending attestations that can be held in the validation queue. + type MaxPendingAttestations: Get; /// The weight information of this pallet. type WeightInfo: WeightInfo; } @@ -165,6 +168,34 @@ pub mod pallet { pub type ThresholdToStash = StorageMap<_, Blake2_128Concat, T::AccountId, T::ValidatorId, OptionQuery>; + /// The state of a validator's attestation. + /// + /// An attestation should only get moved into a `Confirmed` state after passing the checks set + /// out in the Attestation pallet. + #[derive( + Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen, Default, + )] + pub enum Status { + #[default] + Pending, + Confirmed, + } + + /// A queue of validator attestation requests. + /// + /// This tracks the status of each attestation (pending or confirmed), as well as information + /// about the validator who is in the process of submitting an attestation. + /// + /// The `Key` expects the TSS `AccountId` to be used, while the `Value` expects a validator + /// `AccountId`. + #[pallet::storage] + #[pallet::getter(fn validation_queue)] + pub type ValidationQueue = CountedStorageNMap< + Key = (NMapKey, NMapKey), + Value = (T::ValidatorId, ServerInfo), + QueryKind = OptionQuery, + >; + /// Tracks wether the validator's kvdb is synced using a stash key as an identifier #[pallet::storage] #[pallet::getter(fn is_validator_synced)] @@ -307,6 +338,7 @@ pub mod pallet { NotNextSigner, ReshareNotInProgress, AlreadyConfirmed, + TooManyPendingAttestations, NoUnbondingWhenSigner, NoUnbondingWhenNextSigner, NoUnnominatingWhenSigner, @@ -339,6 +371,26 @@ pub mod pallet { SignerConfirmed(::ValidatorId), /// Validators subgroups rotated [old, new] SignersRotation(Vec<::ValidatorId>), + /// A TSS account has been queued up for an attestation check. + AttestationCheckQueued(T::AccountId), + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(_now: BlockNumberFor) -> Weight { + let initial_count = ValidationQueue::::count(); + + let confirmed_validators = ValidationQueue::::drain_prefix((Status::Confirmed,)); + for (_account_id, (validator_id, server_info)) in confirmed_validators { + ThresholdToStash::::insert(&server_info.tss_account, &validator_id); + ThresholdServers::::insert(validator_id, server_info); + } + + // We only want to pay for the difference in entries, since that's what we actually + // ended up looking through + let final_count = ValidationQueue::::count(); + ::WeightInfo::on_initialize(initial_count - final_count) + } } #[pallet::call] @@ -514,14 +566,19 @@ pub mod pallet { let validator_id = T::ValidatorId::try_from(stash).or(Err(Error::::InvalidValidatorId))?; - ThresholdServers::::insert(&validator_id, server_info.clone()); - ThresholdToStash::::insert(&server_info.tss_account, validator_id); + ensure!( + ValidationQueue::::count() < T::MaxPendingAttestations::get(), + Error::::TooManyPendingAttestations + ); + + // Here we don't add the caller as a staking candidate yet. We need to first wait for + // them to pass an attestation check. + ValidationQueue::::insert( + (Status::Pending, server_info.tss_account.clone()), + (validator_id, server_info), + ); - Self::deposit_event(Event::NodeInfoChanged( - who, - server_info.endpoint, - server_info.tss_account, - )); + Self::deposit_event(Event::AttestationCheckQueued(who)); Ok(()) } @@ -702,6 +759,22 @@ pub mod pallet { Ok(weight) } + + fn get_server_info(account_id: &T::AccountId) -> Option> { + // Here we do something a admittedly a little confusing, but simply we check: + // - if any potential validators have server info (`ValidationQueue`) + // - if any accepted validator candidates (but not necessarily validators) have server + // info + // - if any validators have server info + ValidationQueue::::get((Status::Pending, account_id)) + .or_else(|| ValidationQueue::::get((Status::Confirmed, account_id))) + .map(|(_v, server_info)| server_info) + .or_else(|| { + let stash_account = Self::threshold_to_stash(account_id)?; + let server_info = Self::threshold_server(&stash_account)?; + Some(server_info) + }) + } } pub struct SessionManager( @@ -750,4 +823,81 @@ pub mod pallet { I::start_session(start_index); } } + + impl entropy_shared::KeyProvider for Pallet { + fn x25519_public_key(account_id: &T::AccountId) -> Option { + Self::get_server_info(account_id).map(|s| s.x25519_public_key) + } + + fn provisioning_key( + account_id: &T::AccountId, + ) -> Option { + let pck = Self::get_server_info(account_id).map(|s| s.provisioning_certification_key); + pck.map(|key| { + key.to_vec().try_into() + .expect("The length of both structures is `VERIFICATION_KEY_LENGTH`, so the conversion must succeed.") + }) + } + } + + impl entropy_shared::AttestationQueue for Pallet { + fn confirm_attestation(account_id: &T::AccountId) { + if let Some((validator_id, server_info)) = + ValidationQueue::::take((Status::Pending, account_id)) + { + ValidationQueue::::insert( + (Status::Confirmed, account_id), + (validator_id, server_info), + ); + } + } + + /// Request that an attestation get added to the queue for later processing. + /// + /// # Developer Note + /// + /// This method is mostly here as a work around to allow the Attestation pallet benchmarks to + /// write to the Staking Extension pallet storage. + /// + /// Don't rely on this for anything serious (e.g, actually getting potential validators into the + /// correct state. + /// + /// # Panics + /// + /// Panics if an invalid `validator_stash` or `provisioning_certification_key` are passed + /// in. The caller should check (e.g, using `Self::get_stash()` that these inputs are valid. + fn push_pending_attestation( + validator_stash: T::AccountId, + tss_account: T::AccountId, + x25519_public_key: X25519PublicKey, + endpoint: Vec, + provisioning_certification_key: entropy_shared::EncodedVerifyingKey, + ) { + let validator_id = T::ValidatorId::try_from(validator_stash) + .map_err(|_| ()) + .expect("The stash address should have been checked by the caller."); + + let provisioning_certification_key = + BoundedVec::try_from(provisioning_certification_key.to_vec()) + .expect("The PCK from the caller should be valid."); + + let server_info = ServerInfo { + tss_account: tss_account.clone(), + x25519_public_key, + endpoint, + provisioning_certification_key, + }; + + ValidationQueue::::insert( + (Status::Pending, tss_account), + (validator_id, server_info), + ); + } + + fn pending_attestations() -> Vec { + ValidationQueue::::iter_prefix((Status::Pending,)) + .map(|(k, _v)| k) + .collect::>() + } + } } diff --git a/pallets/staking/src/mock.rs b/pallets/staking/src/mock.rs index 716132b87..f8aa0516c 100644 --- a/pallets/staking/src/mock.rs +++ b/pallets/staking/src/mock.rs @@ -47,6 +47,7 @@ const NULL_ARR: [u8; 32] = [0; 32]; pub const KEY_ID_A: KeyTypeId = KeyTypeId([4; 4]); pub const KEY_ID_B: KeyTypeId = KeyTypeId([9; 4]); + // Configure a mock runtime to test the pallet. frame_support::construct_runtime!( pub enum Test @@ -60,6 +61,7 @@ frame_support::construct_runtime!( Historical: pallet_session_historical, BagsList: pallet_bags_list, Parameters: pallet_parameters, + Attestation: pallet_attestation, } ); @@ -70,7 +72,8 @@ thread_local! { } -type AccountId = u64; + +pub(crate) type AccountId = u64; type Balance = u64; parameter_types! { @@ -376,28 +379,39 @@ impl Randomness for TestPastRandomness { } } +impl pallet_parameters::Config for Test { + type RuntimeEvent = RuntimeEvent; + type UpdateOrigin = EnsureRoot; + type WeightInfo = (); +} + parameter_types! { pub const MaxEndpointLength: u32 = 3; + pub const MaxPendingAttestations: u32 = 4; } + impl pallet_staking_extension::Config for Test { type Currency = Balances; type MaxEndpointLength = MaxEndpointLength; type Randomness = TestPastRandomness; type RuntimeEvent = RuntimeEvent; + type MaxPendingAttestations = MaxPendingAttestations; type WeightInfo = (); } -impl pallet_parameters::Config for Test { +impl pallet_attestation::Config for Test { type RuntimeEvent = RuntimeEvent; - type UpdateOrigin = EnsureRoot; type WeightInfo = (); + type Randomness = TestPastRandomness; + type KeyProvider = Staking; + type AttestationQueue = Staking; } // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap(); let pallet_balances = pallet_balances::GenesisConfig:: { - balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (7, 100), (8, 100), (9, 200)], + balances: (1..=9).map(|i| if i == 9 { (i, 200) } else { (i, 100) }).collect::>(), }; let pallet_staking_extension = pallet_staking_extension::GenesisConfig:: { // (ValidatorID, (AccountId, X25519PublicKey, TssServerURL, VerifyingKey)) @@ -429,6 +443,12 @@ pub(crate) fn run_to_block(n: BlockNumber) { for b in (System::block_number() + 1)..=n { System::set_block_number(b); Session::on_initialize(b); + + // In our production runtime the attestation pallet's `on_initalize` hook gets run after the + // staking pallet's hook based off the pallet indices, so we follow the same flow here. + Staking::on_initialize(b); + Attestation::on_initialize(b); + >::on_initialize(b); Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); if b != n { diff --git a/pallets/staking/src/tests.rs b/pallets/staking/src/tests.rs index b4ae4137b..6a09eec75 100644 --- a/pallets/staking/src/tests.rs +++ b/pallets/staking/src/tests.rs @@ -15,7 +15,7 @@ use crate::{ mock::*, tests::RuntimeEvent, Error, IsValidatorSynced, NextSignerInfo, NextSigners, - ServerInfo, Signers, ThresholdToStash, + ServerInfo, Signers, ThresholdServers, ThresholdToStash, }; use codec::Encode; use frame_support::{assert_noop, assert_ok}; @@ -23,8 +23,21 @@ use frame_system::{EventRecord, Phase}; use pallet_parameters::SignersSize; use pallet_session::SessionManager; use sp_runtime::BoundedVec; + +use rand_core::RngCore; + const NULL_ARR: [u8; 32] = [0; 32]; +/// Once `validate()` is called we need to wait for an attestation to happen before populating +/// certain data structures. +/// +/// For our tests we don't always want to go through that flow, so here we manually populate those +/// data structures. +fn mock_attest_validate(validator_id: AccountId, server_info: ServerInfo) { + ThresholdToStash::::insert(&server_info.tss_account, validator_id); + ThresholdServers::::insert(validator_id, server_info); +} + #[test] fn basic_setup_works() { new_test_ext().execute_with(|| { @@ -71,9 +84,11 @@ fn it_takes_in_an_endpoint() { assert_ok!(Staking::validate( RuntimeOrigin::signed(1), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + mock_attest_validate(1, server_info); + let ServerInfo { tss_account, endpoint, .. } = Staking::threshold_server(1).unwrap(); assert_eq!(endpoint, vec![20]); assert_eq!(tss_account, 3); @@ -132,6 +147,8 @@ fn it_will_not_allow_validator_to_use_existing_tss_account() { server_info.clone(), )); + mock_attest_validate(1, server_info.clone()); + // Attempt to call validate with a TSS account which already exists assert_ok!(FrameStaking::bond( RuntimeOrigin::signed(2), @@ -167,9 +184,11 @@ fn it_changes_endpoint() { assert_ok!(Staking::validate( RuntimeOrigin::signed(1), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + mock_attest_validate(1, server_info); + assert_ok!(Staking::change_endpoint(RuntimeOrigin::signed(1), vec![30])); assert_eq!(Staking::threshold_server(1).unwrap().endpoint, vec![30]); @@ -198,9 +217,11 @@ fn it_changes_threshold_account() { assert_ok!(Staking::validate( RuntimeOrigin::signed(1), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + mock_attest_validate(1, server_info); + assert_ok!(Staking::change_threshold_accounts(RuntimeOrigin::signed(1), 4, NULL_ARR)); assert_eq!(Staking::threshold_server(1).unwrap().tss_account, 4); assert_eq!(Staking::threshold_to_stash(4).unwrap(), 1); @@ -226,9 +247,11 @@ fn it_changes_threshold_account() { assert_ok!(Staking::validate( RuntimeOrigin::signed(2), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + mock_attest_validate(2, server_info); + assert_noop!( Staking::change_threshold_accounts(RuntimeOrigin::signed(1), 5, NULL_ARR), Error::::TssAccountAlreadyExists @@ -279,8 +302,9 @@ fn it_will_not_allow_existing_tss_account_when_changing_threshold_account() { assert_ok!(Staking::validate( RuntimeOrigin::signed(2), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + mock_attest_validate(2, server_info); assert_noop!( Staking::change_threshold_accounts(RuntimeOrigin::signed(1), 5, NULL_ARR), @@ -294,6 +318,7 @@ fn it_deletes_when_no_bond_left() { new_test_ext().execute_with(|| { Signers::::put(vec![5, 6, 7]); start_active_era(1); + assert_ok!(FrameStaking::bond( RuntimeOrigin::signed(2), 100u64, @@ -309,8 +334,11 @@ fn it_deletes_when_no_bond_left() { assert_ok!(Staking::validate( RuntimeOrigin::signed(2), pallet_staking::ValidatorPrefs::default(), - server_info, + server_info.clone(), )); + + mock_attest_validate(2, server_info); + IsValidatorSynced::::insert(2, true); let ServerInfo { tss_account, endpoint, .. } = Staking::threshold_server(2).unwrap(); @@ -557,6 +585,152 @@ fn it_confirms_keyshare() { }); } +#[test] +fn it_requires_attestation_before_validate_is_succesful() { + new_test_ext().execute_with(|| { + let (alice, bob) = (1, 2); + let mut current_block = 0; + + assert_ok!(FrameStaking::bond( + RuntimeOrigin::signed(alice), + 100u64, + pallet_staking::RewardDestination::Account(alice), + )); + + /// This is a randomly generated secret p256 ECDSA key - for mocking the provisioning certification + /// key + const PCK: [u8; 32] = [ + 117, 153, 212, 7, 220, 16, 181, 32, 110, 138, 4, 68, 208, 37, 104, 54, 1, 110, 232, + 207, 100, 168, 16, 99, 66, 83, 21, 178, 81, 155, 132, 37, + ]; + let pck = tdx_quote::SigningKey::from_bytes(&PCK.into()).unwrap(); + let pck_encoded = tdx_quote::encode_verifying_key(pck.verifying_key()).unwrap(); + + let server_info = ServerInfo { + tss_account: bob, + x25519_public_key: NULL_ARR, + endpoint: vec![20], + provisioning_certification_key: BoundedVec::try_from(pck_encoded.to_vec()).unwrap(), + }; + + // Our call to `validate` should succeed, adding Bob into the validation queue. Bob should + // not be considered a candidate yet though. + assert!(Staking::validation_queue((crate::Status::Pending, bob)).is_none()); + + assert_ok!(Staking::validate( + RuntimeOrigin::signed(alice), + pallet_staking::ValidatorPrefs::default(), + server_info.clone(), + )); + + assert!(Staking::validation_queue((crate::Status::Pending, bob)).is_some()); + assert_eq!(Staking::threshold_server(bob), None); + assert_eq!(Staking::threshold_to_stash(server_info.tss_account), None); + + // Run to the next block in order to trigger the `on_initialize` hooks. + current_block += 1; + run_to_block(current_block); + + // The request in the validation queue should now be picked up by the Attestation pallet. + assert!(Attestation::pending_attestations(bob).is_some()); + assert!(Attestation::attestation_requests(current_block).is_some()); + + // Run to the next block, in practice this is around when the OCW would run. + current_block += 1; + run_to_block(current_block); + + // Here we have to mock the `attest()` extrinsic call since we can't call an offchain worker + // in the tests. + + // For now it doesn't matter what this is, but once we handle PCK certificates this will + // need to correspond to the public key in the certificate + let signing_key = tdx_quote::SigningKey::random(&mut rand_core::OsRng); + + // Note that this is using fake randomness from the mock runtime + let mut nonce = [0; 32]; + Attestation::get_randomness().fill_bytes(&mut nonce[..]); + + let input_data = entropy_shared::QuoteInputData::new( + server_info.tss_account, + server_info.x25519_public_key, + nonce, + current_block as u32, + ); + + let quote = tdx_quote::Quote::mock(signing_key.clone(), pck, input_data.0); + assert_ok!(Attestation::attest( + RuntimeOrigin::signed(server_info.tss_account), + quote.as_bytes().to_vec(), + )); + + // At this point we shouldn't have any pending attestations on either side. + assert!(Attestation::pending_attestations(bob).is_none()); + assert!(Staking::validation_queue((crate::Status::Pending, bob)).is_none()); + assert!(Staking::validation_queue((crate::Status::Confirmed, bob)).is_some()); + + // Now we expect that the `on_initialize` hook of the Staking Extension pallet will have + // picked up our confirmed attestation. + current_block += 1; + run_to_block(current_block); + + assert!(Staking::validation_queue((crate::Status::Confirmed, bob)).is_none()); + assert_eq!(Staking::threshold_to_stash(bob), Some(alice)); + assert_eq!(Staking::threshold_server(alice), Some(server_info)); + }) +} + +#[test] +fn it_does_not_allow_validation_queue_to_grow_too_much() { + new_test_ext().execute_with(|| { + let max_attestations = ::MaxPendingAttestations::get() as u64; + + // First we fill up the validation queue as much as we're allowed + for i in 1..=max_attestations { + assert_ok!(FrameStaking::bond( + RuntimeOrigin::signed(i), + 100u64, + pallet_staking::RewardDestination::Account(i), + )); + + let server_info = ServerInfo { + tss_account: i + 1, + x25519_public_key: NULL_ARR, + endpoint: vec![20], + provisioning_certification_key: BoundedVec::with_max_capacity(), + }; + + assert_ok!(Staking::validate( + RuntimeOrigin::signed(i), + pallet_staking::ValidatorPrefs::default(), + server_info.clone(), + )); + } + + // And then we try and see if we can fit one more request - which shouldn't be allowed. + assert_ok!(FrameStaking::bond( + RuntimeOrigin::signed(max_attestations + 1), + 100u64, + pallet_staking::RewardDestination::Account(max_attestations + 5), + )); + + let server_info = ServerInfo { + tss_account: max_attestations + 2, + x25519_public_key: NULL_ARR, + endpoint: vec![20], + provisioning_certification_key: BoundedVec::with_max_capacity(), + }; + + assert_noop!( + Staking::validate( + RuntimeOrigin::signed(max_attestations + 1), + pallet_staking::ValidatorPrefs::default(), + server_info.clone(), + ), + Error::::TooManyPendingAttestations + ); + }) +} + #[test] fn it_stops_unbonded_when_signer_or_next_signer() { new_test_ext().execute_with(|| { diff --git a/pallets/staking/src/weights.rs b/pallets/staking/src/weights.rs index 5faf7880e..f14dd2dec 100644 --- a/pallets/staking/src/weights.rs +++ b/pallets/staking/src/weights.rs @@ -63,6 +63,7 @@ pub trait WeightInfo { fn confirm_key_reshare_completed() -> Weight; fn new_session_base_weight(s: u32) -> Weight; fn new_session(c: u32, l: u32) -> Weight; + fn on_initialize(s: u32, ) -> Weight; } /// Weights for pallet_staking_extension using the Substrate node and recommended hardware. @@ -339,6 +340,30 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(c.into())) } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:250) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::CounterForValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::CounterForValidationQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdServers` (r:0 w:1) + /// Proof: `StakingExtension::ThresholdServers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdToStash` (r:0 w:250) + /// Proof: `StakingExtension::ThresholdToStash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `337 + s * (154 ±0)` + // Estimated: `3799 + s * (2630 ±0)` + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(21_000_000, 0) + .saturating_add(Weight::from_parts(0, 3799)) + // Standard Error: 66_002 + .saturating_add(Weight::from_parts(9_585_598, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2630).saturating_mul(s.into())) + } } // For backwards compatibility and tests @@ -614,4 +639,28 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(c.into())) } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:250) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::CounterForValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::CounterForValidationQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdServers` (r:0 w:1) + /// Proof: `StakingExtension::ThresholdServers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdToStash` (r:0 w:250) + /// Proof: `StakingExtension::ThresholdToStash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `337 + s * (154 ±0)` + // Estimated: `3799 + s * (2630 ±0)` + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(21_000_000, 0) + .saturating_add(Weight::from_parts(0, 3799)) + // Standard Error: 66_002 + .saturating_add(Weight::from_parts(9_585_598, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(RocksDbWeight::get().writes(2)) + .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2630).saturating_mul(s.into())) + } } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 5985de516..8ab947f87 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -712,12 +712,15 @@ impl pallet_staking::Config for Runtime { parameter_types! { pub const MaxEndpointLength: u32 = 100; + pub const MaxPendingAttestations: u32 = 250; } + impl pallet_staking_extension::Config for Runtime { type Currency = Balances; type MaxEndpointLength = MaxEndpointLength; type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type RuntimeEvent = RuntimeEvent; + type MaxPendingAttestations = MaxPendingAttestations; type WeightInfo = weights::pallet_staking_extension::WeightInfo; } @@ -1498,6 +1501,9 @@ impl pallet_parameters::Config for Runtime { impl pallet_attestation::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_attestation::WeightInfo; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; + type KeyProvider = StakingExtension; + type AttestationQueue = StakingExtension; } parameter_types! { diff --git a/runtime/src/weights/pallet_attestation.rs b/runtime/src/weights/pallet_attestation.rs index 57381723d..5075be428 100644 --- a/runtime/src/weights/pallet_attestation.rs +++ b/runtime/src/weights/pallet_attestation.rs @@ -16,9 +16,9 @@ //! Autogenerated weights for `pallet_attestation` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 33.0.0 -//! DATE: 2024-08-15, STEPS: `5`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-09-27, STEPS: `5`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `turnip`, CPU: `Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz` +//! HOSTNAME: `hcastano`, CPU: `` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 // Executed Command: @@ -47,18 +47,42 @@ pub struct WeightInfo(PhantomData); impl pallet_attestation::WeightInfo for WeightInfo { /// Storage: `Attestation::PendingAttestations` (r:1 w:1) /// Proof: `Attestation::PendingAttestations` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `StakingExtension::ThresholdToStash` (r:1 w:0) - /// Proof: `StakingExtension::ThresholdToStash` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `StakingExtension::ThresholdServers` (r:1 w:0) - /// Proof: `StakingExtension::ThresholdServers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ValidationQueue` (r:2 w:2) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::AcceptedMrtdValues` (r:1 w:0) + /// Proof: `Parameters::AcceptedMrtdValues` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::CounterForValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::CounterForValidationQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn attest() -> Weight { // Proof Size summary in bytes: - // Measured: `661` - // Estimated: `4126` - // Minimum execution time: 2_573_915_000 picoseconds. - Weight::from_parts(2_582_997_000, 0) - .saturating_add(Weight::from_parts(0, 4126)) - .saturating_add(T::DbWeight::get().reads(3)) + // Measured: `833` + // Estimated: `6773` + // Minimum execution time: 1_684_000_000 picoseconds. + Weight::from_parts(1_714_000_000, 0) + .saturating_add(Weight::from_parts(0, 6773)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:0) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::AttestationRequests` (r:1 w:1) + /// Proof: `Attestation::AttestationRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Attestation::PendingAttestations` (r:0 w:250) + /// Proof: `Attestation::PendingAttestations` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `476 + s * (174 ±0)` + // Estimated: `3938 + s * (2650 ±0)` + // Minimum execution time: 23_000_000 picoseconds. + Weight::from_parts(5_800_748, 0) + .saturating_add(Weight::from_parts(0, 3938)) + // Standard Error: 68_033 + .saturating_add(Weight::from_parts(6_715_648, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2650).saturating_mul(s.into())) } } diff --git a/runtime/src/weights/pallet_staking_extension.rs b/runtime/src/weights/pallet_staking_extension.rs index 6364cbdef..d71ffdeae 100644 --- a/runtime/src/weights/pallet_staking_extension.rs +++ b/runtime/src/weights/pallet_staking_extension.rs @@ -191,7 +191,7 @@ impl pallet_staking_extension::WeightInfo for WeightInf .saturating_add(Weight::from_parts(0, 64).saturating_mul(c.into())) .saturating_add(Weight::from_parts(0, 32).saturating_mul(n.into())) } - /// Storage: `StakingExtension::ThresholdToStash` (r:1 w:1) + /// Storage: `StakingExtension::ThresholdToStash` (r:1 w:0) /// Proof: `StakingExtension::ThresholdToStash` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) @@ -215,16 +215,18 @@ impl pallet_staking_extension::WeightInfo for WeightInf /// Proof: `BagsList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::CounterForValidators` (r:1 w:1) /// Proof: `Staking::CounterForValidators` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `StakingExtension::ThresholdServers` (r:0 w:1) - /// Proof: `StakingExtension::ThresholdServers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::CounterForValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::CounterForValidationQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) fn validate() -> Weight { // Proof Size summary in bytes: - // Measured: `1918` + // Measured: `1943` // Estimated: `6248` // Minimum execution time: 61_000_000 picoseconds. Weight::from_parts(68_000_000, 0) .saturating_add(Weight::from_parts(0, 6248)) - .saturating_add(T::DbWeight::get().reads(13)) + .saturating_add(T::DbWeight::get().reads(15)) .saturating_add(T::DbWeight::get().writes(8)) } /// Storage: `StakingExtension::ThresholdToStash` (r:1 w:0) @@ -325,4 +327,28 @@ impl pallet_staking_extension::WeightInfo for WeightInf .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(c.into())) } + /// Storage: `StakingExtension::ValidationQueue` (r:251 w:250) + /// Proof: `StakingExtension::ValidationQueue` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::CounterForValidationQueue` (r:1 w:1) + /// Proof: `StakingExtension::CounterForValidationQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdServers` (r:0 w:1) + /// Proof: `StakingExtension::ThresholdServers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `StakingExtension::ThresholdToStash` (r:0 w:250) + /// Proof: `StakingExtension::ThresholdToStash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 250]`. + fn on_initialize(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `337 + s * (154 ±0)` + // Estimated: `3799 + s * (2630 ±0)` + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(21_000_000, 0) + .saturating_add(Weight::from_parts(0, 3799)) + // Standard Error: 66_002 + .saturating_add(Weight::from_parts(9_585_598, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2630).saturating_mul(s.into())) + } }