Channels are not accounts
A Lightning channel looks like a balance and behaves like nothing of the kind. This lesson takes the construction from Mastering the Lightning Network chapter 7 and works through the one consequence that catches every new operator: the money is there, and you still cannot send it.
- — A bitcoin transaction spends outputs, it does not debit an account
- — Comfort reading an amount in satoshis
- — What a 2-of-2 multisig output is
- Say what a channel can and cannot do from its two balances alone
- Predict which payments will fail before you attempt them
- Read a `listchannels` row and name the constraint it describes
A channel is a 2-of-2 multisig output on the bitcoin blockchain, funded once, plus a pair of signed transactions that neither side has published. That is the whole mechanism. Everything that feels strange about Lightning follows from it.
The strangeness is worth naming immediately, because it is the thing that makes newcomers think their node is broken:
A channel with money in it can be unable to send, unable to receive, or both. Which of those is true depends not on how much is in the channel but on where in the channel it sits.
Capacity is fixed; the balance moves
When a channel opens, one or both parties commit funds to the multisig output. That total is the channel’s capacity, and it does not change for the channel’s lifetime. There is no top-up. Adding funds means closing the channel and opening another, or opening a second one.
What does change is the split. At any moment the capacity is divided between your side — your local balance, which is what you can send — and the other side’s, your remote balance, which is the room you have to receive. The two always sum to the capacity, minus a small amount held back.
A payment does not move coins anywhere. It moves the line.
content/foundations/channels-are-not-accounts.mdx, rendered at build time.Three things follow from this, and each one surprises somebody every day.
You cannot receive into an empty remote side. If you funded the channel alone, your remote balance starts at zero. The channel is full of your money and it cannot accept a single satoshi until you have spent some of it outward. A brand-new node that opens five channels and then wonders why nobody can pay it has met this.
You cannot send more than one channel holds. A payment traverses a channel; it is not split across your channels unless your node deliberately splits it, and even then each part is bounded by the channel it takes. Five channels of one million satoshis are not a five-million-satoshi sending limit.
Both sides can be stuck at once. A channel drained to your side cannot receive; a channel drained away from you cannot send. Two channels in opposite states are, between them, a node that appears well funded and can do very little.
What the commitment transaction actually holds
The balances are not a ledger entry. Each side holds a commitment transaction, and the reason that works at all is worth taking from the source directly:
If someone holds a presigned bitcoin transaction that spends a 2-of-2 multisig output and gives them the exclusive ability to spend that bitcoin, they effectively own it — even if they never broadcast the transaction.
That is the whole trick. A commitment transaction is signed, held, and not published; it spends the funding output and pays each party their current balance. Making a payment means both sides sign a new pair reflecting the new split, and then revoke the old pair.
The revocation is what makes it safe. If a channel partner publishes a commitment transaction that has been revoked — an old state, one that paid them more — the protocol gives you a window in which you can take the entire channel balance as a penalty. That asymmetry is the whole security model, and it is why an old backup of a Lightning node is dangerous in a way an old backup of a wallet is not.
This is also why the two balances are not quite the capacity. Each side holds back a channel reserve, conventionally 1% of capacity, which it can never spend.1 A side with nothing at stake has nothing to lose by cheating, so the protocol makes sure neither side ever reaches zero.
The reserve is small and it is a nuisance at exactly the wrong moment. A rebalancing attempt sized to move “the whole balance” will fail against it, and the error will not say so in those words.
Reading a real channel
Every node keeps a view of every public channel, built from gossip. Here is one, taken from this operator’s node when the page was built — not invented, and not this node’s own:
| Channel | 1008126818450931714 | public gossip |
| Capacity | 5 000 000 sats | fixed for the channel's life |
| Fee, one way | 1 000 ppm | +0 msat base |
| Fee, the other way | 519 ppm | +500 msat base |
| Maximum HTLC | 4 950 000 sats | 99% of capacity |
| Balance split | — | gossip does not carry it |
Read from lncli describegraph on a running lnd node and injected at build time.
Public gossip only — this operator's own channels are not shown, because their balance split
is not public and a site teaching node privacy should not publish its own.
Four things in it are worth reading together, and the fourth is the lesson.
The capacity is exactly what was committed to the funding output when the channel opened. It will be that number until the channel closes.
The two fee policies differ, and that is normal: each side sets what it charges to forward away from itself, so a channel between a patient node and an impatient one looks precisely like this.
The maximum HTLC is not a round number. It is 99% of capacity — the channel reserve, made visible. Each side holds back 1% it can never spend,1 so the largest payment the channel will accept is bounded by it. The reserve is not a footnote in the specification; it is sitting in the public data.
And the fourth: there is no balance anywhere in it. Gossip carries capacity, policy and limits. It does not carry the split, because the split is not public — it is known only to the two parties, and it changes every time a payment crosses.
That is why the three moments in Fig 1 are a worked example rather than a measurement. Nobody outside those two nodes can watch the line move. The operator of this node can run lncli listchannels and see their own, which is the one place the split appears:
$ lncli listchannels
{
"channels": []
}
Empty, and honestly so: the node is synced and running but has never opened a channel. When it does, this page will show a real split with its own as-of date. Until then it shows what is genuinely observable and says which is which — a fabricated listchannels row presented as real would undermine every measured figure on this site.
Why this shapes everything after it
Every later topic in this course is a consequence of the two-sided constraint.
Routing exists because your channel to one peer cannot pay someone you have no channel with, so a payment is a chain of these constraints, each of which must hold simultaneously. Rebalancing exists because the distribution drifts as you use the node, and moving the line back costs money. Fee policy exists because forwarding a payment consumes your outbound liquidity on one side and replenishes it on the other, which is a service with a cost and therefore a price.
An operator who has internalised “channels are not accounts” can predict most Lightning failures without reading the error. An operator who has not will keep meeting the same wall from different directions.
Which is the honest summary of this lesson: the mechanism is simple, and almost nothing about the experience of running a node makes sense until it is.
- 01 A channel shows 5 000 000 sats local and 0 sats remote. A friend tries to send you 1 000 sats through it and it fails. Whose node is at fault?
Neither. The channel has no inbound capacity: every satoshi in it is on your side, so there is nothing on the remote side to move towards you. Capacity is not the constraint — the distribution is. To receive, you must first push some of that 5 000 000 to the other side, or open a channel where someone else provides the funds.
- 02 You open a 2 000 000 sat channel and immediately spend 1 999 000 of it. Can you now receive 1 999 000?
Almost, but not quite, and the gap matters. The channel reserve holds back 1% of capacity on each side, and the commitment transaction must pay an on-chain fee if it is ever broadcast. So your receivable amount is roughly capacity minus your remaining local balance, minus the remote reserve, minus the fee buffer. Budgeting for exactly the capacity is how a rebalancing script ends up failing on its last hop.
- 03 Two operators both say they have "5 million sats of liquidity". One can route a 4 000 000 sat payment and the other cannot. What did they each mean?
Probably one meant total capacity across several channels and the other meant outbound balance in one. Five channels of 1 000 000 sats cannot forward 4 000 000 in a single payment — a payment traverses one channel at a time and cannot exceed that channel's balance on the sending side. "Liquidity" without a side and a per-channel figure is not a number.
Notes
- The reserve is set by
channel_reserve_satoshisin the channel-open negotiation and is conventionally 1% of capacity. It exists so that each side always has something to lose by publishing an old state.BOLT 2 - Both sides do not pay this fee. The channel opener pays the commitment transaction's fee, which is why the opener's spendable balance is lower than a naive reading of the capacity suggests, and why the difference grows when on-chain fees rise.
Source & licence
This page adapts Mastering the Lightning Network by Andreas M. Antonopoulos, Olaoluwa Osuntokun, René Pickhardt and Mastering Bitcoin: Programming the Open Blockchain, 2nd edition by Andreas M. Antonopoulos, licensed CC BY-SA 4.0. Adapted passages are marked in the text with a hairline rule and a source line. Changes: condensed, re-sequenced into lesson order, terminology aligned to this course's glossary, and the worked example replaced with one drawn from a running node.
This page is therefore also CC BY-SA 4.0. Copy it, translate it, teach from it, republish it under the same licence, with attribution to the works above and to ln.university.