← Back to team overview

mimblewimble team mailing list archive

On fees


Hi all,

We've had this discussion informally in various form on Gitter and others, I thought I'd bring it here to summarize various arguments and get to a decision.

Transaction fees are mostly a mechanism to prevent transaction flooding. Space and bandwidth in a blockchain network are scarce resources and free transactions would lead to abuse. The cost of mirroring every transaction in such a network is borne by full nodes, however rewarding directly full nodes for that cost is a complex problem (i.e. not something we're going to do). An indirect way to reward full node operators is to "burn" transaction fees (or said differently, not rewarding them to miners). It accomplishes the double goal of:

- Making it costly enough to transact.
- Indirectly rewarding node operators by limiting dilution. The assumption is that people operating full nodes own some currency, especially for the larger holders who need most security.

A secondary use of transaction fees is to provide an ordering mechanism for transactions when capacity is limited. Users can express the urgency, or lack thereof, of their transactions by including larger or smaller fees. However, if fees are burnt, this mechanism disappears as miners do not get the fees and therefore only have a weak incentive to order. In the worst case scenario, users could be tempted to pay miners directly to have their transactions included, leading to a strong centralization pressure.

The common assertion that fees are also a mechanism to incentivize miners to include transactions in blocks is dubious at best. Miners have an economic incentive to include transactions regardless. There is a lot of evidence that they will do so, in some measure, even if it's non-economical (fees too low to pay for elevated orphan rate).

I've been thinking about this for some time and would like to propose the following rules:

- There is a minimum relay fee per transaction and minimum relay fee per output newly created (output_count - intput_count). We may want to refine this a little bit to account for varying sizes of the range proof but let's ignore that for now.
- Fees get burnt up to $REWARD.
- When the sum of all fees is above $REWARD, the overage gets added to the coinbase output (so coinbase=max($REWARD, sum(fees)).
- There is a limit on the number of new outputs a block can create.

This stays very simple while seemingly retaining all the properties we need. Any way you can think of this being broken?

- Igno

P.S. Thanks to John Tromp and Andrew Poelstra for bearing with me on multiple occasions on this topic.

Follow ups