From d64478b3016126d12e77d9cb4a827b222042b198 Mon Sep 17 00:00:00 2001 From: CleverWild Date: Wed, 26 Aug 2026 15:26:17 +0200 Subject: [PATCH] refactor(proposal): replace UpdateShamirParameters with parameterless TriggerRekey --- protobufs/operator/governance.proto | 18 +++++++--------- .../src/actors/proposal_manager.rs | 21 ++++++------------- .../src/actors/vault_coordinator/mod.rs | 4 ++-- .../src/grpc/operator/governance.rs | 9 +------- .../crates/arbiter-server/tests/governance.rs | 4 ++-- 5 files changed, 19 insertions(+), 37 deletions(-) diff --git a/protobufs/operator/governance.proto b/protobufs/operator/governance.proto index 4ee4ba1..589635b 100644 --- a/protobufs/operator/governance.proto +++ b/protobufs/operator/governance.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package arbiter.operator.governance; +import "google/protobuf/empty.proto"; + message Request { oneof payload { CreateProposalRequest create = 1; @@ -13,13 +15,13 @@ message Request { message CreateProposalRequest { oneof kind { ApproveSdkClientPayload approve_sdk_client = 1; - GrantWalletAccessPayload grant_wallet_access = 3; - ReplaceOperatorPayload replace_operator = 5; - UpdateShamirParametersPayload update_shamir_parameters = 6; - ApprovePersistentGrantPayload approve_persistent_grant = 7; - ApproveOneOffTransactionPayload approve_one_off_transaction = 8; + GrantWalletAccessPayload grant_wallet_access = 2; + ReplaceOperatorPayload replace_operator = 3; + google.protobuf.Empty trigger_rekey = 4; + ApprovePersistentGrantPayload approve_persistent_grant = 5; + ApproveOneOffTransactionPayload approve_one_off_transaction = 6; } - optional uint32 ttl_secs = 2; + optional uint32 ttl_secs = 7; } message ReplaceOperatorPayload { @@ -27,10 +29,6 @@ message ReplaceOperatorPayload { bytes new_pubkey = 2; } -message UpdateShamirParametersPayload { - uint32 new_n = 1; -} - message ApproveSdkClientPayload { int32 client_id = 1; } diff --git a/server/crates/arbiter-server/src/actors/proposal_manager.rs b/server/crates/arbiter-server/src/actors/proposal_manager.rs index fbfa5cb..5e633fa 100644 --- a/server/crates/arbiter-server/src/actors/proposal_manager.rs +++ b/server/crates/arbiter-server/src/actors/proposal_manager.rs @@ -42,9 +42,7 @@ pub enum ProposalKind { old_operator_id: i32, new_pubkey: Vec, }, - UpdateShamirParameters { - new_n: u8, - }, + TriggerRekey, ApprovePersistentGrant { payload_bytes: Vec, }, @@ -77,7 +75,7 @@ impl ProposalKind { buf.extend_from_slice(new_pubkey); buf } - Self::UpdateShamirParameters { new_n } => vec![*new_n], + Self::TriggerRekey => vec![], Self::ApprovePersistentGrant { payload_bytes } | Self::ApproveOneOffTransaction { payload_bytes } => payload_bytes.clone(), } @@ -88,7 +86,7 @@ impl ProposalKind { pub fn requires_full_quorum(kind: &str) -> bool { matches!( kind.parse::(), - Ok(ProposalKindTag::ReplaceOperator | ProposalKindTag::UpdateShamirParameters) + Ok(ProposalKindTag::ReplaceOperator | ProposalKindTag::TriggerRekey) ) } @@ -131,12 +129,7 @@ impl ProposalKind { new_pubkey, }) } - ProposalKindTag::UpdateShamirParameters => { - let &[new_n] = payload else { - return Err("invalid payload for update_shamir_parameters".to_owned()); - }; - Ok(Self::UpdateShamirParameters { new_n }) - } + ProposalKindTag::TriggerRekey => Ok(Self::TriggerRekey), ProposalKindTag::ApprovePersistentGrant => Ok(Self::ApprovePersistentGrant { payload_bytes: payload.to_vec(), }), @@ -696,9 +689,7 @@ impl ProposalManager { self.execute_replace_operator(old_operator_id, new_pubkey) .await } - ProposalKind::UpdateShamirParameters { new_n } => { - self.execute_update_shamir_parameters(new_n).await - } + ProposalKind::TriggerRekey => self.execute_trigger_rekey().await, ProposalKind::ApprovePersistentGrant { payload_bytes } => { self.execute_approve_persistent_grant(payload_bytes).await } @@ -764,7 +755,7 @@ impl ProposalManager { } /// Triggers a Shamir re-key with the current operator set (§3.3). - async fn execute_update_shamir_parameters(&self, _new_n: u8) -> Result<(), Error> { + async fn execute_trigger_rekey(&self) -> Result<(), Error> { self.vault_coordinator .ask(StartRekey {}) .await diff --git a/server/crates/arbiter-server/src/actors/vault_coordinator/mod.rs b/server/crates/arbiter-server/src/actors/vault_coordinator/mod.rs index 16d3297..1b723bd 100644 --- a/server/crates/arbiter-server/src/actors/vault_coordinator/mod.rs +++ b/server/crates/arbiter-server/src/actors/vault_coordinator/mod.rs @@ -62,7 +62,7 @@ enum CoordinatorState { ordinary_passphrases: HashMap>, recovery_passphrases: HashMap>, }, - /// Shamir re-key after `replace_operator` or `update_shamir_parameters` is approved (§3.3). + /// Shamir re-key after `replace_operator` or `trigger_rekey` is approved (§3.3). /// Collects new passphrases from all current operators, then generates a fresh seal key, /// re-splits it, and re-encrypts the vault root key. Rekeying { @@ -297,7 +297,7 @@ async fn finalize_unseal( } /// §3.3: Generate a fresh seal key, split across current operators, re-encrypt the vault root key. -/// Called after `replace_operator` or `update_shamir_parameters` is approved and all contributors submit. +/// Called after `replace_operator` or `trigger_rekey` is approved and all contributors submit. async fn finalize_rekey( db: db::DatabasePool, vault: ActorRef, diff --git a/server/crates/arbiter-server/src/grpc/operator/governance.rs b/server/crates/arbiter-server/src/grpc/operator/governance.rs index 5346f88..efd4b67 100644 --- a/server/crates/arbiter-server/src/grpc/operator/governance.rs +++ b/server/crates/arbiter-server/src/grpc/operator/governance.rs @@ -56,14 +56,7 @@ async fn handle_create( old_operator_id: p.old_operator_id, new_pubkey: p.new_pubkey, }, - Some(ProtoKind::UpdateShamirParameters(p)) => ProposalKind::UpdateShamirParameters { - #[expect( - clippy::cast_possible_truncation, - clippy::as_conversions, - reason = "new_n is always a small operator count" - )] - new_n: p.new_n as u8, - }, + Some(ProtoKind::TriggerRekey(())) => ProposalKind::TriggerRekey, Some(ProtoKind::ApprovePersistentGrant(p)) => { use prost::Message as _; ProposalKind::ApprovePersistentGrant { diff --git a/server/crates/arbiter-server/tests/governance.rs b/server/crates/arbiter-server/tests/governance.rs index 9b69276..6ab35b6 100644 --- a/server/crates/arbiter-server/tests/governance.rs +++ b/server/crates/arbiter-server/tests/governance.rs @@ -827,7 +827,7 @@ async fn replace_operator_updates_pubkey_and_starts_rekey() { } #[tokio::test] -async fn update_shamir_parameters_reaches_quorum() { +async fn trigger_rekey_reaches_quorum() { let db = db::create_test_pool().await; let actors = GlobalActors::spawn(db.clone()).await.unwrap(); actors @@ -842,7 +842,7 @@ async fn update_shamir_parameters_reaches_quorum() { let proposal_id = actors .proposal_manager .ask(CreateProposal { - kind: ProposalKind::UpdateShamirParameters { new_n: 5 }, + kind: ProposalKind::TriggerRekey, initiator_id: op_id, ttl_secs: None, })