Privacy, control, and safety
Rotating a static deposit address does not rotate its Operator-side identity
Spark describes static-address rotation as useful for privacy, but the implementation archives the old address and creates its replacement under the same immutable owner identity. That linkage is retained and distributed across the Operator set. 1234
What the evidence shows
Technical and product details
- Documented behavior
Spark's implementation describes static-address rotation as useful for privacy, but archives the old address and creates its replacement under the same authenticated owner identity key. 1
Supporting material shown on this page
static-address rotation and identityPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 799 if err != nil { 800 return nil, fmt.Errorf("failed to create archive statement: %w", err) 801 } 802 signature := ecdsa.Sign(config.IdentityPrivateKey.ToBTCEC(), messageHash) 803 804 // Send gossip message to archive the address on all other SOs 805 selection := helper.OperatorSelection{Option: helper.OperatorSelectionOptionExcludeSelf} - Documented behavior
Deposit-address rows bind each immutable address to an immutable owner identity. The address query groups records by that identity without excluding archived addresses. 23
Supporting material shown on this page
immutable address-to-identity recordsPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 51 field.Enum("network").GoType(btcnetwork.Unspecified). 52 Immutable(). 53 Comment("Network on which the deposit address is valid."). 54 Optional(). 55 Annotations(entexample.Default(btcnetwork.Regtest)), 56 field.Bytes("owner_identity_pubkey"). 57 Immutable().identity-grouped static-address queryPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 428 if err != nil { 429 return nil, errors.InvalidArgumentMalformedField(fmt.Errorf("failed to convert proto network to common network: %w", err)) 430 } 431 query := db.DepositAddress.Query(). 432 Where(depositaddress.OwnerIdentityPubkey(idPubKey)). 433 Where(depositaddress.IsStatic(true)). 434 Order(ent.Desc(depositaddress.FieldID)). - Documented behavior
Rotation gossips the owner identity and old address to every other Operator so that all Operators archive the same record. 14
Supporting material shown on this page
static-address rotation and identityPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 799 if err != nil { 800 return nil, fmt.Errorf("failed to create archive statement: %w", err) 801 } 802 signature := ecdsa.Sign(config.IdentityPrivateKey.ToBTCEC(), messageHash) 803 804 // Send gossip message to archive the address on all other SOs 805 selection := helper.OperatorSelection{Option: helper.OperatorSelectionOptionExcludeSelf}archive gossip fieldsPinned source code · github.com · checked 2026-07-14 Relevant lines from the pinned source · open raw file 182// This marks the old address as archived (is_default=false) on all SOs. 183// Archived addresses are still queryable and able to accept deposits. 184// The coordinator signs this operation to prevent unauthorized archiving by rogue SOs. 185message GossipMessageArchiveStaticDepositAddress { 186 bytes owner_identity_public_key = 1; 187 spark.Network network = 2; 188 string address = 3; // Specific address to archive
Interpretation
Why this matters for Spark's trust model
Rotation does not break the link between old and new deposit addresses for any Spark Operator. It is address hygiene against outside observers, not an Operator-unlinkability mechanism. 1234
This section states the trust-model consequence of the cited evidence. Conditional or inferred claims remain bounded by the next section.
Scope control
What this does not establish
Sources and excerpts
Primary sources
The relevant details and available source-code excerpts appear alongside the claims above. This list preserves the complete original-source trail for independent verification.
static-address rotation and identity
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
immutable address-to-identity records
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
identity-grouped static-address query
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
archive gossip fields
Pinned source code · github.com · Pinned or archival · checked 2026-07-14
How sources, absence findings, and limitations were evaluated