Avatar
Super Testnet
2183e94758481d0f124fbd93c56ccaa45e7e545ceeb8d52848f98253f497b975
Open source dev w/ bitcoin focus | supertestnet.org bc1qefhunyf8rsq77f38k07hn2e5njp0acxhlheksn

Everyone saying filters "don't work" because spammers are just using op_return_bot to get around them? Yeah, op_return_bot has to charges double the regular fee rate or its bypass doesn't work reliably. This is a huge deterrent. The filters work.

Source: https://github.com/benthecarman/OP-RETURN-Bot/blob/master/app/controllers/InvoiceMonitor.scala

Replying to Avatar ManyKeys

nostr:nprofile1qqszrqlfgavys8g0zf8mmy79dn92ghn723wwawx49py0nqjn7jtmjagpz4mhxue69uhkummnw3ezummcw3ezuer9wchszyrhwden5te0dehhxarj9ekk7mf0qy88wumn8ghj7mn0wvhxcmmv9uynmh4h your efforts are appreciated.

I'm still waiting for hedgehog based wallet, any progress on that?

Lete know when you plan your next bitcoin script session, I'd love to join.

I got tired of working on hedgehog and moved on to other things

Maybe some day I'll get back to it

I do not currently plan to do any more workshops

There are four ways to create an invoice with a "decoy" node id:

- I used lnproxy.org to "wrap" my invoice so that instead of "my" node id appearing there, lnproxy's appeared there

- you can also toggle the "blinded paths" option in LND or Zeus Wallet. Among other things, that option replaces your node id with a dummy key

- you can also use TransLND or Valet Wallet, which have an optional feature where they will create a decoy pubkey for all of your invoices by pretending that your node is a routing node and the "real" recipient is a node it just made up

- you can also use Voltage or my Zaplocker software, which have an option to wrap all invoices so that all inbound payments to your wallet appear to go to Voltage's node or the Zaplocker server, even though they really get forwarded to the recipient

Also, it is worth pointing out that even without doing any of this, the public key in an LN invoice does not actually receive money, it is only used to sign communication messages.

As a result, it does not reveal which node it belongs to unless that node's network address and channels are gossipped via the LN gossip protocol, and that only happens if it is a routing node. A simple wallet with ungossipped channels does not reveal the network address of the node that controls it, so the pubkey in an LN invoice cannot be used by itself to find your node.

Turns out it was dumb, because I forgot that you have to commit to data to the control block in a prior tx, so in that sense it's just as bad as an inscription. You could get around this by putting the data in the taproot annex, but that is non standard so it would also require relaxing the anti-spam rules, which I don't want to do.

Apparently, Citrea decided not to put their spam in inscriptions because inscriptions have to be "unwrapped" in a second transaction. When the data is less than ~150 bytes, it's cheaper to put it in unspendable outputs, despite getting no witness discount.

I think they could get the witness discount and still avoid a second transaction by putting the spam in the control block. It lets you add up to ~520 bytes of spam by encoding your data as merkle leaves, each of which can be 32 bytes. No extra tx required, AND you get the witness discount.

If a node guessed it was the full amount passing thru it would be right most of the time. If many transactions are passing through large hubs (because they are well connected and require less hops to the destination = more likely to succeed and cheaper) an adversary could collect quite a lot of info on the network. But sure it existing gives some plausible deniability. If it was made default that would be even better.

>"Monero also requires trusting that the other 14 keys are not held by the same entity or cooperate to deanon you."

You mean 15 decoys? That only applies to senders and every spend exponentially decreases the likelihood of being denon'd. Also, you don't have to trust others not being the same entity/colluding for reciever or amount privacy on Monero (both technically possible with LN if the nodes on your routes are colluding, but very unlikely)

>"This is true for any privacy system and impossible to avoid."

It's not true. Cryptographic accumulators are not really affected by the problem you describe because you're proving you're one of the global set of all transactions instead of a tiny subset - which is what will FCMP be.

I've been around many different Monero communities/forums/groups for years and I've never heard Coinomi before. Not sure who recommended it to you but that is not the norm at all. It's usually Cake, Monerujo, Feather, or the GUI/CLI.

Yes, scanning can be annoying, but that is what guarantees no one but you can see your transactions (any proper LN privacy wallet, like Zeus, also requires scanning). If you use it somewhat often it's not really a big deal. Wallets with periodic background scanning make this a non-problem. You are always caught up (or very close). You should check it out on Cakes new update. It's very new so I'm sure in time more wallets will adopt it.

