summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Riard <antoine.riard@gmail.com>2020-06-12 19:45:35 -0400
committerbitcoindev <bitcoindev@gnusha.org>2020-06-12 23:45:50 +0000
commitc01ff78c22eb4f121f2b399e4df6c9e141f7e5f0 (patch)
treecaad89b5000baec6f3e3f50ca812fa786a5432d0
parent251e883ffe69954cedef027f43fdb39f91c93f38 (diff)
downloadpi-bitcoindev-c01ff78c22eb4f121f2b399e4df6c9e141f7e5f0.tar.gz
pi-bitcoindev-c01ff78c22eb4f121f2b399e4df6c9e141f7e5f0.zip
Re: [bitcoin-dev] CoinPool, exploring generic payment pools for Fun and Privacy
-rw-r--r--ea/75d0f925d67d1e0c5b92a04fcf053153d50d1f796
1 files changed, 796 insertions, 0 deletions
diff --git a/ea/75d0f925d67d1e0c5b92a04fcf053153d50d1f b/ea/75d0f925d67d1e0c5b92a04fcf053153d50d1f
new file mode 100644
index 000000000..e4bcfa396
--- /dev/null
+++ b/ea/75d0f925d67d1e0c5b92a04fcf053153d50d1f
@@ -0,0 +1,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--
+