summaryrefslogtreecommitdiff
path: root/ea/75d0f925d67d1e0c5b92a04fcf053153d50d1f
blob: e4bcfa39612134e18a3b9176669b6531f513b20e (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
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
Return-Path: <antoine.riard@gmail.com>
Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])
 by lists.linuxfoundation.org (Postfix) with ESMTP id 57FE9C016F
 for <bitcoin-dev@lists.linuxfoundation.org>;
 Fri, 12 Jun 2020 23:45:50 +0000 (UTC)
Received: from localhost (localhost [127.0.0.1])
 by silver.osuosl.org (Postfix) with ESMTP id 419BF204ED
 for <bitcoin-dev@lists.linuxfoundation.org>;
 Fri, 12 Jun 2020 23:45:50 +0000 (UTC)
X-Virus-Scanned: amavisd-new at osuosl.org
Received: from silver.osuosl.org ([127.0.0.1])
 by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id UrlASySVYy5T
 for <bitcoin-dev@lists.linuxfoundation.org>;
 Fri, 12 Jun 2020 23:45:47 +0000 (UTC)
X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6
Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com
 [209.85.216.46])
 by silver.osuosl.org (Postfix) with ESMTPS id 8F92020387
 for <bitcoin-dev@lists.linuxfoundation.org>;
 Fri, 12 Jun 2020 23:45:47 +0000 (UTC)
Received: by mail-pj1-f46.google.com with SMTP id i4so4521186pjd.0
 for <bitcoin-dev@lists.linuxfoundation.org>;
 Fri, 12 Jun 2020 16:45:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=mime-version:references:in-reply-to:from:date:message-id:subject:to
 :cc; bh=weAoqVOAmm7tCizrWXpmcNIXiqhT2aH60RhP4OUGKxo=;
 b=AiQ4P64tXpN6YdnHn9yGZEpxYKaEsEWFdhPnERFUMHEvhiLW98GC5TTM76Vw3Kb04f
 k80LGHR8FIgBV1SjnUem4rsYLsTI2NXRmF7dOlZbhc+A7IlpEV1847dc9NBTbJeDkkqq
 8jwP2gg3oLmf8QFKfPj8vImVm9085gHn2gR3we7eS33jhL/9fNjarsBKxINcSzFLF1Ge
 HiJ5oEX58Uy0jYCNYa/+P+2mIMlAurtn5gkH46xGdpvu102XFmmM415i94wQOBR7q3xd
 rQRRPfMdi8CkQPT76WhttcJWkH+wS6oSg1CaEmerM6iHdkdl/aS2Mj4ES3E66mdRPMPq
 yeGA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:mime-version:references:in-reply-to:from:date
 :message-id:subject:to:cc;
 bh=weAoqVOAmm7tCizrWXpmcNIXiqhT2aH60RhP4OUGKxo=;
 b=mSY40rrzUV5CiYuuTQb1hEEVNc7tnrTVxnFbpKbq+3TmItaWhS0Sz1xT46v7W0m9PU
 VkG1BhWBUtqSrMkeXW245s0m9Kogdcg2o74o/sofNDRYpHIAq8OE0tvS+Au9l+1TQazI
 xJUQrLWe3SpY0DBlHjqiPnFxW/4KkMHcbWoSLcyIVksHBmLlRbhmYYiiXcb2SiLVccDc
 YzqxXg2qWQ8WqioML7liExICDmxMqGGKkg+YpphRRt04f5Ro6iG0aXSQ3zqMXJWFRljD
 svDi2uzzHt7bPbIzsQcl1UfwP4zrh7BMFsAuvuy+tgtEEgOjbqDJB9XnPZK0Qu3AJz7M
 wyfQ==
X-Gm-Message-State: AOAM531bJs54NgAX/bcw49uc8XGchBXzL1Z/T0RFMmpJEKJMIvEFnUXS
 u/QnttCnT4scq/PzMoUTt6PvUalMI2q3/Y2HvJs=
X-Google-Smtp-Source: ABdhPJyBqZ+/QgZIEGmgwJobKsYLraqfwoLgKAcUTu4lSEXEK0p6T/G6Dk6/79oS/y4Fp5t8P4xA4mN8DfYJckU5Qtg=
X-Received: by 2002:a17:902:b286:: with SMTP id
 u6mr13160765plr.264.1592005546981; 
 Fri, 12 Jun 2020 16:45:46 -0700 (PDT)
MIME-Version: 1.0
References: <CALZpt+FqAWCAqCLF2HsajL84sOvst_X9_34bb_tvUxLFw=HTAA@mail.gmail.com>
 <CAD5xwhjkstCcF49s8r8ZqVH77VmWXaZSm=_sx=FKZuCj6Ci_UA@mail.gmail.com>
