What is this?

This is a bitcoin wallet designed around the idea of making every spend a coinjoin. I want it to do a coinjoin whenever you send money and I want it to only accept money from wallets who sent the money inside a coinjoin.

How can I try it out?

Click here (testnet only): https://brilliancebitcoin.github.io/void/

Why did you do this?

Mostly to dunk on monero people. Also because I care about people's privacy, especially my own, and current coinjoin wallets are too hard to use, I want something simple and easy, (I know, that's not what this wallet is yet, but I think the foundations are there. Have some patience and go use some other coinjoin wallet while you wait.)

Monero people show up in my twitter feed all the time touting their block explorer where each transaction hides the sender and the recipient. Well I figure if I make a wallet that only uses coinjoins, we can dunk back on them by showing them that bitcoin has the same thing. Use void wallet and all your transactions will hide the sender and the recipient, just like in monero.

Also, I'm not satisfied with the way coinjoins are done in bitcoin and I want to improve them. My chief criticisms are: the coordinators in samourai and wasabi can be targeted by law enforcement, which may scare people away from running the coordination software, and samourai and wasabi also prioritize or require rounded coinjoin amounts like 1 million sats, 100,000 sats, or 10 million sats, which makes it hard to use coinjoins for everyday payments. For those of you pointing out that joinmarket never had these problems, I know, I love joinmarket, but I don't think any current version of it works well on mobile, so it doesn't escape my criticism either.

Oh, I thought you did this because you don't like the fee structure in other coinjoin implementations

Oh yeah, I forgot about that. Samourai, wasabi, and joinmarket all make regular users pay someone to do a coinjoin, and samourai and wasabi also make you pay the coordinator when you want to add funds to the coinjoin pool. That all seems like maybe it's overkill. Ok it's probably not, there are good reasons for doing that, let me rephrase.

In samourai and wasabi, there is a semi-constant trickle of coinjoins every block or two, and people pay money to park their coins in that trickle and just basically coinjoin all the time. The same people, if they used joinmarket, would get paid to do that. And both of those models are popular with users. Isn't that a bit weird? Why are people happy to pay to constantly coinjoin when they can get paid to constantly coinjoin? I'm not sure, but it has a consequence that if I make that part free, I can use a "save more money" pitch in both directions:

If you want to park your coins somewhere where they will constantly coinjoin, void wallet gives you that for free, unlike samourai and wasabi. And if you just want to click "send" and know a coinjoin happened, void wallet is cheaper than any of the others, because in void wallet you just pay a mining fee, you don't have to pay a coordinator's fee or a market maker's fee.

Who is the coordinator in void wallet?

Your wallet acts as the coordinator whenever you hit the Send button. It creates a psbt, goes out to find other people who use this wallet, and invites them to be in the coinjoin. Then you pass your psbt back and forth with your invited coinjoiners until everyone has contributed some coins and cosigned the transaction. Then you broadcast the signed transaction. Since your wallet is the coordinator for your transactions, you don't have to pay anyone to do the coordination for you, and law enforcers have no central intermediary to target for enforcement. They'll never know who is coordinating what!

Where can I find more info?


Mostly to dunk on monero people

I can tell you that monero people say “THANK YOU”

This is what I’ve always wanted to see and wondered why it never existed

Nicely done. Should be fairly easy to convince xmr people to use this. But concerned about the reliance on nostr. How privacy preserving is it really? I heard they censor tor IPs because they have an unsolved spam issue. Plus linking utxos and communicating through the same nostr pubkey isn't good either.

Tony said... But concerned about the reliance on nostr. How privacy preserving is it really?

Very private if you make a conscious effort to use it privately, but I haven't done that. Nostr can be used as a cache for anonymous messages if you use a different pubkey for every message. I'm not doing that so I'm not using it in a very privacy conscious way. You can view every interaction with a market maker from initial contact through each psbt signature. You can't view the contents of those messages but you can pretty well guess their general contents because my codebase tells you the order in which messages are sent back and forth. Plus you can do timing analysis: after the final round of signatures you can watch the blockchain for a coinjoin's appearance, and then know exactly what coinjoin the market makers coordinated with the taker on. But even if you do all that you still won't know what outputs belong to whom. You'll just know the sender sent money to one of those outputs and that the other ones belong to market makers, but you won't know which is which, which is the really important thing that coinjoins are supposed to achieve.

Tony said... I heard they censor tor IPs because they have an unsolved spam issue.

