The Issue: If you only own outputs in a short span of blocks and you spend them, the mixin partners (the fake outputs / ring partners) will be different for each of the outputs and have a blockchain temporal pattern that suggests which inputs are real.

For instance, in this transaction, it can be observed that in each of the 5 inputs, there is 1 output used that was created in the 2016-07-18 to 2016-07-22 date range.

enter image description here

Now, while it is not entirely possible to know that the most recent inputs are the real ones, it is highly probable that they are the real ones and could therefore be used to trace coins.

So the questions.

How will this be addressed in the future?

How can monero users avoid the issue now?


There are three main ways to fix this.

The first one is to attempt to select outputs which are unrelated, if possible. This only works if you are sending an amount of monero that can be represented with unrelated outputs. This means that if you have received a single payment, you won't be able to select unrelated inputs, since they're all related - unless one single input in that transaction is enough. This is partly taken care of by https://github.com/moneromooo-monero/bitmonero/commit/90fb5e411307a949779c65a1931f3462ee3a564d, which selects unrelated inputs first, before falling back to related ones. However, this can only work if you have enough unrelated outputs.

The second one is to add "streaming payments" to Monero. These would split a payment into multiple transactions, such that each transaction has a single input, and these transactions are randomly distributed in time, so they can't be linked together. This is a bit complicated, since it requires the recipient to have a concept of "not received, partly received, received", and it requires things like the wallet staying up long term so that transactions may be emitted over time.

The third one is to select fake outputs to be clustered around each real output. I'm not sure this really achieves the purpose. It might look good visually on the graph (ie, you can't see obvious correlations), but I think a computer will still see correlations just fine.

Once RingCT is in, this problem will also become less acute, since transactions will typically require less inputs, as amounts will not be split by denominations anymore. Howerver, it will still exist to some lesser extent, and that's the reason the patch above was made (and could be improved, I suppose, but it's unclear how right now).

tl;dr: just waiting a bit will fix most of it.


One option would be modifying the selection algorithm so that it selects ring partners in a similar date range to your own outputs. Then all of the transactions in your ring would be from the same date range, rendering this sort of analysis useless. RingCT will make this sort of solution a lot more practical, as the presence of correct output denominations will no longer be an issue.


I'm not sure how this can/will be addressed in the future, but a few ways to avoid the issue now are:

  1. Mine some coins in addition to buying them. If you mine even a half a coin per week, that slow trickle of coins into your wallet will produce outputs spread out over time.
  2. If you make a large purchase of coins, then don't withdraw them all at once. If you make withdrawals spread out over a period of weeks, then the outputs in your wallet will also be spread out over that time period.
  3. Alternatively, if you withdraw all your coins from an exchange at once (or use shapeshift), you can set up multiple wallets, and send a small fraction of your total balance between wallets once a week or month to generate outputs that are spread out over time.

I don't think any of these options will completely mitigate this issue, and you will pay some cost either in terms of electricity for mining or transaction fees for moving coins around, but if it's something you are concerned about I think these are probably the best options at the moment.

Your Answer