In-Reply-To: <CAD5xwhjkstCcF49s8r8ZqVH77VmWXaZSm=_sx=FKZuCj6Ci_UA@mail.gmail.com>
From: Antoine Riard <antoine.riard@gmail.com>
Date: Fri, 12 Jun 2020 19:45:35 -0400
Message-ID: <CALZpt+Ec+K4oGXVexLikGKbGgcZ=AF+Spskx5SK-Om-HzuAAmg@mail.gmail.com>
To: Jeremy <jlrubin@mit.edu>
Content-Type: multipart/alternative; boundary="0000000000001bbd7805a7ebada4"
X-Mailman-Approved-At: Fri, 12 Jun 2020 23:46:36 +0000
Cc: Bitcoin Protocol Discussion <bitcoin-dev@lists.linuxfoundation.org>
Subject: Re: [bitcoin-dev] CoinPool,
 exploring generic payment pools for Fun and Privacy
X-BeenThere: bitcoin-dev@lists.linuxfoundation.org
X-Mailman-Version: 2.1.15
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: Fri, 12 Jun 2020 23:45:50 -0000

--0000000000001bbd7805a7ebada4
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi Jeremy,

For the records, I didn't know between Greg and you was at the origin of
payment pools. Thanks for your pioneer work here, obviously this draws
inspiration from OP_CTV use cases and Channel Factories works, even if we
picked up different assumptions and tried to address another set of issues.

With regards to scalability, I hit it on my own while inquiring
covenanted-Bitcoin contracts for international trade. I mentioned the
any-order issue on such multi-party complex contracts in a talk last summer
(https://github.com/ariard/talk-slides/blob/master/advanced-contracts.pdf).

> All of these channels can be constructed and set up non-interatively usin=
g
> CTV, and updated interactively. By default payments can happen with
minimal
> coordination of parties by standard lightning channel updates at the leaf
> nodes, and channels can be rebalanced at higher layers with more
> participation.

Side review note on OP_CTV: I think it would be great to define
non-interactivity better, namely at least between 3 phases: establishment,
operation, closing.

Even OP_CTV protocols assume interactivity at establishment, at least 1) to
learn payees pubkeys endpoint (and internal leaves pubkeys if you want
update at operation) 2) validate transaction tree correctness between
participants.

At operation, it depends if participants want to dynamically rebalance
value across channels or not. If you desire dynamically rebalancing, assume
internal leaves scriptpubkeys are (multisig-all OR OP_CTV'ed merkle_tree).
Using OP_CTV is a saving in message rounds for every constant expression
across tree updates.

At closing, depends again if participants have committed update keys or
not. If dynamic update, you can prune the whole tree and just commit final
balances onchain, either with a O(N) fan-out transaction (N outputs) or a
O(log(N)) congestion tree (N transactions).

So I would say the originality of a hashchain covenant like OP_CTV is to
provide onchain *immutability* (unforgeability?) of the offchain
transaction tree and thus provides instant finality to payees. You can get
the same semantic with off-chain covenant, pre-signed set of transactions,
assuming more communications rounds and performance hit.

That said, IMO, immutability comes with a security trade-off, namely if any
payout key committed in your OP_CTV tree gets compromised your funds are at
stake. And you can't update the tree anymore at the root to rotate keys. I
think this should be weighted by anyone designing covenant protocols,
especially vaults.

> I don't think the following requirement: "A
> CoinPool must satisfy the following *non-interactive any-order withdrawal=
*
> property: at any point in time and any possible sequence of previous
> CoinPool events, a participant should be able to move their funds from th=
e
> CoinPool to any address the participant wants without cooperation with
> other CoinPool members." is desirable in O(1) space.

With current design (Pool_tx+Split_tx) it's O(2) space. Pool_tx is similar
to a commitment tx and thus enables off-chain novation of pool distribution=
.

> Let's be favorable to Accumulators and assume O(1), but keep in mind
constant may
> be somewhat large/operations might be expensive in validation for updates=
.

Using a Merkle Tree as an accumulator should be constant-size in space, but
likely it has to be O(log(N) in computation (N set elements). This overhead
in computation should be accounted for in accumulator sigops to avoid
network validation resources free-riding, but I think it's a better
trade-off minimizing chain footprint.

> So in this context, CTV Pool has a clear benefit. The last recipient can
> always clear in Log(N) time whereas in the accumulator pool, the last
> recipient has to wait much much longer. There's no asymptotic difference
in
> Tx Size, but I suspect that CTV is at least as good or cheaper since it's
> just one tx hash and doesn't depend on implementation.

Yes I agree CTV pool performs better in the worst-case scenario. In my
opinon what we should really look on is the probability of withdrawal
scenarios. I see 2 failure cases:
* a pool participant being offline, thus halting the pool
* a pool participant with external protocol requirement to fulfill, like a
HTLC to timeout onchain

With regards to 1) we assume that watchtower infra are likely to become
ubiquitous in the future (if you want a secure LN experience), so user
uptime should be near to 100%. Of course,  it's a new architecture which
comes with trade-offs, but interesting to explore.

With regards to 2) as of today channel-failure-rate (like unilateral close)
it's still quite important (30% IIRC) so it plays in favor of OP_CTV pool
but in the future I expect single-digit
therefore making CoinPool far more competitive. Do we envision protocol
more time-sensitive than LN in the future (atomic swaps...) ? Hard to gauge=
.

