Skip to content

Follow-up: implement FROST refresh/recovery (share-extension reshare or dealer-mediated) — Decision 3 from PR #4005 review #4250

Description

@piotr-roslaniec

Context

PR #4005 (multi-agent review report at agent-docs/reviews/pr-4005/report.md) surfaces that the FROST signer has no working refresh path and no working dealer fallback by deliberate design:

  • refresh_shares returns EngineError::CryptographicRefreshNotSupported (pkg/tbtc/signer/src/lib.rs:40-44); the variant is recovery_class: terminal (pkg/tbtc/signer/src/errors.rs:130).
  • trigger_emergency_rekey only sets an immutable flag (emergency_rekey_event at pkg/tbtc/signer/src/engine/lifecycle.rs:217-302) — it does not perform a rekey.
  • The dealer-style run_dkg was deleted per Decision 6 of the FROST design.

To rotate or recover keys, operators MUST run another distributed DKG end-to-end. If a permissioned operator cohort degrades below the live-DKG threshold (planned maintenance, geopolitical action, infrastructure outage), the wallet is locked until operators can be replaced AND a full DKG re-run completes.

Decision (from gap-inventory.md)

Defer to a separate PR. The CryptographicRefreshNotSupported variant becomes a long-term API contract for #4005; refresh/recovery is a known limitation.

Design options

Two paths are viable; pick one before implementation.

Option A: Share-extension reshare

t-of-n members with the help of k ≥ n-t semi-trusted helpers produce new shares against the same group key without exposing old shares. Known FROST-friendly construction. Restores the refresh-and-recover invariant without full DKG.

Option B: Dealer-mediated refresh with governance

Restricted dealer-mediated refresh: requires f+1 distinct governance-signed approvals per signer's share to recover a degraded set. The dealer is the membership secret itself split via XOR-Shamir across the still-online operators (no single dealer trust).

Acceptance criteria

  • Refresh path produces a new share set against the same group key (or a recoverable group key) without full DKG re-run.
  • Refresh can recover from a degraded operator set down to t-of-n (or f+1 approvals for option B).
  • refresh_shares returns RecoveryClass::Recoverable instead of Terminal.
  • External audit coverage (or threat-model analysis) for the chosen construction.
  • Migration guide for operators: how to invoke refresh, expected runtime, governance requirements.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions