summaryrefslogtreecommitdiff
path: root/e3/9425416a125a0bced877da82130c86e81ddd5a
blob: aa79e9db84504177cb1781b7f2d18136fbf0d3e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
Return-Path: <gsanders87@gmail.com>
Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org
	[172.17.192.35])
	by mail.linuxfoundation.org (Postfix) with ESMTPS id D0E44F12
	for <bitcoin-dev@lists.linuxfoundation.org>;
	Tue, 23 Jan 2018 15:44:22 +0000 (UTC)
X-Greylist: whitelisted by SQLgrey-1.7.6
Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41])
	by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 7A0B42C5
	for <bitcoin-dev@lists.linuxfoundation.org>;
	Tue, 23 Jan 2018 15:44:21 +0000 (UTC)
Received: by mail-wm0-f41.google.com with SMTP id b21so2782011wme.4
	for <bitcoin-dev@lists.linuxfoundation.org>;
	Tue, 23 Jan 2018 07:44:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to; 
	bh=v+0ujIGzpC+jIUtNUku5ICovzOKWK09IZ/EQU5b2Tfg=;
	b=rywa8Ge/ltgvbBz8g3bz5CY61lszlyDxGr6WRCEmikpA/EiIbEks66HxEZUQ6jK0MR
	Z62EnlTi7drp2f5Al5JAyVzhTU5XbzYGzpq05lswzlr6kj6scoIPAueZfKBMLXunfxKW
	dSME+FdVuOxJj/fVabIymylOV04j0mbOpAHG8I8BV9e7IkYuHoERliNWBhjkI3ecCFW4
	/Z9BZXdjInE7ekkJJt3Rxx0IWFgHo/A5OcbZCD0mXVYm3rxk4QPdXs/gw7XyiMk6baYd
	Tcx/3NvLW3YE4fGQUC0N2atFKx6tsqpRqNIkaEd44biYehkMe/JF+o3ogxjHWnhQZ4Td
	Ai0Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20161025;
	h=x-gm-message-state:mime-version:in-reply-to:references:from:date
	:message-id:subject:to;
	bh=v+0ujIGzpC+jIUtNUku5ICovzOKWK09IZ/EQU5b2Tfg=;
	b=BPp8MjWI3ip0Xflh3w63W1a07XgjuCudvwTylw9MjADKUttzkGF4cnnrJCs5k1DMF0
	4CAXTbtqr0lfA0xS8OYtcNH65VZrED7ps1kNXFpsWlWFWnMLx3zbNaHuDyfet5Vma5uK
	y1Nlpp0bG9yOZdlZZSr8knr/gog0tfEA/WTvHkJ3k2iNZfeMuruMMcpl2lZ4u/vaVPYB
	z1/NL53ncqAqjjgL66NPSJRXsw39FserG6btja2lCPiH6jG3wZKr7ENot3c/H3cRPV15
	BwROsbpq/Fr/idcHeVEVWYISV1NHovULd5r7rdC4kAhXfkpLEn6VR1HT8cvoGuR7qx34
	4Fcg==
X-Gm-Message-State: AKwxytdkGMpRbQdwk8h9R47jcDlPeRuw8ZUod8TNGg9snZl/l7crVhFy
	UCq1tfSnqAJLxEyc6FbuhwlQtZ4UsX2/uHGCP7w=
X-Google-Smtp-Source: AH8x226nfLwqBD7GyXKrKKZjopAO5IxgI3kdlqQakrjxQ2gcSitMURPq196Z6eB7SNj2fkHlRxuSDj1dh0zzNNINmjg=
X-Received: by 10.80.244.23 with SMTP id r23mr19222164edm.2.1516722259940;
	Tue, 23 Jan 2018 07:44:19 -0800 (PST)
MIME-Version: 1.0
Received: by 10.80.134.197 with HTTP; Tue, 23 Jan 2018 07:43:59 -0800 (PST)
In-Reply-To: <CAAS2fgTXg5kk6TyUM9dS=tf5N0_Z-GKVmzMLwTW1HxUgrqdo+Q@mail.gmail.com>
References: <CAAS2fgTXg5kk6TyUM9dS=tf5N0_Z-GKVmzMLwTW1HxUgrqdo+Q@mail.gmail.com>
From: Greg Sanders <gsanders87@gmail.com>
Date: Tue, 23 Jan 2018 10:43:59 -0500
Message-ID: <CAB3F3DuzJv3COKHP2q3o9zSViRU08wRd+9MQ6vB0qLMzSQNPTw@mail.gmail.com>
To: Gregory Maxwell <greg@xiph.org>, 
	Bitcoin Protocol Discussion <bitcoin-dev@lists.linuxfoundation.org>
Content-Type: multipart/alternative; boundary="089e0825821886de050563736b15"
X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,
	DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,
	HTML_MESSAGE,RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
	smtp1.linux-foundation.org
Subject: Re: [bitcoin-dev] Taproot: Privacy preserving switchable scripting
X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: Bitcoin Protocol Discussion <bitcoin-dev.lists.linuxfoundation.org>
List-Unsubscribe: <https://lists.linuxfoundation.org/mailman/options/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=unsubscribe>
List-Archive: <http://lists.linuxfoundation.org/pipermail/bitcoin-dev/>
List-Post: <mailto:bitcoin-dev@lists.linuxfoundation.org>
List-Help: <mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=help>
List-Subscribe: <https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev>,
	<mailto:bitcoin-dev-request@lists.linuxfoundation.org?subject=subscribe>
X-List-Received-Date: Tue, 23 Jan 2018 15:44:22 -0000

--089e0825821886de050563736b15
Content-Type: text/plain; charset="UTF-8"

Interesting parallels to current Elements sidechain peg-in functionality.
User tweaks the watchmen(BTC holder) pubkey using P2CH, committing to a
script that is used on the *sidechain side* as spending authorization for
that bitcoin output rather than mainnet.

I think composing the two can be done as:

P = C' + H(C'||S')G + H(C||S)G

where C is redefined as `C' + H(C'||S')G`, which for Bitcoin consensus
purposes is just a single pubkey.



On Mon, Jan 22, 2018 at 7:30 PM, Gregory Maxwell via bitcoin-dev <
bitcoin-dev@lists.linuxfoundation.org> wrote:

> Interest in merkelized scriptPubKeys (e.g. MAST) is driven by two main
> areas: efficiency and privacy. Efficiency because unexecuted forks of
> a script can avoid ever hitting the chain, and privacy because hiding
> unexecuted code leaves scripts indistinguishable to the extent that
> their only differences are in the unexecuted parts.
>
> As Mark Friedenbach and others have pointed out before it is almost
> always the case that interesting scripts have a logical top level
> branch which allows satisfaction of the contract with nothing other
> than a signature by all parties.  Other branches would only be used
> where some participant is failing to cooperate. More strongly stated,
> I believe that _any_ contract with a fixed finite participant set
> upfront can be and should be represented as an OR between an N-of-N
> and whatever more complex contract you might want to represent.
>
> One point that comes up while talking about merkelized scripts is can
> we go about making fancier contract use cases as indistinguishable as
> possible from the most common and boring payments. Otherwise, if the
> anonymity set of fancy usage is only other fancy usage it may not be
> very large in practice. One suggestion has been that ordinary
> checksig-only scripts should include a dummy branch for the rest of
> the tree (e.g. a random value hash), making it look like there are
> potentially alternative rules when there aren't really.  The negative
> side of this is an additional 32-byte overhead for the overwhelmingly
> common case which doesn't need it.  I think the privacy gains are
> worth doing such a thing, but different people reason differently
> about these trade-offs.
>
> It turns out, however, that there is no need to make a trade-off.  The
> special case of a top level "threshold-signature OR
> arbitrary-conditions" can be made indistinguishable from a normal
> one-party signature, with no overhead at all, with a special
> delegating CHECKSIG which I call Taproot.
>
> Let's say we want to create a coin that can be redeemed by either
> Alice && Bob   or by CSV-timelock && Bob.
>
> Alice has public A, Bob has pubkey B.
>
> We compute the 2-of-2 aggregate key C = A + B.  (Simplified; to
> protect against rogue key attacks you may want to use the MuSig key
> aggregation function [1])
>
> We form our timelock script S =  "<timeout> OP_CSV OP_DROP B
> OP_CHECKSIGVERIFY"
>
> Now we tweak C to produce P which is the key we'll publish: P = C +
> H(C||S)G.
>
> (This is the attack hardened pay-to-contract construction described in [2])
>
> Then we pay to a scriptPubKey of [Taproot supporting version] [EC point P].
>
> Now Alice and Bob-- assuming they are both online and agree about the
> resolution of their contract-- can jointly form a 2 of 2 signature for
> P, and spend as if it were a payment to a single party (one of them
> just needs to add H(C||S) to their private key).
>
> Alternatively, the Taproot consensus rules would allow this script to
> be satisfied by someone who provides the network with C (the original
> combined pubkey), S, and does whatever S requires-- e.g. passes the
> CSV check and provides Bob's signature. With this information the
> network can verify that C + H(C||S) == P.
>
> So in the all-sign case there is zero overhead; and no one can tell
> that the contract alternative exists. In the alternative redemption
> branch the only overhead is revealing the original combined pubkey
> and, of course, the existence of the contract is made public.
>
> This composes just fine with whatever other merkelized script system
> we might care to use, as the S can be whatever kind of data we want,
> including the root of some tree.
>
> My example shows 2-of-2 but it works the same for any number of
> participants (and with setup interaction any threshold of
> participants, so long as you don't mind an inability to tell which
> members signed off).
>
> The verification computational complexity of signature path is
> obviously the same as any other plain signature (since its
> indistinguishable). Verification of the branch redemption requires a
> hash and a multiplication with a constant point which is strictly more
> efficient than a signature verification and could be efficiently fused
> into batch signature validation.
>
> The nearest competitor to this idea that I can come up with would
> supporting a simple delegation where the output can be spent by the
> named key, or a spending transaction could provide a script along with
> a signature of that script by the named key, delegating control to the
> signed script. Before paying into that escrow Alice/Bob would
> construct this signature. This idea is equally efficient in the common
> case, but larger and slower to verify in the alternative spend case.
> Setting up the signature requires additional interaction between
> participants and the resulting signature must be durably stored and
> couldn't just be recomputed using single-party information.
>
> I believe this construction will allow the largest possible anonymity
> set for fixed party smart contracts by making them look like the
> simplest possible payments. It accomplishes this without any overhead
> in the common case, invoking any sketchy or impractical techniques,
> requiring extra rounds of interaction between contract participants,
> and without requiring the durable storage of other data.
>
>
> [1] https://eprint.iacr.org/2018/068
> [2] https://blockstream.com/sidechains.pdf Appendix A
> _______________________________________________
> bitcoin-dev mailing list
> bitcoin-dev@lists.linuxfoundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev
>