Do you see other ways to refine model, like integrating out-of-pool
liquidity needs rate ?

Note, I think for OP_CTV tree, increasing radix increases cooperation
requirement and failure, so there should be optimum somewhere.

> If your group is not cooperating because one
> person is permanently offline, then Accumulator pools *guarantee* you nee=
d
> to go through a full on-chain redemption.

That's right, that's a current shortcoming of this strawman design, I think
you can avoided by adding some timelocks, "if Alice doesn't anwser after X
days, initiate a kick-out", thus avoiding full onchain unrolling.

> But I'm unclear how
> to make this safe w.r.t. updated states. You could also allow, perhaps,
any
> number of operators to simultaneously leave in a tx. Also not sure how to
> do that.

I'm still thinking on this too, especially in LN-context, ideally you do
want the same thing to kick-out a HTLC of your HTLC-tree while preserving
the rest of them. Technically it works, if you assume CSV delay on the
commitment/pool_tx and locktime on the HTLC, which is Eltoo tradeoff.

> With Accumulator pools, you need all parties online to make payments.

I think that our shortcoming here, but technically with protocol rebinding
on any withdrawal output of Split_tx, you can have M-of-N channels between
pool participants. Also we should aim to support any kind of protocol at
the leaves.

> Because Accumulator pools always require N signers, it's possible to buil=
d
> a better privacy model where N parties are essentially managing a chaumia=
n
> ecash like server for updates, giving good privacy of who initiated
> payments.

Yes that what I've in mind is something with blind signatures or any
obfuscation of pool tree construction as privacy optimization. Still you
will leak value weight of leaves to an in-pool observer.

> Both protocols require new features in Bitcoin. CTV is relatively simple,
I
> would posit that accumulators + sighashnoinput are relatively not simple.

I agree design, review, deployment costs are an order of magnitude higher.
That said they are more powerful primitives which would cover use cases
beyond pools. A concern with OP_CTV is if we want semantic extensions we
may realize they don't rank that well compared to more generic "base"
primitives.

> In both designs, the payment pool can be created non-interactively. This
is
> *super* important as it means third parties (e.g., an exchange) can
> withdraw users funds *into* a payment pool.

See my point above, I think we need a better definition of
non-interactivity.

Thanks for the high-quality review of CoinPool !

Antoine

Le jeu. 11 juin 2020 =C3=A0 13:21, Jeremy <jlrubin@mit.edu> a =C3=A9crit :

