Commit fc1ff6b
committed
fix(wallets): keep MuSig2 secret nonce inside the signer
Closes #111.
The IArkadeWalletSigner / IRemoteSignerTransport contracts used to return
MusigPrivNonce from GenerateNonces and require the caller to pass it back into
SignMusig. That made the secret nonce cross the signer boundary — for the
remote-signer transport that meant the "remote signer" wasn't actually one
(secret material round-tripped over the wire), and for in-process signers it
encouraged callers to hold a MuSig2 secret in their own data structures where
accidental reuse leaks the private key (MuSig2 nonce reuse is catastrophic).
Reshape the signer contract so:
- GenerateNonces returns MusigPubNonce only. The signer derives the secret
nonce internally, stores it indexed by MusigContext.AggregatePubKey
(the tweaked aggregate is a content fingerprint of the cosigner set +
taproot tweaks), and returns the public half.
- SignMusig drops the MusigPrivNonce parameter. The signer looks the secret
nonce back up by the same context and consumes it on use. Throws if no
matching nonce was generated for this context.
- GenerateNonces throws if a nonce is already stored for the same context
(calling twice without an intervening SignMusig would orphan secret
material; the user is almost certainly making a mistake).
NSecWalletSigner / HierarchicalDeterministicWalletSigner / SimpleSeedWallet
each hold a per-instance ConcurrentDictionary<string, MusigPrivNonce> keyed by
the hex of MusigContext.AggregatePubKey.ToBytes(); SignMusig TryRemoves on
consume so the store is self-evicting on the happy path. RemoteArkadeWalletSigner
is a pure passthrough, so it just drops the nonce param.
IRemoteSignerTransport now documents that long-lived transports need an
eviction policy (TTL or bounded count) for abandoned nonces — in-process
signers get away with remove-on-consume because their lifetime is the batch
session, but a server-side transport could leak unconsumed entries if a client
generates a nonce and never signs.
TreeSignerSession's _myNonces collapses from
Dictionary<uint256, (MusigPrivNonce, MusigPubNonce)> to
Dictionary<uint256, MusigPubNonce> — the secret half no longer round-trips
through the batch coordinator.
docs/articles/wallets.md updates the remote-signer example and adds a section
on the MuSig2 nonce lifecycle and eviction responsibility.1 parent 7477931 commit fc1ff6b
9 files changed
Lines changed: 158 additions & 65 deletions
File tree
- NArk.Abstractions/Wallets
- NArk.Core
- Batches
- Wallet
- NArk.Tests.End2End/Wallets
- NArk.Tests
- docs/articles
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
8 | 20 | | |
9 | 21 | | |
10 | 22 | | |
11 | 23 | | |
12 | 24 | | |
13 | 25 | | |
14 | 26 | | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
15 | 37 | | |
16 | 38 | | |
17 | 39 | | |
18 | | - | |
19 | 40 | | |
20 | 41 | | |
21 | 42 | | |
| |||
24 | 45 | | |
25 | 46 | | |
26 | 47 | | |
27 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
28 | 56 | | |
29 | 57 | | |
30 | 58 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
31 | 28 | | |
32 | 29 | | |
33 | 30 | | |
| |||
53 | 50 | | |
54 | 51 | | |
55 | 52 | | |
56 | | - | |
57 | | - | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
58 | 56 | | |
59 | 57 | | |
60 | 58 | | |
61 | | - | |
62 | | - | |
| 59 | + | |
63 | 60 | | |
64 | | - | |
65 | | - | |
66 | | - | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
67 | 66 | | |
68 | 67 | | |
69 | 68 | | |
70 | 69 | | |
71 | | - | |
72 | 70 | | |
73 | 71 | | |
74 | 72 | | |
| |||
87 | 85 | | |
88 | 86 | | |
89 | 87 | | |
90 | | - | |
91 | | - | |
92 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
| 98 | + | |
103 | 99 | | |
104 | 100 | | |
105 | 101 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
| |||
113 | 115 | | |
114 | 116 | | |
115 | 117 | | |
116 | | - | |
| 118 | + | |
117 | 119 | | |
118 | 120 | | |
119 | 121 | | |
| |||
150 | 152 | | |
151 | 153 | | |
152 | 154 | | |
153 | | - | |
| 155 | + | |
154 | 156 | | |
155 | 157 | | |
156 | 158 | | |
| |||
163 | 165 | | |
164 | 166 | | |
165 | 167 | | |
166 | | - | |
| 168 | + | |
167 | 169 | | |
168 | 170 | | |
169 | | - | |
170 | | - | |
171 | | - | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
172 | 174 | | |
173 | 175 | | |
174 | 176 | | |
| |||
182 | 184 | | |
183 | 185 | | |
184 | 186 | | |
185 | | - | |
186 | | - | |
| 187 | + | |
| 188 | + | |
187 | 189 | | |
188 | 190 | | |
189 | 191 | | |
| |||
196 | 198 | | |
197 | 199 | | |
198 | 200 | | |
199 | | - | |
200 | | - | |
201 | | - | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
202 | 204 | | |
203 | 205 | | |
204 | 206 | | |
| |||
258 | 260 | | |
259 | 261 | | |
260 | 262 | | |
261 | | - | |
262 | | - | |
| 263 | + | |
| 264 | + | |
263 | 265 | | |
264 | | - | |
| 266 | + | |
265 | 267 | | |
266 | 268 | | |
267 | 269 | | |
| |||
Lines changed: 22 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
24 | 28 | | |
25 | 29 | | |
26 | 30 | | |
| |||
36 | 40 | | |
37 | 41 | | |
38 | 42 | | |
39 | | - | |
| 43 | + | |
40 | 44 | | |
41 | 45 | | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
42 | 51 | | |
43 | 52 | | |
44 | 53 | | |
| |||
49 | 58 | | |
50 | 59 | | |
51 | 60 | | |
52 | | - | |
| 61 | + | |
53 | 62 | | |
54 | 63 | | |
55 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
56 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
57 | 76 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
3 | 4 | | |
| |||
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
17 | 24 | | |
18 | 25 | | |
19 | 26 | | |
| |||
56 | 63 | | |
57 | 64 | | |
58 | 65 | | |
59 | | - | |
| 66 | + | |
60 | 67 | | |
61 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
62 | 75 | | |
63 | 76 | | |
64 | 77 | | |
| |||
105 | 118 | | |
106 | 119 | | |
107 | 120 | | |
108 | | - | |
| 121 | + | |
109 | 122 | | |
| 123 | + | |
110 | 124 | | |
111 | | - | |
| 125 | + | |
112 | 126 | | |
113 | | - | |
| 127 | + | |
| 128 | + | |
114 | 129 | | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
115 | 135 | | |
116 | | - | |
| 136 | + | |
117 | 137 | | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
118 | 141 | | |
0 commit comments