You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
sign() requires: "A secret key must never sign two different messages for the same slot." But nothing durable enforces this. Breaking it leaks Winternitz chain state → forgery potential. (Fork choice accepting equivocation is intended, per test_equivocation.py — this issue is about the signing side.)
sign()requires: "A secret key must never sign two different messages for the same slot." But nothing durable enforces this. Breaking it leaks Winternitz chain state → forgery potential. (Fork choice accepting equivocation is intended, pertest_equivocation.py— this issue is about the signing side.)Current guards are all in-memory:
_attested_slots— not persisted, pruned after 4 slotssign()itself: no reuse check — a second call for the same slot succeedsHow it breaks:
_attested_slotswiped → re-sign with a different headProposed fix: persist a monotonic
last_signed_slotper key;_sign_with_keyrefusesslot <= last_signed_slot(minimal EIP-3076 analogue). Dual instances additionally need exclusive key-store access — an operational requirement to document.