** Motivation **
As everyone already knows, over the last seven months or so, the size of the
mempool as well as transaction fees of on the bitcoin network have both been
abnormally high. This tend has generally been ascribed to the introduction of
ordinals, and while this may be both technically and actually true,
disregarding the debate of whether ordinals is a "valid use" or the blockchain
or not, the specific patterns we are seeing for some of these transactions have
been making me somewhat suspicious that there could be other underlying
motivations for this trend.
Crucially, as other people have noted, the dust UTXOs these ordinals
transactions leave behind combined with the fact that consolidation
transactions are being priced out due to persistent high fees is also causing
the size of the UTXO set to blow up. As you can see on the chart below, on
April 30 2023 there were roughly 90M UTXOs, while as of this writing roughly 7
months later, there are more than 140M. Practically, this means that over the
course of the last year, the chainstate as stored by Bitcoin Core has increased
from ~5GB to ~9GB.
See https://www.blockchain.com/explorer/charts/utxo-count - the 3Y chart makes
the sudden change in the rate of increase very obvious. More than twice the
number of UTXOs has been added in the last six months than in the preceding two
and a half years.
While it is certainly not constant, if you watch the fee rates and timing of
when transactions are broadcast using a live view of the mempool like
mempool.space, you can see that especially during periods of low mempool influx
like early mornings on weekends, there tends to be large bursts (often several
hundred kvB worth) of tiny ordinals/BRC-20 transactions with a single dust UTXO
broadcast right after each block is found, with a fee set moderately higher
than the current average of the top of the mempool, which makes it highly
likely that this is done by a single actor. There may of course be legitimate
explanations for these patterns, like that they are simply taking advantage of
the lower fees, but the impression they leave me is that they seem deliberately
timed and priced to pad blocks during such periods to prevent the mempool from
draining, under the guise of "minting" BRC-20 tokens.
For example, in the two-minute span between blocks #820562 and #820563 from
Sunday December 10th, over a thousand of these transactions were broadcast:
https://mempool.space/block/000000000000000000015d5065ea2ade8bfd0bb9483835c907e34dd969854345
https://mempool.space/block/000000000000000000001ae267367ade834627df7b119a2710091b3f5d8c1a88
Most of these transactions have been in the 30-60 sat/vB range, with occasional
periods of increasingly higher-fee transactions going higher. The morning of
Saturday December 16th is a good example of the latter, where there was an ~8
hour flood where the fees were pushed all the way up to 700 sat/vB. These are
particularly suspicious, seeing as it would not make much sense to "take
advantage of lower fees" by flooding transactions with fees increasingly and
systematically set this much higher than the best next-block fee at this time
of the week. There are many blocks during this period with noticeable large
clusters of these high-fee BRC-20 transactions - for example, see #821428 and
#821485:
https://mempool.space/block/000000000000000000011dd74372ff2d5fdec5e7431340a160b0304f3f145e82
https://mempool.space/block/00000000000000000000653a2389a42549943c859e414f451f86944ac60b411b
You would think that if someone were in fact making a large volume of
transactions specifically to inflate the transaction fees, they would
eventually run out of funds to do so. In other words, considering how long this
trend has been going on, they would either need to have exceptionally deep
pockets, or directly profit from the transaction fees being high. This line of
thought lead me to consider the possibility that such patterns could be
indicative of ongoing fee manipulation by either a large miner or a consortium
of miners, and whether such manipulation could be practically profitable, even
with a minority hashrate. While miners have always had the ability to pad their
own blocks with junk transactions, it seems to be generally assumed that at the
very least there would be an opportunity cost of doing so, and that it would
therefore would be unprofitable. The general ability to pad all blocks with
junk transactions would of course both be much more severe and much less
obvious. So if this were the case, I believe it would break a fundamental
assumption to the design of Bitcoin - seeing as transaction fees are central to
prevent DoS attacks on the blockchain, if such an attack could be done in a way
where both the base costs and opportunity costs are fully (or more than)
recouped, we have a problem.
Just to be clear - I'm not saying with any certainty that such an attack is
currently ongoing, has taken place in the past, or will take place in the
future. Providing hard evidence of such would be difficult or impossible, so
this should be considered pure conjecture based on circumstantial evidence. As
such, seeing as conspiracy theories are generally unhelpful, I will ultimately
only consider whether an attack such as this could be theoretically profitable.
All the transactions observed may very well be "legit" in the sense that they
have nothing to do with fee manipulation, but for the sake of argument we will
run some numbers under the hypothesis that this is the ultimate goal, even if
it is in fact coincidental.
** A short analysis, of the napkin kind **
Simply put, and trivially, such an attack would be profitable if the net fees
the participating miners spend on fee-stuffing transactions is less than the
increase in fees the participating miners can collect from "real" transactions.
The cost for carrying out the attack primarily has three factors: the ratio of
participating miners, the ratio of fee-stuffing transactions required to
maintain full blocks with a high fee level, and the per-transaction fees
required for these.
The ratio of participating miners is important since it determines how much of
the spent fees are lost to miners that do not participate in the attack. If 20%
of the hashrate participates, on average 20% of blocks will be mined by these
miners, recouping these fees. Which means the net amount of fees spent on the
attack in this case is 80% of the gross fees spent on the creating these
transactions - the remaining fraction of the fees would be collected by the
honest miners instead.
Critically, this means that the higher the ratio of the hashrate is
participating, the lower the cost of the attack. If 100% of miners participate
with a ratio of transactions equal to their hashrate, the cost of the attack is
zero, since every participating miner will get back on average 100% of the fees
they contributed, and 0% of the fees will be lost to honest miners (of which
there are none).
The ratio of fee-stuffing transactions required to maintain full blocks with a
high fee level and their required fees would vary over time - weekends have
fewer transactions, for example, and consistently high fees would likely reduce
the number of people attempting to use the blockchain at all. Note however that
in the degenerate case where all miners are participating, these two factors
would be much less important, since all spent fees are recouped anyway, so it
would only affect the absolute number of fees spent for real transactions.
If all real transactions were fee-optimal, using low-balled fees based on the
current mempool only and actively using fee bumping to barely squeak into a
block, the total cost of the attack per block could be easily approximated as:
(ratio of fee-stuffing transactions lost to honest miners) * (ratio of
fee-stuffing transactions to real transactions) * (total block transaction fees)
However, in practice, the attack appears to rely on exploiting the inherent
decay used by fee estimation algorithms that are based on historical fee data.
This causes many wallets to create transactions that overpay the necessarily
next-block fee by a significant amount - for example, the morning after the 700
sat/vB flood on December 16th, Bitcoin Core was still giving a six-block
estimate of 529 sat/vB even though <250 sat/vB transactions were being mined.
This means that the actual cost would likely be much lower. Seeing as this
would be difficult to model, we would need to estimate the absolute cost to
maintain a 100% block fillrate with high fees over time based on observations
and some guesswork. Looking at the bursts of transactions we have seeing over
the last few months during low-influx periods, most of them are in the 40-60
sat/vB range, so it seems reasonable to conclude that you can maintain this
high fee level with transactions averaging ~50 sat/vB.
The increase in fees that can be collected from real transactions is also
difficult to model. There is an opportunity cost for participating miners from
mining their own fee-stuffing transactions instead of legitimate transactions,
and it would depend greatly both on how many transactions are willing to outbid
the fee-stuffing transactions at a particular fee level, the decay rate used by
fee-estimation algorithms, as well as the cascading fee-related effects of
blocks being full 100% of the time, leading to low-fee transactions never being
mined. Due to the non-homogeneous nature of the ecosystem, estimating these
factors individually would require a lot of (weak) assumptions, but we can make
some higher-level estimates based on real-world data by comparing the fees
collected from mined transactions today compared to fees collected a year ago.
See https://www.blockchain.com/explorer/charts/transaction-fees - if we use the
30D average, we were at around 20 BTC/day a year ago compared to around 150
BTC/day when this was written. With 144 blocks per day, this is approximately
0.14 BTC/block a year ago, and 1.05 BTC/block right now.
The gross profit for the attack would then simply be: ( (total average block
transaction fees with attack) - (total average block transaction fees without
attack) ) * (ratio of blocks mined by participating miners)
Using these numbers, the cost of a hypothetical attack would have to be on
average less than 0.9 BTC per block mined by participating miners to be
profitable.
So let's plug in some hypothetical numbers, using these assumptions together
with the current real-world data under the hypothesis that such an attack is
currently taking place, and that the current fee spike can be explained by it.
If we assume that 20% of miners participate in the attack and they need to fill
on average 20% of each block (200 kvB) with an average transaction fee of 50
sat/vB to effectively maintain high fees:
The average cost per block would be 50 sat/vB * 200000 vB = 0.1 BTC
The gross profit would be 0.9 BTC * 0.2 = 0.18 BTC averaged per block
This gives a net profit of 0.18 BTC - 0.1 BTC = 0.08 BTC averaged per block
Which would result in an average daily net profit shared among the
participating miners of 144 * 0.08 = 11.52 BTC, or around US$ 500K at today's
price. (Non-participating miners would of course profit as well.)
Just to emphasize - the profits are averaged over all blocks mined on the
network, not just the ones mined by participating miners, since the cost is
incurred on every block regardless of who mines it. With these numbers, these
participating miners would have a loss of 0.1 BTC per block they did not mine,
and a gain of 0.8 BTC for every block they did mine, with 20% of the hashrate
obviously averaging 1 in every 5 blocks - or somewhat restated, 4 * -0.1 + 0.8
= 5 * 0.08 = 0.4 BTC per 5 blocks.
If you keep the other hypothetical factors constant, the break-even numbers in
this example would be an average fee-stuffing transaction fee of 90 sat/B,
11.1% participating miners, or 36% required fill rate.
Observe also that miners would not have to actively coordinate or share funds
in any way to participate. If a miner with 10% of the participating hashrate
contributes 10% of the fee-stuffing transactions, they would also get back on
average 10% of the total fees paid by transactions that are included in blocks
mined by participating miners, giving them 10% of the profits. As such, each
participating miner would simply have to watch the mempool to verify that the
other participating miners are still broadcasting their agreed rate/ratio of
transactions, the rest should average out over time.
In short, I believe this is a real problem. The premise of this analysis is
based on conjecture and casual observation which is vulnerable to confirmation
bias, and obviously cannot be considered proof that anything fishy is going on
at present. However, regardless of the intent of these transactions, their
existence and effect on the fee is obvious for everyone to see, so I feel
relatively safe to conclude that under certain conditions where blocks are
mostly full most of the time, a small-ish minority hashrate could potentially
manipulate the network fees for a significant profit with no active
coordination. As we are seeing, this would cause both unnecessarily high fees
for people wanting to use the blockchain, and long-term issues with a bloated
UTXO set that affects both fully archiving and pruning Bitcoin Core nodes as
well as all other software that needs to keep a record of unspent transactions.
In my opinion, it is necessary to address this.
** A possible solution, with some caveats **
My proposed solution to this would be to add partial transaction fee burning.
If 50% or more of transaction fees were burned, this should effectively curtail
any incentive miners have for padding blocks with junk transactions in general,
as it would both significantly reduce the amount of spent fees they would be
able to recoup, and also reduce the amount of benefit they gain from the
transaction fees being high. The burn rate would however necessarily have to be
less than 100%, otherwise miners would not be incentivized to include any
transactions at all, and might as well be mining empty blocks.
While this change by itself could be implemented with a soft fork, miners would
be (highly) unlikely to accept such a change, since it would directly reduce
the profits even for honest miners. However, this solution could effectively
complement arguments made by Peter Todd and others regarding the future of
block subsidy, which in short go along the lines that block subsidy halvings
should be stopped at some point with a hard fork, leaving a perpetual fixed
subsidy per block. By itself this would arguably make Bitcoin into an
inflationary currency, which many people object to, but if you combine it with
partial fee burning, it could very well become deflationary instead depending
on how the fee market develops, while still providing a guaranteed minimum
reward per block. This would effectively alleviate the danger of a deficient
fee market compromising the security of the blockchain due to low miner rewards
at some point in the future, while only adding an "about" to the statement
"there will only ever be 21 million coins".
For example, if the collected fees in the year prior to such a hard fork being
implemented were on average 1 BTC per block, and it was decided to burn 50% of
the fees, the subsidy could be increased by a fixed 0.5 BTC which would not be
affected by halvings. In other words, when the current subsidy starts
approaching zero, we would be left with a perpetual static subsidy of 0.5 BTC
and change per block, without drastically affecting the total coin supply.
Worst case, if fees collapsed entirely we would have an inflation of ~0.1% per
year (0.5 BTC/block * 144 blocks/day * 365 days/year = 26280 BTC/year) not
taking permanently lost coins into account, while on the other hand, if fees
went higher still then the deflation would not have a fixed limit, unless an
absolute limit for burned fees per block was added.
I did briefly consider the possibility of doing this with a soft fork instead,
where the "burned" fees were instead transferred into a special "subsidy fund
address" that would be drawn from by miners to effectively increase the block
subsidy, but seeing as this would not remove the correlation between
intentionally inflating fees and increasing miner rewards, I don't believe this
would actually address this attack. For the same reason, adding a dynamic
subsidy based on historic fee rates would have the same problem, so it would
necessarily have to be a fixed additional subsidy.
It is important to emphasize that if the goal is to fully address this type of
miner attack in general, increasing the blocksize would NOT be a viable
solution by itself. If the blocksize increase is large enough and the fraction
of participating miners is low enough, then yes, it would probably thwart it,
but if the majority (or all) miners participated, it would have little (or no)
effect unless the blocksize was unbounded, which does not seem like a good
idea. While the absolute amount of fees the miners would need to spend for fee
stuffing would of course increase, the fraction of spent fees miners would
recoup would not change, so if 100% of miners participated, 100% of fees used
in the attack would still be recouped regardless of the absolute number of
transactions it would take to fill a block. Furthermore, the absolute number of
transactions willing to outbid them would not change, so the extra fees
gathered from the attack would remain the same as well.
Additionally, if the attack continued, the rate of increase of the size of the
UTXO set would likely increase by a similar factor as the blocksize increase.
As such, any blocksize increase at all would in my opinion necessarily have to
be combined with partial fee burning - possibly dynamic, based on the size of
each block - to prevent exacerbating potential attacks that excessively and
unnecessarily bloat the size of the UTXO set. It would however be natural add a
modest and scaling increase as part of the same fork, seeing as the fee burning
change would resolve the main argument against it, since adding data to the
blockchain would now always have a guaranteed cost even for miners.
Changing fee estimation algorithms across the board to not take historical fee
data into account, eliminating the long-term decaying fee effects observed
after short-term flooding of high-fee transactions, would of course
significantly help prevent such attacks from being profitable in the first
place without requiring any sort of fork. As such, I believe this should also
be done as a short-term makeshift solution. A less exploitable estimate could
be made by limiting the algorithms to only use the current mempool state and
influx rate, as well as possibly the estimated current blockrate and the
arrival times of recent blocks. Additionally, wallets could pre-sign a number
of replacement transactions spending the same UTXO(s) with gradually increasing
fees up to a maximum specified by the user, and automatically broadcast them in
order as the state of the mempool changed. And I'm sure there are additional
strategies that could be used here as well to make the ecosystem more
fee-optimal in general.
Unfortunately, as long as some parties still use historic fee data for their
fee estimation, the attack could still be effective up to a point. Payment
providers like BitPay for example currently specify that you need to use a
historically high fee for the initial transaction for it to be accepted, and
does not recognize replacement transactions that bump the fee.
If you made it this far, thanks for reading my wall. Please let me know if you
find any serious mistakes in my assumptions and/or math that invalidate the
whole premise, so I can stop thinking about it.
--
Sincerely,
ArmchairCryptologist
_______________________________________________
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev