Skip to main content

RotateKeyArgs

Struct RotateKeyArgs 

Source
pub struct RotateKeyArgs {
    pub key: RotateKeyTarget,
    pub bind_existing: bool,
    pub new_keystore: Option<PathBuf>,
    pub mbps: Option<u64>,
    pub region: Option<String>,
    pub multiaddrs: Vec<String>,
    pub accept_terms: bool,
    pub yes: bool,
    pub chain: ChainArgs,
}
Expand description

decdn node rotate-key — the operator key-rotation runbook (adr/appendix-operator-key-rotation.md) as a command (#1034).

Rotation is the one operator procedure where a half-completed run is worse than no run: a node whose local key is not the on-chain-bound one is un-slashable, which is a protocol-level fault, not merely an outage. So both paths order their steps to make that state unreachable — the iroh path commits node.secret only after bindNodeId confirms, and the eth path reads chain state to pick its next phase rather than trusting a flag.

Neither path restarts the daemon. The node key is not hot-reloadable (admin_v1_reload and SIGHUP cover mutable config fields — see the node’s runtime/reload.rs for the set — not the iroh endpoint), so the runbook’s drain → stop → rotate → restart sequence stays the operator’s to drive, with decdn node drain for the first step.

Fields§

§key: RotateKeyTarget

Which key to rotate: iroh or eth. Required, because rotating the wrong one is not recoverable in the same afternoon.

§bind_existing: bool

(--key iroh) Bind the node key ALREADY ON DISK instead of generating a fresh one.

Two jobs, both from the runbook’s § Failure modes and rollback: repair a node whose node.secret was replaced by hand (leaving it un-slashable), and roll back a rotation by re-binding a restored .bak archive. Since nothing is generated, nothing is archived — this only submits the transaction.

§new_keystore: Option<PathBuf>

(--key eth) Keystore holding the NEW Ethereum key to migrate onto. Required to reach the re-onboarding phase; the earlier phases (deregister, unbond request, window wait, withdraw) all run against the current keystore and do not need it. Passing it earlier is still useful: the address is validated against the one being migrated away from on every invocation, so a same-address mistake is caught on the first run rather than after the unbonding window.

Both keystores are unlocked from the same password source (DECDN_KEYSTORE_PASSWORD, then --keystore-password-file, then a prompt), so a headless migration needs them to share a password.

§mbps: Option<u64>

(--key eth) Capacity tier to re-declare on the new address. Required at the re-onboarding phase: deregisterNode clears the declared tier and it cannot be read back afterwards, so record the value the deregister phase prints and pass it here.

§region: Option<String>

(--key eth) regionHint for the re-registration. Defaults to the old address’s registered region.

§multiaddrs: Vec<String>

(--key eth) QUIC multiaddr for the re-registration. Repeatable. Defaults to the multiaddrs the old address registered.

§accept_terms: bool

(--key eth) Accept the network’s current operator terms non-interactively. Re-registration from a new address is a fresh registration, so it re-accepts terms (ADR 019 § Terms Acceptance); --key iroh never does, because rebinding signs the terms-free BindNodeId payload.

§yes: bool

Skip the interactive confirmation. Required from a non-interactive shell. The consequences are printed either way — this suppresses the prompt, not the warning.

§chain: ChainArgs

Chain coordinates: RPC endpoint, contract addresses, and keystore.

Trait Implementations§

Source§

impl Args for RotateKeyArgs

Source§

fn group_id() -> Option<Id>

Report the ArgGroup::id for this set of arguments
Source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to Command so it can instantiate Self via FromArgMatches::from_arg_matches_mut Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to Command so it can instantiate self via FromArgMatches::update_from_arg_matches_mut Read more
Source§

impl Debug for RotateKeyArgs

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromArgMatches for RotateKeyArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from ArgMatches, parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches, ) -> Result<Self, Error>

Instantiate Self from ArgMatches, parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( &mut self, __clap_arg_matches: &ArgMatches, ) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( &mut self, __clap_arg_matches: &mut ArgMatches, ) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more