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
In this scheme one of the participants of the swap does not learn which coins
5
-
are being swapped. For example if Alice as a tumbler service provider engages in
6
-
a partially blind atomic swap with the users Bob and Carol, the tumbler would not
7
-
be able to determine if a swapped output belongs to Bob or Carol (assuming the
8
-
transaction amounts are identical or confidential). This property is very
9
-
similar to [TumbleBit](https://eprint.iacr.org/2016/575.pdf) but in the form of
10
-
a [scriptlessscript](https://github.com/apoelstra/scriptless-scripts/blob/master/md/atomic-swap.md)
5
+
are being swapped. For example if service provider engages in a partially blind
6
+
atomic swap with the users Bob and Carol, the server would not be able to
7
+
determine if a swapped output belongs to Bob or Carol (assuming the transaction
8
+
amounts are identical or confidential). This property is very similar to
9
+
[TumbleBit](https://eprint.iacr.org/2016/575.pdf) but in the form of a [scriptlessscript](https://github.com/apoelstra/scriptless-scripts/blob/master/md/atomic-swap.md)
11
10
and therefore purely in the elliptic curve discrete logarithm setting.
12
11
13
12
The basic idea is that the discrete logarithm of the auxiliary point `T` in the
14
13
adaptor signature is not chosen uniformly at random by the server. Instead, the user
15
14
computes `T = t*G` where `t` is a [blind Schnorr signature](https://blog.cryptographyengineering.com/a-note-on-blind-signature-schemes/)
16
-
of the tumbler over a transaction spending the funding transaction without knowing
15
+
of the server over a transaction spending the funding transaction without knowing
17
16
`t` (similar to [Discreet Log Contracts](https://adiabat.github.io/dlc.pdf)).
18
17
19
18
Protocol description
20
19
---
21
-
Assume the tumbler has a permanent public key `A = a*G`, ephemeral pubkey `A1 = A +
20
+
Assume the server has a permanent public key `A = a*G`, ephemeral pubkey `A1 = A +
22
21
h*G` where `h` is a tweak that is known to Bob, and ephemeral pubkey `A2` which
23
-
has a secret key known only to the tumbler and doesn't have to be derived from `A`.
22
+
has a secret key known only to the server and doesn't have to be derived from `A`.
24
23
Bob has two pubkeys `B1 = b1*G` and `B2 = b2*G` and `H` is a cryptographic hash
25
24
function. Public key aggregation in "2-of-2" scripts is achieved with [MuSig](https://eprint.iacr.org/2018/068.pdf)
26
25
and the signature scheme is adapted from [Bellare-Neven](https://cseweb.ucsd.edu/~mihir/papers/multisignatures-ccs.pdf).
27
-
The partially blind atomic swap protocol with Alice as tumbler and Bob as a user
26
+
The partially blind atomic swap protocol with the server and Bob as a user
28
27
works as follows.
29
28
30
29
1. Setup
31
30
32
-
* Bob anonymously asks the tumbler to put coins into a key aggregated output
31
+
* Bob anonymously asks the server to put coins into a key aggregated output
33
32
O1 with public key `P1 = H(A1,B1,A1)*A1 + H(A1,B1,B1)*B1`.
34
33
* Bob puts coins into a key aggregated output O2 with `P2 = H(A2,B2,A2)*A2 +
35
-
H(A2,B2,B2)*B2`. As usual, before sending coins tumbler and Bob agree on
34
+
H(A2,B2,B2)*B2`. As usual, before sending coins server and Bob agree on
36
35
timelocked refund transactions in case one party disappears.
37
36
2. Blind signing
38
37
39
38
Bob creates a transaction `tx_B` spending O1. Then Bob creates an auxiliary
40
39
point `T = t*G` where `t` is a Schnorr signature over `tx_B` in the
41
40
following way:
42
41
43
-
* Bob asks the tumbler for nonce `Ra = ka*G`
42
+
* Bob asks the server for nonce `Ra = ka*G`
44
43
* Bob creates nonce `Rb = kb*G`
45
44
* Bob computes
46
45
* the combined nonce `R = Ra+Rb`
@@ -51,21 +50,21 @@ works as follows.
51
50
* the challenge `c'` for `A1` as part of `P1`: `c' = c1*H(A1,B1,A1)`
52
51
* the blinded challenge `c = c'+beta`
53
52
* and the blinded signature of A times `G`: `T = R + c*A`
54
-
* Bob sends `c` to the tumbler
55
-
* The tumbler replies with an adaptor signature over `tx_A` spending `O2`
53
+
* Bob sends `c` to the server
54
+
* The server replies with an adaptor signature over `tx_A` spending `O2`
56
55
with auxiliary point `T = t*G, t = ka + c*a` where `a` is the discrete
57
56
logarithm of permanent key `A`.
58
57
3. Swap
59
58
60
-
* Bob gives the tumbler his contribution to the signature over `tx_A`.
61
-
* The tumbler adds Bob's contribution to her own signature and uses it to take
59
+
* Bob gives the server his contribution to the signature over `tx_A`.
60
+
* The server adds Bob's contribution to her own signature and uses it to take
62
61
her coins out of O2.
63
62
* Due to previously receiving an adaptor signature Bob learns `t` from step (2).
64
63
4. Unblinding
65
64
66
-
* Bob unblinds the tumbler's blind signature `t` as `t' = t + alpha + c'*h` where
65
+
* Bob unblinds the server's blind signature `t` as `t' = t + alpha + c'*h` where
67
66
`c'` is the unblinded challenge `h` is the tweak for `A1`. This results in a
68
-
regular signature `(R', t')` of the tumbler (`A1`) over `tx_B`.
67
+
regular signature `(R', t')` of the server (`A1`) over `tx_B`.
69
68
* Bob adds his contribution to `t'` completing `(R', s), s = t' + kb +
70
69
c1*H(A1,B1,B1)*b1` which is a valid signature over `tx_B` spending O1:
71
70
```
@@ -80,16 +79,16 @@ works as follows.
80
79
+------------+ (R', s) +------------+
81
80
| O1 +----------->| ...|
82
81
+------------+ +------------+
83
-
the tumbler's setup tx tx_B
82
+
the server's setup tx tx_B
84
83
85
84
+------------+ +------------+
86
85
| O2 +----------->| ...|
87
86
+------------+ +------------+
88
87
Bob's setup tx tx_A
89
88
```
90
89
91
-
As a result, the tumbler can not link Bob's original coins and his new coins.
92
-
From the tumbler's perspective `tx_B` could have been just as well the result
90
+
As a result, the server can not link Bob's original coins and his new coins.
91
+
From the server's perspective `tx_B` could have been just as well the result
93
92
of a swap with someone else.
94
93
95
94
Blind Schnorr signatures suffer from a vulnerability known as "parallel attack"
@@ -105,18 +104,18 @@ challenge.
105
104
A simpler scheme that would be broken by Aggregated Signatures
106
105
---
107
106
Note that Bob can get a signature of A over anything including arbitrary
108
-
messages. Therefore, the tumbler must only use fresh ephemeral keys `A1` when
107
+
messages. Therefore, the server must only use fresh ephemeral keys `A1` when
109
108
creating outputs. This complicates the protocol because at the same time the
110
-
tumbler must not be able to determine for which exact input she signs. As a
109
+
server must not be able to determine for which exact input she signs. As a
111
110
result, It's Bob's job to apply tweak `h` to convert a signature of `A` to `A1`.
112
111
113
-
A simpler protocol where the tumbler uses `A` instead of `A1` is broken by
112
+
A simpler protocol where the server uses `A` instead of `A1` is broken by
114
113
aggregated signatures because it allows spending multiple inputs with a single
115
-
signature. If Bob creates many funding txs with the tumbler, he can create a
116
-
tx spending all of them, and prepares a message for the tumbler to sign which is
117
-
her part of the aggregate signature of all the inputs. The tumbler just dumbly
114
+
signature. If Bob creates many funding txs with the server, he can create a
115
+
tx spending all of them, and prepares a message for the server to sign which is
116
+
her part of the aggregate signature of all the inputs. The server just dumbly
118
117
signs any blinded message, so can't decide if it's an aggregated sig or not. For
119
-
example Bob may send the tumbler a challenge for an aggregate signature covering
118
+
example Bob may send the server a challenge for an aggregate signature covering
120
119
output 1 with pubkeys `L1 = {A, B1}` and output 2 with pubkeys `L2 = {A, B2}` as
0 commit comments