Hi ZmnSCPxj,
> I have not studied the proposal in close detail yet, but anyway, my main takeaway roughly is:
>
> * The core of CoinPool is some kind of multiparticipant (N > 2) offchain update mechanism (Decker-Wattenhofer or Decker-Russell-Osuntokun).
> * The output at each state of the update mechanism is some kind of splitting construction (which I have not studied in detail).
> * At each update of the state, all participants must sign off on the new state.
Overall, that's a really accurate description. I would add you can embed a funding outpoint of any offchain protocol on the splitting construction, modulo some timelocks shenanigans.
> In order to hide transfers from the elected WabiSabi server, participants can maintain two coins in every state, and move coins randomly across the two coins they own at each state update, in order to hide "real" transfers from the elected server.
Yes I'm quite sure you can reuse WabiSabi as a communication channel between participants, assuming you support tapscript and merkle branch transports, and server build a tree. Generally, we tried to keep design as flexible as we can to reuse privacy tools.
> Indeed, from what I can understand, in order to properly set up the splitting transactions in the first place, at each state every participant needs to know how much each other participant actually owns in the CoinPool at that point in time.
Yes, that's part of future research, defining better *in-pool* observer. Sadly, right now, even if you use mask construction inside, it's quite easy to trace leaves by value weight. Of course, you can enforce equal-value leaves, as for a regular onchain CoinJoin. I think it comes with a higher onchain cost in case of pool breakage.
> That way, output addresses can be to fresh pseudonyms of the participant, removing all linkages of participant to amount they own, and each participant can maintain multiple outputs per state for their own purposes and to mildly obscure exactly how much they own in total.
That's right that an in-pool observer may learn a link between an exit and an onchain withdraw. There is a future optimization, if you can swap your withdraw with an already onchain output, therefore breaking heuristics.
> We can do this by using `SIGHASH_ANYPREVOUT` to force whoever performs a unilateral close of the CoinPool to pay the onchain fees involved, so that it would have to be a good reason indeed to perform a unilateral close.
Absolutely, for the fee structure, as the withdraw output is at the discretion of user, I was thinking some CPFP. There is maybe a better solution, haven't spend that much on the exact adequate, incentives-align mechanism beyond a "withdraw-must-pay-its-fees".
Thanks for the high-quality review, as usual ;)
Antoine