The only Monero wallet left that holds users viewkeys to eliminate sync time, at the cost of some privacy, is Exodus I believe. There used to be another one MyMonero but it's been defunct for quite a long time.

Block filters only help privacy when querying, not when broadcasting a transaction.

Not sure what you meant by the last part. Generally more people using something means a larger anonymity set.

I've grown to appreciate Lightning more, but there are a lot of nuances to both. We could talk about them forever.

> Multi path payments is optional for every wallet I've tried that even has it available

Which wallets have you tried? It's built into LND and turned on by default. So any wallets based on LND should just do it.

E.g. most custodial wallets as well as most nodes-in-a-box (Umbrel, Start9, etc.), plus many mobile phones like Breez, Zeus, Blixt, Bitkit, and ShockWallet.

Multipath payments are also turned on in electrum by default and I suspect they are turned on in the other implementations by default too

My hope is that people would mostly use it for legal stuff but I'd also like to see bibles on there wherever that's banned

Replying to Avatar Super Testnet

Most darknet markets (DNMs) are designed poorly in the following ways:

# 1. Hosting

Most DNMs use a model whereby merchants fill out a form to create their listings, and the data they submit then gets hosted on the DNM's servers. In scenarios where a "legal" website would be forced to censor that content (e.g. a DMCA takedown order), DNMs, of course, do not obey. This can lead to authorities trying to find the DNM's servers to take enforcement actions against them. This design creates a single point of failure.

A better design is to outsource hosting to third parties. Let merchants host their listings on nostr relays, not on the DNM's server. The DNM should only be designed as an open source interface for exploring listings hosted elsewhere, that way takedown orders end up with the people who actually host the listings, i.e. with nostr relays, and not with the DNM itself. And if a nostr relay DOES go down due to enforcement action, it does not significantly affect the DNM -- they'll just stop querying for listings from that relay in their next software update, because that relay doesn't work anymore, and only query for listings from relays that still work.

# 2. Moderation

Most DNMs have employees who curate the listings on the DNM. For example, they approve/deny listings depending on whether they fit the content policies of the website. Some DNMs are only for drugs, others are only for firearms. The problem is, to approve a criminal listing is, in the eyes of law enforcement, an act of conspiracy. Consequently, they don't just go after the merchant who made the listing but the moderators who approved it, and since the moderators typically act under the direction of the DNM, this means the police go after the DNM itself.

A better design is to outsource moderation to third parties. Let anyone call themselves a moderator and create lists of approved goods and services. Merchants can pay the most popular third party moderators to add their products to their lists. The DNM itself just lets its users pick which moderators to use, such that the user's choice -- and not a choice by the DNM -- determines what goods and services the user sees in the interface.

That way, the police go after the moderators and merchants rather than the DNM itself, which is basically just a web browser: it doesn't host anything or approve of any content, it just shows what its users tell it to show. And if a popular moderator gets arrested, his list will still work for a while, but will gradually get more and more outdated, leading someone else to eventually become the new most popular moderator, and a natural transition can occur.

# 3. Escrow

Most DNMs offer an escrow solution whereby users do not pay merchants directly. Rather, during the Checkout process, they put their money in escrow, and request the DNM to release it to the merchant when the product arrives, otherwise they initiate a dispute. Most DNMs consider escrow necessary because DNM users and merchants do not trust one another; users don't want to pay for a product first and then discover that the merchant never ships it, and merchants don't want to ship a product first and then discover that the user never pays for it.

The problem is, running an escrow solution for criminals is almost certain to get you accused of conspiracy, money laundering, and unlicensed money transmission, so the police are likely to shut down any DNM that does this. A better design is to oursource escrow to third parties. Let anyone call themselves an escrow, and let moderators approve escrows just like they approve listings. A merchant or user who doesn't trust the escrows chosen by a given moderator can just pick a different moderator. That way, the police go after the third party escrows rather than the DNM itself, which never touches user funds.

# 4. Consequences

Designing a DNM along these principles has an interesting consequence: the DNM is no longer anything but an interface, a glorified web browser. It doesn't host any content, approve any listings, or touch any money. It doesn't even really need a server -- it can just be an HTML file that users open up on their computer or smart phone. For two reasons, such a program is hard to take down:

