💡How does it work?

CLI and web app are not updated to use this approach yet

Joinstr protocl uses ALL| ANYONECANPAY SIGHASH flag and outputs are registered first. This reduces some steps and its implemented in the electrum plugin.

Coinjoin with less steps using ALL|ANYONECANPAY


The process is simple and involves only 3 steps because we have used SIGHASH_ALL | SIGHASH_ANYONECANPAY sighash flag. All the users publish a new address in the first step for output registration. It is followed by publishing PSBT which has 1 input and all outputs signed with ALL | ACP. These PSBTs are combined, finalized and broadcasted.

Users can decide the denomination, number of peers and nostr relays by creating pools.

See NIP for details about pools used in joinstr: https://gitlab.com/invincible-privacy/joinstr/-/blob/main/NIP.md


All users pay equal fees in every round which in total is used for transaction fees. Only 1 transaction is required for coinjoin and fees depends on the mempool when pool is created. Each user would pay approximately 2000 sats if 10 sat/vbyte fee rate is used for the coinjoin transaction. Participants can also use paid nostr relays although there needs to be at least 1 common relay between the participants for coordination to work properly.


A new public/private key pair is used for creating pools and sending join request. Everything else is communicated using an encrypted channel in which all peers use the same key. All peers in a pool use the same IP address for a coinjoin round and its implemented using Riseup VPN.

Sybil Resistance: It is still being researched and will be implemented in future version using autct which allows users to prove ownership of UTXO with certain amounts without revealing UTXO itself.


DoS vectors are reduced by using encrypted nostr channels for each round and encouraging users to try paid, private, custom nostr relays.

Further improvements will be made using cryptography in future versions which are still being researched.

Last updated