--089e0825821886de050563736b15
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Interesting parallels to current Elements sidechain peg-in=
 functionality. User tweaks the watchmen(BTC holder) pubkey using P2CH, com=
mitting to a script that is used on the *sidechain side* as spending author=
ization for that bitcoin output rather than mainnet.<div><br></div><div>I t=
hink composing the two can be done as:</div><div><br></div><div>P =3D C&#39=
; + H(C&#39;||S&#39;)G + H(C||S)G</div><div><br></div><div>where C is redef=
ined as `C&#39; + H(C&#39;||S&#39;)G`, which for Bitcoin consensus purposes=
 is just a single pubkey.<br><div><br></div><div><br></div></div></div><div=
 class=3D"gmail_extra"><br><div class=3D"gmail_quote">On Mon, Jan 22, 2018 =
at 7:30 PM, Gregory Maxwell via bitcoin-dev <span dir=3D"ltr">&lt;<a href=
=3D"mailto:bitcoin-dev@lists.linuxfoundation.org" target=3D"_blank">bitcoin=
-dev@lists.linuxfoundation.org</a>&gt;</span> wrote:<br><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex">Interest in merkelized scriptPubKeys (e.g. MAST) is driven by=
 two main<br>
areas: efficiency and privacy. Efficiency because unexecuted forks of<br>
a script can avoid ever hitting the chain, and privacy because hiding<br>
unexecuted code leaves scripts indistinguishable to the extent that<br>
their only differences are in the unexecuted parts.<br>
<br>
As Mark Friedenbach and others have pointed out before it is almost<br>
always the case that interesting scripts have a logical top level<br>
branch which allows satisfaction of the contract with nothing other<br>
than a signature by all parties.=C2=A0 Other branches would only be used<br=
>
where some participant is failing to cooperate. More strongly stated,<br>
I believe that _any_ contract with a fixed finite participant set<br>
upfront can be and should be represented as an OR between an N-of-N<br>
and whatever more complex contract you might want to represent.<br>
<br>
One point that comes up while talking about merkelized scripts is can<br>
we go about making fancier contract use cases as indistinguishable as<br>
possible from the most common and boring payments. Otherwise, if the<br>
anonymity set of fancy usage is only other fancy usage it may not be<br>
very large in practice. One suggestion has been that ordinary<br>
checksig-only scripts should include a dummy branch for the rest of<br>
the tree (e.g. a random value hash), making it look like there are<br>
potentially alternative rules when there aren&#39;t really.=C2=A0 The negat=
ive<br>
side of this is an additional 32-byte overhead for the overwhelmingly<br>
common case which doesn&#39;t need it.=C2=A0 I think the privacy gains are<=
br>
worth doing such a thing, but different people reason differently<br>
about these trade-offs.<br>
<br>
It turns out, however, that there is no need to make a trade-off.=C2=A0 The=
<br>
special case of a top level &quot;threshold-signature OR<br>
arbitrary-conditions&quot; can be made indistinguishable from a normal<br>
one-party signature, with no overhead at all, with a special<br>
delegating CHECKSIG which I call Taproot.<br>
<br>
Let&#39;s say we want to create a coin that can be redeemed by either<br>
Alice &amp;&amp; Bob=C2=A0 =C2=A0or by CSV-timelock &amp;&amp; Bob.<br>
<br>
Alice has public A, Bob has pubkey B.<br>
<br>
We compute the 2-of-2 aggregate key C =3D A + B.=C2=A0 (Simplified; to<br>
protect against rogue key attacks you may want to use the MuSig key<br>
aggregation function [1])<br>
<br>
We form our timelock script S =3D=C2=A0 &quot;&lt;timeout&gt; OP_CSV OP_DRO=
P B OP_CHECKSIGVERIFY&quot;<br>
<br>
Now we tweak C to produce P which is the key we&#39;ll publish: P =3D C + H=
(C||S)G.<br>
<br>
(This is the attack hardened pay-to-contract construction described in [2])=
<br>
<br>
Then we pay to a scriptPubKey of [Taproot supporting version] [EC point P].=
<br>
<br>
Now Alice and Bob-- assuming they are both online and agree about the<br>
resolution of their contract-- can jointly form a 2 of 2 signature for<br>
P, and spend as if it were a payment to a single party (one of them<br>
just needs to add H(C||S) to their private key).<br>
<br>
Alternatively, the Taproot consensus rules would allow this script to<br>
be satisfied by someone who provides the network with C (the original<br>
combined pubkey), S, and does whatever S requires-- e.g. passes the<br>
CSV check and provides Bob&#39;s signature. With this information the<br>
network can verify that C + H(C||S) =3D=3D P.<br>
<br>
So in the all-sign case there is zero overhead; and no one can tell<br>
that the contract alternative exists. In the alternative redemption<br>
branch the only overhead is revealing the original combined pubkey<br>
and, of course, the existence of the contract is made public.<br>
<br>
This composes just fine with whatever other merkelized script system<br>
we might care to use, as the S can be whatever kind of data we want,<br>
including the root of some tree.<br>
<br>
My example shows 2-of-2 but it works the same for any number of<br>
participants (and with setup interaction any threshold of<br>
participants, so long as you don&#39;t mind an inability to tell which<br>
members signed off).<br>
<br>
The verification computational complexity of signature path is<br>
obviously the same as any other plain signature (since its<br>
indistinguishable). Verification of the branch redemption requires a<br>
hash and a multiplication with a constant point which is strictly more<br>
efficient than a signature verification and could be efficiently fused<br>
into batch signature validation.<br>
<br>
The nearest competitor to this idea that I can come up with would<br>
supporting a simple delegation where the output can be spent by the<br>
named key, or a spending transaction could provide a script along with<br>
a signature of that script by the named key, delegating control to the<br>
signed script. Before paying into that escrow Alice/Bob would<br>
construct this signature. This idea is equally efficient in the common<br>
case, but larger and slower to verify in the alternative spend case.<br>
Setting up the signature requires additional interaction between<br>
participants and the resulting signature must be durably stored and<br>
couldn&#39;t just be recomputed using single-party information.<br>
<br>
I believe this construction will allow the largest possible anonymity<br>
set for fixed party smart contracts by making them look like the<br>
simplest possible payments. It accomplishes this without any overhead<br>
in the common case, invoking any sketchy or impractical techniques,<br>
requiring extra rounds of interaction between contract participants,<br>
and without requiring the durable storage of other data.<br>
<br>
<br>
[1] <a href=3D"https://eprint.iacr.org/2018/068" rel=3D"noreferrer" target=
=3D"_blank">https://eprint.iacr.org/2018/<wbr>068</a><br>
[2] <a href=3D"https://blockstream.com/sidechains.pdf" rel=3D"noreferrer" t=
arget=3D"_blank">https://blockstream.com/<wbr>sidechains.pdf</a> Appendix A=
<br>
______________________________<wbr>_________________<br>
bitcoin-dev mailing list<br>
<a href=3D"mailto:bitcoin-dev@lists.linuxfoundation.org">bitcoin-dev@lists.=
<wbr>linuxfoundation.org</a><br>
<a href=3D"https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev" =
rel=3D"noreferrer" target=3D"_blank">https://lists.linuxfoundation.<wbr>org=
/mailman/listinfo/bitcoin-<wbr>dev</a><br>
</blockquote></div><br></div>

--089e0825821886de050563736b15--