> Stellar work Antoine and Gleb! Really excited to see designs come out on
> payment pools.
>
> I've also been designing some payment pools (I have some not ready code I
> can share with you guys off list), and I wanted to share what I learned
> here in case it's useful.
>
> In my design of payment pools, I don't think the following requirement: "=
A
> CoinPool must satisfy the following *non-interactive any-order withdrawal=
*
> property: at any point in time and any possible sequence of previous
> CoinPool events, a participant should be able to move their funds from th=
e
> CoinPool to any address the participant wants without cooperation with
> other CoinPool members." is desirable in O(1) space. I think it's much
> better to set the requirement to O(log(n)), and this isn't just because o=
f
> wanting to use CTV, although it does help.
>
> Let me describe a quick CTV based payment pool:
>
> Build a payment pool for N users as N/2 channels between participants
> created in a payment tree with a radix of R, where every node has a
> multisig path for being used as a multi-party channel and the CTV branch
> has a preset timeout. E.g., with radix 2:
>
>                                       Channel(a,b,c,d,e,f,g,h)
>                                      /                                   =
\
>                Channel(a,b,c,d)
> Channel(e,f,g,h)
>                     /
> \                                                    /                 \
> Channel(a,b)    Channel(c,d)                          Channel(e,f)
> Channel(g,h)
>
>
> All of these channels can be constructed and set up non-interatively usin=
g
> CTV, and updated interactively. By default payments can happen with minim=
al
> coordination of parties by standard lightning channel updates at the leaf
> nodes, and channels can be rebalanced at higher layers with more
> participation.
>
>
> Now let's compare the first-person exit non cooperative scenario across
> pools:
>
> CTV-Pool:
> Wait time: Log(N). At each branch, you must wait for a timeout, and you
> have to go through log N to make sure there are no updated states. You ca=
n
> trade off wait time/fees by picking different radixes.
> TXN Size: Log(N) 1000 people with radix 4 --> 5 wait periods. 5*4 txn
> size. Radix 20 --> 2 wait periods. 2*20 txn size.
>
> Accumulator-Pool:
> Wait Time: O(1)
> TXN Size: Depending on accumulator: O(1), O(log N), O(N) bits. Let's be
> favorable to Accumulators and assumer O(1), but keep in mind constant may
> be somewhat large/operations might be expensive in validation for updates=
.
>
>
> This *seems* like a clear win for Accumulators. But not so fast. Let's
> look at the case where *everyone* exits non cooperatively from a payment
> pool. What is the total work and time?
>
> CTV Pool:
> Wait time: Log(N)
> Txn Size: O(N) (no worse than 2x factor overhead with radix 2, higher
> radixes dramatically less overhead)
>
> Accumulator Pool:
> Wait time: O(N)
> Txn Size: O(N) (bear in mind *maybe* O(N^2) or O(N log N) if we use an
> sub-optimal accumulator, or validation work may be expensive depending on
> the new primitive)
>
>
> So in this context, CTV Pool has a clear benefit. The last recipient can
> always clear in Log(N) time whereas in the accumulator pool, the last
> recipient has to wait much much longer. There's no asymptotic difference =
in
> Tx Size, but I suspect that CTV is at least as good or cheaper since it's
> just one tx hash and doesn't depend on implementation.
>
> Another property that is nice about the CTV pool style is the bisecting
> property. Every time you have to do an uncooperative withdrawal, you spli=
t
> the group into R groups. If your group is not cooperating because one
> person is permanently offline, then Accumulator pools *guarantee* you nee=
d
> to go through a full on-chain redemption. Not so with a CTV-style pool, a=
s
> if you have a single failure among [1,2,3,4,5,6,7,8,9,10] channels (let's
> say channel 8 fails), then with a radix 4 setup your next steps are:
> [1,2,3,4,5,6,7,8,9,10]
> [1,2,3,4,5,6,7,X,9,10]
> [1,2,3,4] [5,6,7,X] [9,10]
> [1,2,3,4] 5 6 7 X [9,10]
>
> So you only need to do Log(N) chain work to exit the bad actor, but then
> it amortizes! A future failure (let's say of 5) only causes 5 to have to
> close their channel, and does not affect anyone else.
>
> With an accumulator based pool, if you re-pool after one failure, a secon=
d
> failure causes another O(N) work. So then total work in that case is
> O(N^2). You can improve the design by making the evict in any order optio=
n
> such that you can *kick out* a member in any order, that helps solve some
> of this nastiness (rather than them opting to leave). But I'm unclear how
> to make this safe w.r.t. updated states. You could also allow, perhaps, a=
ny
> number of operators to simultaneously leave in a tx. Also not sure how to
> do that.
>
>
>
> Availability:
> With CTV Pools, you can make a payment if just your immediate conterparty
> is online in your channel. Opportunistically, if people above you are
> online, you can make channel updates higher up in the tree which have
> better timeout properties. You can also create new channels, binding
> yourself to different parties if there is a planned exit.
>
> With Accumulator pools, you need all parties online to make payments.
>
>
> Cooperation Case:
> CTV Pools and Accumulator pools, in a cooperative case, both just act lik=
e
> a N of N multisig.
>
> Privacy:
> Because Accumulator pools always require N signers, it's possible to buil=
d
> a better privacy model where N parties are essentially managing a chaumia=
n
> ecash like server for updates, giving good privacy of who initiated
> payments. You *could* do this with CTV pools as well, but I expect users =
to
> prefer making updates at the 2 party channel layer for low latency, and t=
o
> get privacy benefits out of the routability of the channels and ability t=
o
> connect to the broader lightning network.
>
>
> Technical Complexity:
> Both protocols require new features in Bitcoin. CTV is relatively simple,
> I would posit that accumulators + sighashnoinput are relatively not simpl=
e.
>
> The actual protocol design for CTV pools is pretty simple and can be
> compatible with LN, I already have a rudimentary implementation of the
> required transactions (but not servers).
>
>
> Interactivity:
>
> In both designs, the payment pool can be created non-interactively. This
> is *super* important as it means third parties (e.g., an exchange) can
> withdraw users funds *into* a payment pool.
>
>
> Thanks for reading!
>
> Jeremy
>
>
>
> --
> @JeremyRubin <https://twitter.com/JeremyRubin>
> <https://twitter.com/JeremyRubin>
>
>

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

<div dir=3D"ltr"><div>Hi Jeremy,<br><br>For the records, I didn&#39;t know =
between Greg and you was at the origin of payment pools. Thanks for your pi=
oneer work here, obviously this draws inspiration from OP_CTV use cases and=
 Channel Factories works, even if we picked up different assumptions and tr=
ied to address another set of issues.<br><br>With regards to scalability, I=
 hit it on my own while inquiring covenanted-Bitcoin contracts for internat=
ional trade. I mentioned the any-order issue on such multi-party complex co=
ntracts in a talk last summer (<a href=3D"https://github.com/ariard/talk-sl=
ides/blob/master/advanced-contracts.pdf">https://github.com/ariard/talk-sli=
des/blob/master/advanced-contracts.pdf</a>).<br><br>&gt; All of these chann=
els can be constructed and set up non-interatively using<br>&gt; CTV, and u=
pdated interactively. By default payments can happen with minimal<br>&gt; c=
oordination of parties by standard lightning channel updates at the leaf<br=
>&gt; nodes, and channels can be rebalanced at higher layers with more<br>&=
gt; participation.<br><br>Side review note on OP_CTV: I think it would be g=
reat to define non-interactivity better, namely at least between 3 phases: =
establishment, operation, closing.<br><br>Even OP_CTV protocols assume inte=
ractivity at establishment, at least 1) to learn payees pubkeys endpoint (a=
nd internal leaves pubkeys if you want update at operation) 2) validate tra=
nsaction tree correctness between participants.<br><br>At operation, it dep=
ends if participants want to dynamically rebalance value across channels or=
 not. If you desire dynamically rebalancing, assume internal leaves scriptp=
