diff options
| author | bitflash-maintainer <noreply@bitflash.invalid> | 2026-08-09 03:18:25 +0000 |
|---|---|---|
| committer | bitflash-maintainer <noreply@bitflash.invalid> | 2026-08-23 04:37:36 +0000 |
| commit | 5abe59dd09e7dbc5795f5f6d9ac2ef303d418134 (patch) | |
| tree | fbe9bae5e0e5f1ac1cfaa8a486c2d2df5de4193a /src/main.cpp | |
| parent | 857f57e962b24f51621ddac188fa6e42d0ac6f41 (diff) | |
payout: say what actually failed instead of blaming transaction size
SendMoney's "oversized transaction that requires a transaction fee of
0.00" is not an oversized transaction and there is no fee. That branch is
taken when nValue + nFeeRequired > GetBalance() -- an empty spendable
balance -- and the fee reads 0.00 because CreateTransaction failed before
setting one. 3,267 of these in debug.log sent me looking for a
transaction-size problem that does not exist. Report what is short, by how
much, and against what balance.
Name COINBASE_SPENDABLE_DEPTH in main.h and derive GetBlocksToMaturity
from it, because the distinction it captures is genuinely surprising:
CMerkleTx::GetCredit values a mined coinbase at zero until
COINBASE_MATURITY+20 deep, not COINBASE_MATURITY.
I first changed the payout gate to that deeper value, on the theory that
each payout was firing 20 blocks before its own coinbase could be spent.
Measuring it refuted that: across 934 payments, 96% succeeded at depth
100, the moment they were queued, which is only possible because a payout
is funded from whatever coin is already mature rather than from its own
block. The gate stays at COINBASE_MATURITY, with a comment recording the
measurement so the next person does not re-make the same change.
The real shortfall is structural and not addressed here: the pool pays out
~99% of each block's subsidy while only matured coinbases are spendable,
so it runs with almost no buffer, and any orphaned block it queued a
payout for drains that buffer permanently. The 24h retry loop absorbs this
-- 0 payouts forfeited -- but the buffer is what needs fixing.
(cherry picked from commit e28df01f90d621b0cd818f28d70a20b8ab5d1a8d)
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp index f84f209..382a008 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
| @@ -1513,7 +1513,7 @@ int CMerkleTx::GetBlocksToMaturity() const | |||
| 1513 | { | 1513 | { |
| 1514 | if (!IsCoinBase()) | 1514 | if (!IsCoinBase()) |
| 1515 | return 0; | 1515 | return 0; |
| 1516 | return max(0, (COINBASE_MATURITY+20) - GetDepthInMainChain()); | 1516 | return max(0, COINBASE_SPENDABLE_DEPTH - GetDepthInMainChain()); |
| 1517 | } | 1517 | } |
| 1518 | 1518 | ||
| 1519 | 1519 | ||
| @@ -4812,7 +4812,18 @@ bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew) | |||
| 4812 | { | 4812 | { |
| 4813 | string strError; | 4813 | string strError; |
| 4814 | if (nValue + nFeeRequired > GetBalance()) | 4814 | if (nValue + nFeeRequired > GetBalance()) |
| 4815 | strError = strprintf("Error: This is an oversized transaction that requires a transaction fee of %s ", FormatMoney(nFeeRequired).c_str()); | 4815 | // Not an oversized transaction -- this branch is simply "the |
| 4816 | // spendable balance is too small". Saying otherwise (with a fee | ||
| 4817 | // of 0.00, because CreateTransaction failed before setting one) | ||
| 4818 | // sends anyone reading the log after a failed payout hunting a | ||
| 4819 | // transaction-size problem that does not exist. | ||
| 4820 | strError = strprintf("Error: insufficient spendable balance:" | ||
| 4821 | " need %s (plus fee %s) but only %s is spendable" | ||
| 4822 | " -- mined coin counts as zero until it is %d deep", | ||
| 4823 | FormatMoney(nValue).c_str(), | ||
| 4824 | FormatMoney(nFeeRequired).c_str(), | ||
| 4825 | FormatMoney(GetBalance()).c_str(), | ||
| 4826 | COINBASE_SPENDABLE_DEPTH); | ||
| 4816 | else | 4827 | else |
| 4817 | strError = "Error: Transaction creation failed "; | 4828 | strError = "Error: Transaction creation failed "; |
| 4818 | return error("SendMoney() : %s\n", strError.c_str()); | 4829 | return error("SendMoney() : %s\n", strError.c_str()); |