First, it is hard for the police to justify going after the DNM, since there are no charges to bring. Its maintainers aren't doing anything illegal, no more than Firefox does anything illegal by maintaining a web browser that some people use to browse illegal content. What the user displays in the app is up to them, not to the code maintainers. Second, if the police decided to go after the DNM anyway, they still couldn't take it down because it's just an HTML file -- the maintainers do not even need to run a server to host the file, because users can share it with one another, eliminating all single points of failure.

Another consequence of this design is this: most of the listings will probably be legal, because there is more demand for legal goods and services than illegal ones. Users who want to find illegal goods would pick moderators who only approve those listings, but everyone else would use "legal" moderators, and the app would not, at first glance, look much like a DNM, just a marketplace for legal goods and services. To find the illegal stuff that lurks among the abundant legal stuff, you'd probably have to filter for it via your selection of moderators, making it seem like the "default" mode is legal.

# 5. Conclusion

I think this DNM model is far better than the designs that prevail today. It is easier to maintain, harder to take down, and pushes the "hard parts" to the edges, so that the DNM is not significantly affected even if a major merchant, moderator, or escrow gets arrested. I hope it comes to fruition.

Nate says:

"I don't understand why it matters how blocks get filled. Use lightning for basic spending if you want to use bitcoin as money. If you can't afford to, use ecash until you can. As for ease of running a node, a 4tb drive gets cheaper everyday. should be good for a decade or two."

Everything after the first sentence seems spot on. Also, I like the idea of reducing the cost of using lightning so that poor people can acquire self custody faster. Creating multiple channels in a single utxo seems like a promising way to do that.

https://x.com/beeforbacon1/status/1917881581257023528

Let's suppose Dave wants to pay John, and passes through these nodes: Edna, Filbert, Gena, Harry, Isabella, John

Harry decides he wants to collude with the other routing nodes to find out who sent the payment. So he walks backward: he contacts Gena, and says, "Did you initiate the payment?" Gena says, "No, I forwarded it from Filbert." So they both go to Filbert, who says, "Wasn't me, I forwarded it from Edna." So they both go to Edna, who says, "Wasn't me, I forwarded it from Dave." So they both go to Dave, and ask him, "Did you initiate the payment?"

Dave has a few options. He can, for example, say nothing. Silence doesn't prove he initiated the payment; it only proves he doesn't want to answer. Maybe Dave is a routing node with a good privacy policy.

Here's another option I just thought of: it would be fun to write some software that makes it easy for Dave to spin up a perfectly valid node for Carol, who is a fake person who Dave invented out of thin air, and make it look like she forwarded the payment to Dave. Then Dave could say, "Wasn't me, I forwarded it from Carol." Then, if they go to "Carol" (who is really Dave, but they don't know that), he can spin up a node for Bob and just keep doing that, leading them on a neverending goose chase.

Suppose that the bad guys give on on trying to find the source (Dave) and seek the destination (John) instead. Harry can ask Isabella if she forwarded it to anyone, and she might say, "Yes, I forwarded it to John." Then he and Isabella might ask John and he lie and might say, "Yes, I forwarded it to Kelly," and spin up a node for her so Kelly (who is really John) can "prove" it, or he might just not answer. Either way, the colluding routing nodes have no idea who the sender or the recipient is: they just know that at some point people stop answering, and that might be for a variety of reasons. Refusing to answer a cabal of routing nodes does not prove you are the sender or the recipient.

By the way, since routing nodes are run by a variety of people and most of them do not have contact forms or any sort of formal policy about how to contact them if you want to collude with them, I think it's very unlikely that Harry would get an answer in the first place from Edna, Filbert, Gena, Harry, or Isabella. But even if he somehow did and every routing node colluded, they still can't identify the sender or the recipient.

> He's wrong about unencrypted receiver (or meant something else)

I meant what I said: monero does not encrypt the receiver. If it did, monero devs could tell me what encryption standard they use (in lightning, we use the Sphinx encryption standard specified in bolt4) and they could point me to the code where the recipient's key gets encrypted (in lightning, that code is here: https://github.com/lightningnetwork/lnd/blob/b068d79dfbd2f583d890fd605953d0d4fb897a27/htlcswitch/hop/iterator.go#L114)

Monero does not encrypt the recipient's public key -- it gets published in plaintext on the blockchain -- so the protocol does not specify any encryption standard for that and there is nothing in the codebase where it gets encrypted.

I like that I can point out how lightning fixes a privacy attack vector and the response is "ok but it doesn't fix ALL attack vectors -- there's probably some other one it's vulnerable to."