ubkeys are (multisig-all OR OP_CTV&#39;ed merkle_tree). Using OP_CTV is a s=
aving in message rounds for every constant expression across tree updates.<=
br><br>At closing, depends again if participants have committed update keys=
 or not. If dynamic update, you can prune the whole tree and just commit fi=
nal balances onchain, either with a O(N) fan-out transaction (N outputs) or=
 a O(log(N)) congestion tree (N transactions). <br><br>So I would say the o=
riginality of a hashchain covenant like OP_CTV is to provide onchain *immut=
ability* (unforgeability?) of the offchain transaction tree and thus provid=
es instant finality to payees. You can get the same semantic with off-chain=
 covenant, pre-signed set of transactions, assuming more communications rou=
nds and performance hit.<br><br>That said, IMO, immutability comes with a s=
ecurity trade-off, namely if any payout key committed in your OP_CTV tree g=
ets compromised your funds are at stake. And you can&#39;t update the tree =
anymore at the root to rotate keys. I think this should be weighted by anyo=
ne designing covenant protocols, especially vaults.<br><br>&gt; I don&#39;t=
 think the following requirement: &quot;A<br>&gt; CoinPool must satisfy the=
 following *non-interactive any-order withdrawal*<br>&gt; property: at any =
point in time and any possible sequence of previous<br>&gt; CoinPool events=
, a participant should be able to move their funds from the<br>&gt; CoinPoo=
l to any address the participant wants without cooperation with<br>&gt; oth=
er CoinPool members.&quot; is desirable in O(1) space.<br><br>With current =
design (Pool_tx+Split_tx) it&#39;s O(2) space. Pool_tx is similar to a comm=
itment tx and thus enables off-chain novation of pool distribution.<br><br>=
&gt; Let&#39;s be favorable to Accumulators and assume O(1), but keep in mi=
nd constant may<br>&gt; be somewhat large/operations might be expensive in =
validation for updates.<br><br>Using a Merkle Tree as an accumulator should=
 be constant-size in space, but likely it has to be O(log(N) in computation=
 (N set elements). This overhead in computation should be accounted for in =
accumulator sigops to avoid network validation resources free-riding, but I=
 think it&#39;s a better trade-off minimizing chain footprint.<br><br>&gt; =
So in this context, CTV Pool has a clear benefit. The last recipient can<br=
>&gt; always clear in Log(N) time whereas in the accumulator pool, the last=
<br>&gt; recipient has to wait much much longer. There&#39;s no asymptotic =
difference in<br>&gt; Tx Size, but I suspect that CTV is at least as good o=
r cheaper since it&#39;s<br>&gt; just one tx hash and doesn&#39;t depend on=
 implementation.<br><br>Yes I agree CTV pool performs better in the worst-c=
ase scenario. In my opinon what we should really look on is the probability=
 of withdrawal scenarios. I see 2 failure cases:<br>* a pool participant be=
ing offline, thus halting the pool<br>* a pool participant with external pr=
otocol requirement to fulfill, like a HTLC to timeout onchain<br><br>With r=
egards to 1) we assume that watchtower infra are likely to become ubiquitou=
s in the future (if you want a secure LN experience), so user uptime should=
 be near to 100%. Of course,=C2=A0 it&#39;s a new architecture which comes =
with trade-offs, but interesting to explore.<br><br>With regards to 2) as o=
f today channel-failure-rate (like unilateral close) it&#39;s still quite i=
mportant (30% IIRC) so it plays in favor of OP_CTV pool but in the future I=
 expect single-digit<br>therefore making CoinPool far more competitive. Do =
we envision protocol more time-sensitive than LN in the future (atomic swap=
s...) ? Hard to gauge.<br><br>Do you see other ways to refine model, like i=
ntegrating out-of-pool liquidity needs rate ?<br><br>Note, I think for OP_C=
TV tree, increasing radix increases cooperation requirement and failure, so=
 there should be optimum somewhere.<br><br>&gt; If your group is not cooper=
ating because one<br>&gt; person is permanently offline, then Accumulator p=
ools *guarantee* you need<br>&gt; to go through a full on-chain redemption.=
<br><br>That&#39;s right, that&#39;s a current shortcoming of this strawman=
 design, I think you can avoided by adding some timelocks, &quot;if Alice d=