Some relays do that, and those same relays also take your ip address and match it against a list of known spammer ip addresses. So if you want to use nostr privately (and, by extension, void), consider using a vpn. You should also connect it to your own node because right now it doxes all your bitcoin addresses to mempool.space, but I haven't written in any tools for connecting it to your own node so good luck!

Tony said... Plus linking utxos and communicating through the same nostr pubkey isn't good either.

Doing key rotation in nostr is pretty easy, I've done it for a prior project where I attacked a bunch of nostr relays with a load of spam. (Incidentally, that spam attack is also the reason why many of them now track ip addresses and block tor users, so in a sense it's all my fault.) It wouldn't be difficult to add that and thus make data tracking harder. As for linking utxos, the only way I know how to stop that is by learning how to do blind signatures. That sounds fun so maybe I'll do that next.

Thanks for the feedback Tony!

A problem with coinjoins is liquidity, I'm going with Samourai because whirlpool has great liquidity. It's an important criteria

It absolutely is an important criteria, maybe someday void will have similar liquidity but today is not that day.

I think so too. Coinjoins will be next level when it reaches critical mass of all transactions

Yeah because "go joinmarket you earn sats for providing liquidity" Have fun remixing with yourself. The truth is not so many people coinjoin, privacy is neglected for self custody it should be treated at same level

  • cj using nostr
  • mobile-friendly
  • everything is a cj
  • troll monero people

Checks a LOT of boxes. Looks neat! Great project!

lol yes, one goal was to check a lot of "this is cool" boxes

Projects like this are why I check this page everyday. Great work keep it up! Excited to give it a try soon.

Thanks Wil! I'm glad you like it

I hope to keep trying to make it better

This is incredibly nice! Are you planning to integrate taproot to lower the transaction fees?

I didn't plan on it but that's a great idea. The library I'm using for transaction preparation is bitcoinjs-lib and it wasn't updated to support taproot yet. I'm using a version that is compiled for the browser so when it is updated I'll need to recompile the library. It's honestly not a high priority for me.

Don't bother trying the seed, it's empty ;)

9k testnet sats are still there. You can take them if you really want them but I'm using them for testing so there's that.

Testnet is so cool 😎 really underappreaciated thing about the Bitcoin world 😎


Wonderful work, and thank you for sharing it here!

Fantastic work! Love to see advancements in privacy preserving tools 👏

I have 6000 sats on trap license mail skin attack cable evidence panther never virtual fruit cable and can not import it anywhere else.

Ah, the address tb1qf599fs22elt03zmrh2w8ww5snk8zcd5q80jm57 has been used many times already — that looks like testnet coins crowdfunding to start a new faucet :-)

Anyway. You'd better use Signet as you can abstract out of mining and will get much smoother block times (like on mainnet).

Another thing: The red animation is super ugly. I would not use it myself.

justsmile said... [I] can not import it anywhere else

Where did you try to import it? Did you see an error message of any kind?

justsmile said... the address tb1qf599fs22elt03zmrh2w8ww5snk8zcd5q80jm57 has been used many times already

Is that one of your addresses? Did you import a seed that's already in use by a faucet? I'm very confused

justsmile said... You'd better use Signet as you can abstract out of mining and will get much smoother block times (like on mainnet).

Maybe someday I'll start using signet and upgrade my name to Super Signet. But for now testnet works great for me.

justsmile said... The red animation is super ugly. I would not use it myself.

Yeah I found it by just googling "red loading gif" and then I slowed down the coolest one I found (this one: https://i.gifer.com/origin/36/36527397c208b977fa3ef21f68c0f7b2_w200.gif). Eventually I'll probably pay someone on fiverr to make a proper HD gif that looks more like what I want. I want it to look like a red giant star is eclipsed by a black hole so you can only see the swirling red outer edge of the red giant.

"I want it to look like a red giant star is eclipsed by a black hole"

I wonder what that would look like in reality... probably really cool with the gravitational lensing.

I fully support this concept. However bitcoiners need to be aware of the risks of using coinjoins. If your sats have gone through a coinjoin, analytics will know and whom ever you spend your sats with may decide their too risky. This effectively discounts your sats since they’re “dirty”. This is all due to the tornado cash sanctions.

I don't think that holds.

Even if you don't coinjoin yourself how certain are you that the previous person didn't? What about the guy before him? If it's only about the last step then just doing a 1-hop to yourself solves it. If they check n steps then you just need n+1 hops.

In reality the more users coinjoin the more all coins become "tainted" and then trying to discount them is pointless.

What if some wallet support your address format but doesn't do coinjoins after that

This is almost like creating an altcoin inside bitcoin

Wow, looks nice! Thank you!

Thanks for sharing