Yeah, probably. But even if other attack vectors exist, that's no reason not to fix this one. I think monero should fix it too, and I am glad FCMP is being worked on to hopefully do that.

> You sure it's final? So is it still there?

I am not sure anymore, but I don't think that matters. By "final destination" I don't mean" it never moved again." When I "arrive at my final destination" via Google Maps, it does not imply that I will never leave that place. It just means I am done moving for purposes of that trip. When I sent my money to you, the "trip" was getting the money into your address. I know I did that, so the trip was finished -- it got to its final destination. If you moved it out again afterwards, that is a separate trip and is unrelated to mine.

> How are you sure the address on my profile is mine either?

I don't. But I know it's the one you told me, so that's good enough for me.

> I trying to understand lightning privacy more.

Great! I hope I can help.

> When I provide someone with a lightning invoice do I not reveal to them my lightning node?

No. Lightning invoices only contain a pubkey, they do not tell them which node is yours, for which they also need an ip address, and lightning invoices do not expose ip addresses. If, however, you run a routing node on clearnet, then they can look up your ip address, because routing nodes gossip that information along with their pubkey and their channels.

Also worth pointing out: if you opt to use blinded paths in your lightning invoice, the pubkey in that invoice does not belong to you. And the use of blinded paths is undetectable, so there's no way to know if a particular invoice is using it, meaning there is no way to know if the pubkey in any lightning invoice belongs to the real recipient -- it may just belong to one of the routing nodes and there is no way to find out.

> if I have even been sent sats from a KYC exchange or have otherwise linked my lightning node to myself for example through displaying a LNURL am I not doxed?

No, for the reasons pointed out above: there is no way for the service you used to know if the pubkey in your lightning invoice belongs to you, and even if they did know that, it is not linked to your node, because to link it to your node they also need to know your node's ip address, which is not shared when creating an invoice or when making a payment. Though if you are running a routing node on clearnet, then they do know it.

> Not just the current transaction but all future invoices can be linked to me?

No, because they don't know if the pubkey in your lightning invoices belongs to you, and moreover, you can use blinded paths to make it a different pubkey every time. If your wallet does not support blinded paths, you can use lnproxy.org to do it manually.

> From a node ID I can see all channels as well as a list of any closed channels and see all of the on chain BTC associated with that and follow their flows on the base chain

No. Only routing nodes gossip their channels. If you're running a regular node, your channels are not gossipped, and your node is also not gossipped, so someone with that invoice cannot map your node to your channels. They cannot find your node, and although there are techniques to find ungossiped channels, I am not aware of any techniques for finding ungossipped nodes or mapping ungossipped channels to them.

> Is my understanding correct and if so that makes lightning seem problematic to me for privacy.

I hope this clarification has helped.

> Is the point I am missing that the node ID in the invoice could be set up to just forward the payment to someone else? Is there a special way to create an invoice that does this?

Yes, many wallets do this by default:

- if you use Voltage LSP, it does this by default

- if you use Zeus wallet, you can enable it in two ways: either toggle the Zaplocker option, or toggle the Blinded Paths option

- if you use Coinos, you can enable it via the bolt12 option

- if you use Phoenix, you can enable it via the bolt12 option

- if you use any other wallet and it doesn't support bolt12 or Blinded Paths, you can use lnproxy.org to do it

> doesn't mean law enforcement couldn't subpoena large node operators (?)

They could *try* to subpoena large node operators, but thankfully, routing nodes do not know the destination either. This is because the onion protocol lightning uses is designed so that routing nodes don't know their position in the route. Consequently, they do not know which node is the last hop, and cannot identify the recipient, who is the node after that.

I answer most of these criticisms in the attached post.

One that I don't go over there is this one: "he slips in 'total balance' (he can't do the equivalent of this with Monero either)"

I can. The total balance of a "one time pubkey" on monero is never higher than its initial balance. It can get lower, but only if that address has shown up in a ring sig later. When I made that post, it hadn't shown up in a ring sig yet, and I know this because it didn't have 10 confirmations yet when I made the post, and monero doesn't let you spend an output til it has 10 confirmations. I have not checked to see if it has been used in a ring sig yet, but if it hasn't, then I know its balance is still the amount I put in it.

nostr:note1pjsqetvr45nklmz9el4a4fk0excg2hv63cp4m9le6fzksqdg3zlsemzvem