I've heard that the standard client prioritizes which transaction to relay based on the Bitcoin Days Destroyed and the fee paid on the transaction, but what is the exact formula used to determine which transaction has higher priority? That is, how does the standard client prioritize which transaction to send to other nodes first?
The priority of a transaction is (the sum of (coin age in blocks * coin value in satoshis) over all the inputs in the transaction) divided by the size of the transaction in bytes.
It has 2 inputs (both of which have since been spent in other (confirmed) transactions rendering this transaction unconfirmable):
- one for 0.1005 BTC from block 165774
- one for 0.0995 BTC from block 165777
It is 439 bytes long, and has a priority of 432,232,688.
The most recent blocks in the blockchain is 175262 at the time of writing.
I sum the (age * values) for each transaction and divide by size. The
+ 1 is because transactions confirmed in the newest block are considered to have an age of 1, not 0:
>>> current_block = 175262 >>> ((current_block - 165774 + 1) * 0.1005e8 + (current_block - 165777 + 1) * 0.0995e8) / 439 432232687.92710704
As you can see, the priority of a transaction will go up as new blocks are found.
The rules for the Bitcoin.org client are to keep the first transaction in which a bitcoin address is spent and to discard without relaying any others that might arrive.
So the priority is based on chronological time of arrival.
There has been talk of variations that would allow a replacement transaction with a higher fee to supercede an earlier transaction that has not yet been confirmed.
And there is an attack vector that describes how this priority can be modified to facilitate double spending.