Can someone explain to me how taint would be calculated?
Say we have three inputs:
In1 - 1 BTC
In2 - 1 BTC from output marked as tainted
In3 - 2 BTC
And three outputs:
Out1 - 2 BTC
Out2 - 1.5 BTC
Tx fee (leftover): 0.5 BTC
So we now have three new outputs, Out1, Out2, and Coinbase of the block which contains the Tx and thus gets the Tx fee.
What is the "taint level" of each output? I haven't seen a demonstration of a way to calculate it that isn't easily exploitable.
Excellent question. I don't think there is one single "right" answer that always works. Depending on the severity of the crime, the size of the transaction, the time passed since the crime, and many other factors people will apply different methods. One might even try to follow the transaction fee, as someone might use that to launder his Bitcoins by issuing a transaction whose fee is 100% and mining the block himself.
Here are a number of approaches:
Full taint: every output of a transaction involving tainted coins gets fully tainted as well. One might even want to taint the transaction fee the miner gets from the theft-transaction. This is the most radical approach and only makes sense when trying to track down a once-in-a-decade scale crime. Applied to your example, all outputs as well as the transaction fee would be considered tainted.
Diluted taint: works like dirty water. You start with 100% dirty coins and dilute them as they get combined with clean coins. In your example, the transaction's outputs would be 25% dirty, including the transaction fee. Combined with the other say 99 BTC mined in that block, the miner would get 1% dirty coins. Note that in this case it is reasonable to have a closer look at the miner since a 0.5 BTC transaction fee is somewhat suspicious. If the acceptable dirtiness of a coin is 0.1%, then it takes 999 clean BTC to launder 1 dirty BTC.
Compact taint: here, we try to keep the tainted coins together by applying some more or less random rules to artificially separate the tainted coins from the rest. In your example, one could say that Out2 will take the tainted coin (consisting of 1 dirty and 0.5 clean BTC). The rule behind this is that the tainted coins are always assigned to the output such that dilution is (locally) minimized. So normally, it would go to the smalles output that is at least as large as the amount of tainted coins. You might be bothered by this rule being somewhat unpredictable and random. However, the goal here is not to have a philosophically pure solution, but to find a pragmatist rule to say who is responsible to clean the mess. In your example, it would give the recipient of the 1.5 BTC the responsibility to get the Bitcoins into a clean state again (e.g. by helping to track down the thief). It might not be entirely fair, but effective. It's a little like the rule "the last one leaving the building locks the doors", which also works even though it does not assign that piece of work very fairly considering that it might always be the same one leaving last.
There might be other mechanisms to handle taint. I don't think it is necessary to stick to a specific one. Each blacklist-providing service might apply their own heuristics, depending on the type of crime they are after. Unlike Mike, I don't think we need an elaborate technical solution here. A simple API like "how tainted is address X" is ok in most cases, even though it reveals the fact that someone is interested in that address to the provider. The provider will notice that anyway when a transaction involving that address appears in the block chain.
The "private set intersection" proponents have found a very sophisticated hammer, and now they are desperately looking for a nail.