oesn&#39;t anwser after X days, initiate a kick-out&quot;, thus avoiding fu=
ll onchain unrolling.<br><br>&gt; But I&#39;m unclear how<br>&gt; to make t=
his safe w.r.t. updated states. You could also allow, perhaps, any<br>&gt; =
number of operators to simultaneously leave in a tx. Also not sure how to<b=
r>&gt; do that. <br><br>I&#39;m still thinking on this too, especially in L=
N-context, ideally you do want the same thing to kick-out a HTLC of your HT=
LC-tree while preserving the rest of them. Technically it works, if you ass=
ume CSV delay on the commitment/pool_tx and locktime on the HTLC, which is =
Eltoo tradeoff.<br><br>&gt; With Accumulator pools, you need all parties on=
line to make payments.<br><br>I think that our shortcoming here, but techni=
cally with protocol rebinding on any withdrawal output of Split_tx, you can=
 have M-of-N channels between pool participants. Also we should aim to supp=
ort any kind of protocol at the leaves.<br><br>&gt; Because Accumulator poo=
ls always require N signers, it&#39;s possible to build<br>&gt; a better pr=
ivacy model where N parties are essentially managing a chaumian<br>&gt; eca=
sh like server for updates, giving good privacy of who initiated<br>&gt; pa=
yments.<br><br>Yes that what I&#39;ve in mind is something with blind signa=
tures or any obfuscation of pool tree construction as privacy optimization.=
 Still you will leak value weight of leaves to an in-pool observer.<br><br>=
&gt; Both protocols require new features in Bitcoin. CTV is relatively simp=
le, I<br>&gt; would posit that accumulators + sighashnoinput are relatively=
 not simple.<br><br>I agree design, review, deployment costs are an order o=
f magnitude higher. That said they are more powerful primitives which would=
 cover use cases beyond pools. A concern with OP_CTV is if we want semantic=
 extensions we may realize they don&#39;t rank that well compared to more g=
eneric &quot;base&quot; primitives.<br><br>&gt; In both designs, the paymen=
t pool can be created non-interactively. This is<br>&gt; *super* important =
as it means third parties (e.g., an exchange) can<br>&gt; withdraw users fu=
nds *into* a payment pool.<br><br>See my point above, I think we need a bet=
ter definition of non-interactivity.<br><br>Thanks for the high-quality rev=
iew of CoinPool !<br><br>Antoine<br></div></div><br><div class=3D"gmail_quo=
te"><div dir=3D"ltr" class=3D"gmail_attr">Le=C2=A0jeu. 11 juin 2020 =C3=A0=
=C2=A013:21, Jeremy &lt;<a href=3D"mailto:jlrubin@mit.edu">jlrubin@mit.edu<=
/a>&gt; a =C3=A9crit=C2=A0:<br></div><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);paddin=
g-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" =
style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0=
,0,0)">Stellar work Antoine and Gleb! Really excited to see designs come ou=
t on payment pools.</div><div class=3D"gmail_default" style=3D"font-family:=
arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div=
 class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;fo=
nt-size:small;color:rgb(0,0,0)">I&#39;ve also been designing some payment p=
ools (I have some not ready code I can share with you guys off list), and I=
 wanted to share what I learned here in case it&#39;s useful.</div><div cla=
ss=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-s=
ize:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D=
"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">I=
n my design of payment pools, I don&#39;t think the following requirement: =
&quot;A CoinPool must satisfy the following *non-interactive any-order=20
withdrawal* property: at any point in time and any possible sequence of=20
previous CoinPool events, a participant should be able to move their=20
funds from the CoinPool to any address the participant wants without=20
cooperation with other CoinPool members.&quot; is desirable in O(1) space. =
I think it&#39;s much better to set the requirement to O(log(n)), and this =
isn&#39;t just because of wanting to use CTV, although it does help.</div><=
div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif=
;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" s=
tyle=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,=
0,0)">Let me describe a quick CTV based payment pool:</div><div class=3D"gm=
ail_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:smal=
l;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-fa=
mily:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Build a p=
ayment pool for N users as N/2 channels between participants created in a p=
ayment tree with a radix of R, where every node has a multisig path for bei=
ng used as a multi-party channel and the CTV branch has a preset timeout. E=
.g., with radix 2:</div><div class=3D"gmail_default" style=3D"font-family:a=
rial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div =
class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;fon=
t-size:small;color:rgb(0,0,0)">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Channel(a,b,c,d,e,f,g,h)</div><div class=3D"=
gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:sm=
all;color:rgb(0,0,0)">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 /=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 \<=
br></div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,=
sans-serif;font-size:small;color:rgb(0,0,0)">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Channel(a,b,c,d)=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Channel(e,f,g,h)</div><div class=3D"gmail=
_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;c=
olor:rgb(0,0,0)">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /=C2=A0=C2=A0=C2=
=A0 \=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 /=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 \<br></div><div class=3D"gmail_default=
" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb=
(0,0,0)">Channel(a,b)=C2=A0=C2=A0=C2=A0 Channel(c,d)=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Channel(e,f)=C2=A0=
=C2=A0=C2=A0 Channel(g,h)</div><div class=3D"gmail_default" style=3D"font-f=
amily:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></di=
v><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-se=
rif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default=
" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb=
(0,0,0)">All of these channels can be constructed and set up non-interative=
ly using CTV, and updated interactively. By default payments can happen wit=
h minimal coordination of parties by standard lightning channel updates at =
the leaf nodes, and channels can be rebalanced at higher layers with more p=
articipation.</div><div class=3D"gmail_default" style=3D"font-family:arial,=
helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=
=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-siz=
e:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"f=
ont-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Now=
 let&#39;s compare the first-person exit non cooperative scenario across po=
