I have noticed that Monero mixes are usually a bunch of very small txs and then a much larger one that accounts for almost the whole amount sent. I also hear talk that one should not be sending "unique" amounts. How does one correctly mix their transactions for larger amounts? I don't mean huge amounts, but a couple thousand xmrs.
2 Answers
Output selection is random, which accounts for the prevalance of outcomes such as the one you mention. Outputs are picked, until the accumulated sum reaches the amount to send plus the fee, and this target is a lot more likely to happen when adding a large output.
The unique amounts you speak of are the dusty complex amounts such as 0.000468709491, which are very specific (not split below 0.01), and are unlikely to have other amounts of the same value to mix with on the blockchain. Monero does not produce those anymore, but if you have any in an existing wallet, your best bet is to run sweep_unmixable
, which will consolidate them into nicer outputs which can mix.
There is no way to manually select outputs, so you can't change this without writing your own selection code, which is not recommended.
-
Thanks for your answer. Does this method of mixing (Monero default) make trxs more vulnerable to correlation attacks?– pl55Oct 10, 2016 at 8:10
-
1More vulnerable that which other method ? Recent simplewallet has code to prioritize using unrelated outputs, to lessen that problem (but of course fails to prevent it if, eg, you have only correlated outputs in the first place). Oct 10, 2016 at 8:16
-
Ok, so to summarize, besides the very small dust amounts, are there certain groups of amounts I should avoid, or will they all mix equally? Someone had suggested only "whole numbers" though that doesn't sound right.– pl55Oct 10, 2016 at 8:26
-
I have noticed that Monero mixes are usually a bunch of very small txs and then a much larger one that accounts for almost the whole amount sent.
Currently, Monero "mixing" works in such way that is it splits your amount into some denominations. Let's take a look at a random transaction.
You can see the total amount, and you can see how it's split into denominations. The 800 one kind of stands out, but you still don't know if it was change returned to the sender or part of the total funds sent to someone else.
In fact, every single denomination is "mixed" (made part of a ring signature with 4 other transactions) so you don't really know the origin of any one of them. Also, each one of them is sent to a different and unique one-time use destination (one-time public key), and you don't know which of those belong to one address and which to another.
If I understand well what user36303 wrote here about randomly selecting the outputs, the transaction might have been split into 400 + 300 + 100 + remainder as well, further obfuscating the amount transmitted, but in our case it just so happens that it was not. Also, the total amount transmitted also doesn't tell us much, because we don't know which of those denomination add up to change going back to the origniator. Also we don't know if the originator sent funds to just one or a few addresses, making this guessing game even more complex.
I also hear talk that one should not be sending "unique" amounts.
I don't see why that should be avoided as it gets split into denominations so you don't know how much was sent and how much returned to the originator. I believe it could only be related to these dust amounts, as mentioned by user36303. Those could give away some information because it's unlikely to get dust with the same combination of decimals as someone else, so they're likely getting mixed with old appearances of themselves. However, you still wouldn't be able to tell if this dust changed hands or it's still moving back and forth inside the same wallet.
How does one correctly mix their transactions for larger amounts?
From your wording, it looks like it's some action done interactively by the user but in fact it is not. It's performed automatically by the wallet for every transaction and it can pick any transaction to "mix" yours with.
If you want to ensure that your amount is split into more pieces, you could for instance create a transaction sending 1000 Monero to yourself in 10 outputs of 100. You could do this in one single command I believe, by using the CLI wallet. Then after, they'd get further combined or split, depending on what you would do next. I'm not very familiar with the transaction building alghoritm so can't really tell if there would be any benefit in doing so. You're free to experiment if you're interested to chase this idea further.
At the end, the code for ringCT is already written, and is bound to enable transactions with hidden amounts starting from early January. This will eliminate the need to split into denominations, and make everything more elegant and private.