ols:</div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica=
,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail=
_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;c=
olor:rgb(0,0,0)">CTV-Pool:<br></div><div class=3D"gmail_default" style=3D"f=
ont-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Wai=
t time: Log(N). At each branch, you must wait for a timeout, and you have t=
o go through log N to make sure there are no updated states. You can trade =
off wait time/fees by picking different radixes.</div><div class=3D"gmail_d=
efault" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;col=
or:rgb(0,0,0)">TXN Size: Log(N) 1000 people with radix 4 --&gt; 5 wait peri=
ods. 5*4 txn size. Radix 20 --&gt; 2 wait periods. 2*20 txn size.</div><div=
 class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;fo=
nt-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" styl=
e=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0=
)">Accumulator-Pool:</div><div class=3D"gmail_default" style=3D"font-family=
:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Wait Time: O(=
1)</div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,s=
ans-serif;font-size:small;color:rgb(0,0,0)">TXN Size: Depending on accumula=
tor: O(1), O(log N), O(N) bits. Let&#39;s be favorable to Accumulators and =
assumer O(1), but keep in mind constant may be somewhat large/operations mi=
ght be expensive in validation for updates.</div><div class=3D"gmail_defaul=
t" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rg=
b(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-family:arial=
,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div clas=
s=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-si=
ze:small;color:rgb(0,0,0)">This *seems* like a clear win for Accumulators. =
But not so fast. Let&#39;s look at the case where *everyone* exits non coop=
eratively from a payment pool. What is the total work and time?<br></div><d=
iv class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;=
font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" st=
yle=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0=
,0)">CTV Pool:</div><div class=3D"gmail_default" style=3D"font-family:arial=
,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Wait time: Log(N)</=
div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-=
serif;font-size:small;color:rgb(0,0,0)">Txn Size: O(N) (no worse than 2x fa=
ctor overhead with radix 2, higher radixes dramatically less overhead)<br><=
/div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans=
-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_defa=
ult" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:=
rgb(0,0,0)">Accumulator Pool:</div><div class=3D"gmail_default" style=3D"fo=
nt-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Wait=
 time: O(N)</div><div class=3D"gmail_default" style=3D"font-family:arial,he=
lvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Txn Size: O(N) (bear i=
n mind *maybe* O(N^2) or O(N log N) if we use an sub-optimal accumulator, o=
r validation work may be expensive depending on the new primitive)</div><di=
v class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;f=
ont-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" sty=
le=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,=
0)"><br></div><div class=3D"gmail_default" style=3D"font-family:arial,helve=
tica,sans-serif;font-size:small;color:rgb(0,0,0)">So in this context, CTV P=
ool has a clear benefit. The last recipient can always clear in Log(N) time=
 whereas in the accumulator pool, the last recipient has to wait much much =
longer. There&#39;s no asymptotic difference in Tx Size, but I suspect that=
 CTV is at least as good or cheaper since it&#39;s just one tx hash and doe=
sn&#39;t depend on implementation.<br></div><div class=3D"gmail_default" st=
yle=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0=
,0)"><br></div><div class=3D"gmail_default" style=3D"font-family:arial,helv=
etica,sans-serif;font-size:small;color:rgb(0,0,0)">Another property that is=
 nice about the CTV pool style is the bisecting property. Every time you ha=
ve to do an uncooperative withdrawal, you split the group into R groups. If=
 your group is not cooperating because one person is permanently offline, t=
hen Accumulator pools *guarantee* you need to go through a full on-chain re=
demption. Not so with a CTV-style pool, as if you have a single failure amo=
ng [1,2,3,4,5,6,7,8,9,10] channels (let&#39;s say channel 8 fails), then wi=
th a radix 4 setup your next steps are:</div><div class=3D"gmail_default" s=
tyle=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,=
0,0)">[1,2,3,4,5,6,7,8,9,10] <br></div><div class=3D"gmail_default" style=
=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)=
">[1,2,3,4,5,6,7,X,9,10] </div><div class=3D"gmail_default" style=3D"font-f=
amily:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">[1,2,3,4=
] [5,6,7,X] [9,10] </div><div class=3D"gmail_default" style=3D"font-family:=
arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">[1,2,3,4] 5 6 =
7 X [9,10] </div><div class=3D"gmail_default" style=3D"font-family:arial,he=
lvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=
=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-siz=
e:small;color:rgb(0,0,0)">So you only need to do Log(N) chain work to exit =
the bad actor, but then it amortizes! A future failure (let&#39;s say of 5)=
 only causes 5 to have to close their channel, and does not affect anyone e=
lse.</div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica=
,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail=
_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;c=
olor:rgb(0,0,0)">With an accumulator based pool, if you re-pool after one f=
ailure, a second failure causes another O(N) work. So then total work in th=
at case is O(N^2). You can improve the design by making the evict in any or=
der option such that you can *kick out* a member in any order, that helps s=
olve some of this nastiness (rather than them opting to leave). But I&#39;m=
 unclear how to make this safe w.r.t. updated states. You could also allow,=
 perhaps, any number of operators to simultaneously leave in a tx. Also not=
 sure how to do that.<br></div><div class=3D"gmail_default" style=3D"font-f=
amily:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></di=
v><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-se=
rif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default=
" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rgb=
(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-family:arial,=
helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Availability:</div><=
div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif=
;font-size:small;color:rgb(0,0,0)">With CTV Pools, you can make a payment i=
f just your immediate conterparty is online in your channel. Opportunistica=
lly, if people above you are online, you can make channel updates higher up=
 in the tree which have better timeout properties. You can also create new =
channels, binding yourself to different parties if there is a planned exit.=
 <br></div><div class=3D"gmail_default" style=3D"font-family:arial,helvetic=
a,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmai=
l_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;=
color:rgb(0,0,0)">With Accumulator pools, you need all parties online to ma=
ke payments.</div><div class=3D"gmail_default" style=3D"font-family:arial,h=
elvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=
=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;font-siz=
e:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"f=
ont-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Coo=
peration Case:</div><div class=3D"gmail_default" style=3D"font-family:arial=
,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">CTV Pools and Accum=
ulator pools, in a cooperative case, both just act like a N of N multisig.<=
/div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans=
-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_defa=
ult" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:=
rgb(0,0,0)">Privacy:</div><div class=3D"gmail_default" style=3D"font-family=
:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Because Accum=
ulator pools always require N signers, it&#39;s possible to build a better =
privacy model where N parties are essentially managing a chaumian ecash lik=
e server for updates, giving good privacy of who initiated payments. You *c=
ould* do this with CTV pools as well, but I expect users to prefer making u=
pdates at the 2 party channel layer for low latency, and to get privacy ben=
efits out of the routability of the channels and ability to connect to the =
broader lightning network.</div><div class=3D"gmail_default" style=3D"font-=
family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></d=
iv><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-s=
erif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_defaul=
t" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rg=
b(0,0,0)">Technical Complexity:</div><div class=3D"gmail_default" style=3D"=
font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Bo=
th protocols require new features in Bitcoin. CTV is relatively simple, I w=
ould posit that accumulators=C2=A0+ sighashnoinput are relatively not simpl=
e.</div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,s=
ans-serif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_d=
efault" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;col=
or:rgb(0,0,0)">The actual protocol design for CTV pools is pretty simple an=
d can be compatible with LN, I already have a rudimentary implementation of=
 the required transactions (but not servers).<br></div><div class=3D"gmail_=
default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;co=
lor:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-family=
:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div><di=
v class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-serif;f=
ont-size:small;color:rgb(0,0,0)">Interactivity:</div><div class=3D"gmail_de=
fault" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;colo=
r:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-family:a=
rial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">In both designs=
, the payment pool can be created non-interactively. This is *super* import=
ant as it means third parties (e.g., an exchange) can withdraw users funds =
*into* a payment pool.<br></div><div class=3D"gmail_default" style=3D"font-=
family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></d=
iv><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-s=
erif;font-size:small;color:rgb(0,0,0)"><br></div><div class=3D"gmail_defaul=
t" style=3D"font-family:arial,helvetica,sans-serif;font-size:small;color:rg=
b(0,0,0)">Thanks for reading!</div><div class=3D"gmail_default" style=3D"fo=
nt-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br>=
</div><div class=3D"gmail_default" style=3D"font-family:arial,helvetica,san=
s-serif;font-size:small;color:rgb(0,0,0)">Jeremy<br></div><div class=3D"gma=
il_default" style=3D"font-family:arial,helvetica,sans-serif;font-size:small=
;color:rgb(0,0,0)"><br></div><div class=3D"gmail_default" style=3D"font-fam=
ily:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br></div>=
<div class=3D"gmail_default" style=3D"font-family:arial,helvetica,sans-seri=
f;font-size:small;color:rgb(0,0,0)"><br clear=3D"all"></div><div><div dir=
=3D"ltr"><div dir=3D"ltr">--<br><a href=3D"https://twitter.com/JeremyRubin"=
 target=3D"_blank">@JeremyRubin</a><a href=3D"https://twitter.com/JeremyRub=
in" target=3D"_blank"></a></div></div></div><br></div></div>
</blockquote></div>

--0000000000001bbd7805a7ebada4--