Next Generation Channel Update Protocol

Eltoo / LN-Symmetry

A complete redesign of the Lightning Network's channel update mechanism. Instead of asymmetric punishment-based revocation, Eltoo uses SIGHASH_ANYPREVOUT to make any newer state replace any older state — elegantly and symmetrically.

Christian Decker, Rusty Russell, Olaoluwa Osuntokun Authors (2018)
BIP118 (SIGHASH_ANYPREVOUT) Required Bitcoin soft fork
Draft / Under Discussion BIP Status (2026)
O(1)
Storage per channel (vs O(N) today)
1 tx
Per state update (vs 2 today)
0
Revocation keys needed
100%
Symmetric — Alice's tx = Bob's tx

The Problem with Current Lightning

The original Poon-Dryja payment channel protocol (2015) made Lightning possible, but at the cost of significant complexity. Understanding why it is complex explains exactly what Eltoo solves.

Current LN Channel Update: Poon-Dryja Mechanism

Every time Alice and Bob update their channel state (i.e., make a payment), the following happens:

What happens per update
1. Alice creates her commitment tx and sends it to Bob
2. Bob creates his commitment tx and sends to Alice
3. Alice sends Bob her revocation key for the old state
4. Bob sends Alice his revocation key for the old state
5. Each party stores all revocation keys forever
Why this is asymmetric
Alice's commitment tx pays Bob immediately (to_remote)
Bob's commitment tx pays Alice immediately (to_remote)
They look completely different from each other
Each encodes whose perspective it represents
This asymmetry is the root cause of complexity

Visual: Channel Update Flow

Alice & Bob — Channel Life Cycle (Poon-Dryja)
Funding Tx (on-chain)
2-of-2 multisig locked on-chain. 1 tx total.
Per State Update (×N payments)
Alice's Commit #N
Bob's Commit #N
+ Revocation key exchange for state #(N-1)
Each party stores revocation key for every old state → O(N) storage
Alice's Commit #1
+
Alice's Commit #2
+
… #N
All held by Bob (and vice versa)
Breach / Penalty Scenario
Old State #2 broadcast by Alice
Bob sees it (watchdog!)
Justice Tx (Bob takes ALL)
Bob must have revocation key for state #2. Bob must respond within CSV locktime window. Miss it → Alice steals.

The Penalty Mechanism — How It Works

// Alice's commitment tx (state #2, old) output_to_alice: { script: OP_IF // Bob can sweep with revocation key <revocation_pubkey> OP_CHECKSIG OP_ELSE // Alice can claim after CSV delay 144 OP_CSV <alice_pubkey> OP_CHECKSIG OP_ENDIF } output_to_bob: <bob_pubkey> OP_CHECKSIG // ^ Bob gets paid immediately (to_remote)
Penalty — Key Requirements
  • Bob must be watching the blockchain continuously
  • Bob needs the exact revocation key for that specific old state
  • Bob must respond within CSV window (e.g., 144 blocks = ~1 day)
  • If Bob misses: Alice steals ALL channel funds
  • Solution: Watchtowers — but they need all revocation keys
Each channel update requires
2 commitment txs + 2 revocation key exchanges
After 1000 payments, each party stores
1000 revocation secrets per channel
Miss a breach response
Lose ALL channel funds (no partial loss)
Symmetry
None — Alice's tx ≠ Bob's tx, ever
Core Insight — The Root Problem

The Poon-Dryja design prevents double-spending by making old states punishable. But punishment requires asymmetric transactions (each party signs a different version), which requires storing revocation data for every state ever created, which requires permanent watchtower monitoring. This cascade of complexity is structural, not accidental.

Eltoo — The New Approach

Paper Reference

"eltoo: A Simple Layer2 Protocol for Bitcoin" — Christian Decker, Rusty Russell, Olaoluwa Osuntokun (2018)
The name "eltoo" is a play on "L2" (ell-too / Layer Two). Later renamed LN-Symmetry in the BIP process.

Core Philosophy: Replace, Don't Punish

The Key Insight

Instead of making old states punishable, make them replaceable. Any newer state can overwrite any older state on-chain — not by penalizing the cheater, but by the protocol structure itself.

// Eltoo invariant state[N+1] can always spend state[N] state[N+2] can always spend state[N] or state[N+1] // No specific key needed — just be newer!
Three Properties Enabled
  • Symmetry: Alice and Bob sign identical transactions
  • O(1) storage: Only keep the latest state
  • Safe dispute: Just publish your latest state — it wins automatically

How SIGHASH_ANYPREVOUT Makes This Possible

The magic ingredient is a new Bitcoin signature hash flag: SIGHASH_ANYPREVOUT (APO), proposed in BIP118.

// Normal Bitcoin: sig commits to specific UTXO sig = sign(hash( version, txid + vout, ← specific input! sequence, outputs, locktime )) // SIGHASH_ANYPREVOUT: sig commits to script/value sig = sign(hash( version, script + value, ← NOT the txid! sequence, outputs, locktime ))
Why APO enables replacement

Because the signature for state #10 does not commit to which UTXO it spends — only to the script and value — it can spend any output with the same script and value.

This means: a signature created for state #10 can spend the output of state #7, state #8, OR state #9. The newer state can consume any older state's output!

This is exactly what Eltoo needs

Eltoo — Step by Step

Eltoo Channel Life Cycle
1. Open Channel
Funding Tx (on-chain)
2-of-2 NUMS multisig output (Tapscript)
Same as current LN — one on-chain tx
2. Per State Update (×N payments — SYMMETRIC!)
Update Tx #N (APO sig)
+
Settlement Tx #N
Both parties sign identical txs. No revocation keys exchanged.
3. Happy Close (Cooperative)
Settlement Tx #N
Publish latest settlement tx directly. Alice and Bob get their balances. Done.
4. Dispute Close (Alice cheats with old state #2, current state is #5)
Update #2 (Alice cheats)
Bob publishes Update #5
Settlement #5 (after CSV)
Update #5 can spend Update #2's output directly (APO!). Bob needs NO specific key for state #2. Any later state always wins.
Each channel update requires
1 settlement tx + APO sig exchange (symmetric)
After 1000 payments, each party stores
Latest state only — O(1) storage
Cheater broadcasts old state
Victim publishes latest state — it automatically wins
Symmetry
Full — Alice's tx = Bob's tx always

Interactive Protocol Comparison

Walk through the same scenario — Alice and Bob open a channel, make 5 payments, then close — in both protocols simultaneously.

Current LN

Poon-Dryja (Deployed)

Step 1 / 7
Eltoo

LN-Symmetry (Proposed)

Synchronized with left →

Dispute Scenario: Side-by-Side

Alice cheats by broadcasting old state #2 after the channel has reached state #5.

Current LN — Breach Scenario
1
Alice broadcasts commit #2 (old, cheating). This tries to steal funds.
2
Bob must detect the broadcast within the CSV window (e.g., 144 blocks ≈ 1 day). Requires a watchtower running 24/7.
3
Bob needs revocation key specifically for state #2. Must retrieve it from stored database of all revocation keys.
4
Bob publishes justice tx using revocation key. Takes ALL channel funds (penalty).
Risk: If Bob misses the window OR doesn't have the right revocation key → Alice steals all funds with no recourse.
Eltoo — Dispute Scenario
1
Alice broadcasts update #2 (old). It's a valid transaction but not the latest state.
2
Bob publishes update #5 (latest). Thanks to APO, update #5's signature is valid spending update #2's output directly.
3
Update #5 replaces #2 on-chain. No specific revocation key needed — just the latest update tx Bob already holds.
4
After CSV delay, Bob publishes settlement #5. Both parties get their correct balances.
Safe: Bob has the full update period to respond. No penalty needed — Alice gains nothing from broadcasting the old state.

BIP118 — SIGHASH_ANYPREVOUT Technical Deep Dive

Bitcoin Signature Hash Type Comparison

Sighash Flag Commits to Inputs Commits to Outputs Commits to UTXO Notes
SIGHASH_ALL ✅ All ✅ All ✅ txid+vout Current standard. Most restrictive.
SIGHASH_SINGLE ✅ All ⚠️ Corresponding only ✅ txid+vout Allows adding outputs; UTXO still pinned.
SIGHASH_NOINPUT ❌ None ✅ All ❌ Not committed Rejected — too dangerous (replay risk).
SIGHASH_ANYPREVOUT BIP118 ✅ Current input ✅ All ⚠️ Script + Value only The Eltoo ingredient. Commits to script and amount, NOT to txid/vout.
SIGHASH_ANYPREVOUTANYSCRIPT ✅ Current input ✅ All ❌ Only value Even more flexible variant; not committing to script either.

Hash Preimage: What Gets Committed

Click on fields to see their role in the signature. Green = committed (signature binds to this). Red = not committed (flexible).

SIGHASH_ALL (Normal Bitcoin)

nVersion✅ Committed
hashPrevouts (all inputs txid+vout)✅ Committed
hashSequence✅ Committed
outpoint (txid + vout)✅ Committed
scriptCode✅ Committed
value (satoshis)✅ Committed
nSequence✅ Committed
hashOutputs✅ Committed
nLocktime✅ Committed
sighash type✅ Committed

SIGHASH_ANYPREVOUT (BIP118)

nVersion✅ Committed
hashPrevouts❌ NOT committed
outpoint (txid + vout)❌ NOT committed
scriptCode✅ Committed
value (satoshis)✅ Committed
nSequence✅ Committed
hashOutputs✅ Committed
nLocktime✅ Committed
sighash type✅ Committed
Key: By not committing to txid+vout, the same signature can spend ANY output with matching script and value — including previous Eltoo update txs!

Security Analysis: Can APO Signatures Be Replayed?

The Concern

If a signature doesn't commit to the specific UTXO it spends, could an attacker take Alice's signature for her channel and use it to steal from a different channel?

Why It's Safe

No. The signature still commits to the scriptCode and value. A different channel has a different script (different public keys). The signature will not verify against a different channel's script.

Within the same channel: old states can be spent by later states — and this is precisely what Eltoo exploits by design. It's a feature, not a bug.

Verification Pseudocode

// Normal SIGHASH_ALL verification msg = sha256( version || prevout_hash_all_inputs || ← commits to all input UTXOs outpoint(txid, vout) || ← this specific UTXO scriptCode || value || sequence || hashOutputs || locktime || sighash_type ) verify(sig, msg, pubkey) // must match // SIGHASH_ANYPREVOUT verification (BIP118) msg = sha256( version || // prevout_hash: NOT included! // outpoint: NOT included! scriptCode || value || sequence || ← script + value still committed hashOutputs || locktime || sighash_type ) verify(sig, msg, pubkey) // valid for ANY utxo with same script+value

BIP118 Status and Activation Path

2018: Eltoo Paper
2019: BIP-NOINPUT draft
2021: BIP118 (APO) renamed
2022–2026: Discussion / LNHANCE
Activation window (TBD)
LN adoption
2018
Eltoo Paper Published
Decker, Russell, Osuntokun present the protocol at Financial Cryptography 2018. Required SIGHASH_NOINPUT (predecessor to APO).
2019–2020
BIP-NOINPUT → BIP118 Refinement
Community feedback led to scoping the flag more carefully. NOINPUT was deemed too broad; APO (ANYPREVOUT) added commitment to the script, reducing replay surface.
2021
BIP118 Officially Drafted
Taproot activation (BIP341) created the Tapscript ecosystem that BIP118 builds upon. BIP118 formalized as a Tapscript-only soft fork.
2022–2026
LNHANCE Proposal & Active Discussion
BIP118 bundled with BIP119 (CTV) and BIP345 (OP_VAULT) in the LNHANCE proposal. Active mailing list and developer discussion. No consensus on activation path yet.
2027+ (speculative)
Possible Activation Window
Dependent on Bitcoin developer consensus and miner signaling. If activated, Lightning implementations would begin transitioning to LN-Symmetry channel types.
Post-activation
LN-Symmetry Deployment
LND, CLN, Eclair implement Eltoo channel type. Gradual migration from Poon-Dryja. Channel factories and multi-party channels become practical.

Eltoo Transaction Structure

Eltoo uses three distinct transaction types. Understanding their structure reveals how replacement works at the Bitcoin protocol level.

Type 1

Funding Transaction

Published on-chain once to open the channel. Identical to current Lightning.

  • Input: Alice's coins + Bob's coins
  • Output: 2-of-2 NUMS taproot multisig
  • Looks like normal Taproot key-path spend
  • Spendable by: the initial update tx
Type 2

Update Transaction

Off-chain normally. Published on-chain during dispute. Uses APO signature.

  • Input: funding tx OR any older update tx (APO!)
  • Output: update tx script (tapscript)
  • nLocktime: encodes state number
  • Can be replaced by any later update tx
Type 3

Settlement Transaction

The actual balance split. Published to close channel after update tx confirms.

  • Input: latest update tx output
  • Outputs: Alice's balance, Bob's balance
  • Requires: CSV delay after update tx
  • CSV delay allows replacement window

Update Transaction Script (Tapscript)

// Update tx output — two spending paths (Tapscript) script: { // Path 1: Both parties agree → next update tx (via APO) leaf_A: ANYPREVOUTANYSCRIPT <alice_update_key> <bob_update_key> OP_CHECKMULTISIG ← 2-of-2 APO sig // Path 2: After CSV delay → settlement tx leaf_B: <state_n_delay> OP_CSV OP_DROP <alice_settle_key> <bob_settle_key> OP_CHECKMULTISIG ← 2-of-2 SIGHASH_ALL sig } // Key insight: leaf_A allows APO spending → replacement works! // Key insight: leaf_B requires CSV → settlement must wait!

State Number as Locktime

// Each update tx uses nLocktime = state_number update_tx_state_7: { nLocktime: 7, ← state number encoded here nSequence: 0, ← can be spent immediately inputs: [funding_or_update_tx_APO], outputs: [update_script] } // Update tx for state 5 cannot replace state 7: // The script checks that spending tx nLocktime >= current // State 5 (nLocktime=5) < state 7 (nLocktime=7) → rejected
Why State Numbers Matter

The state number encoded in nLocktime is what makes replacement ordered. The update tx script verifies that the spending tx's locktime is at least as large as the current state. This means:

  • State #10 CAN replace state #7 ✅
  • State #7 CANNOT replace state #10 ❌
  • State #7 CAN replace state #7 (no-op) ✅

Transaction Graph: 3-State Example

Funding Tx 2-of-2 multisig (on-chain) Update #1 nLocktime=1 APO sig valid off-chain Settlement #1 Alice: 90k / Bob: 10k (superseded) replaces Update #2 nLocktime=2 APO sig valid off-chain Settlement #2 Alice: 80k / Bob: 20k (superseded) replaces Update #3 nLocktime=3 (LATEST) published on-chain APO: can spend #1 or #2! ← dispute resolution after CSV Settlement #3 Alice: 70k sat Bob: 30k sat FINAL CLOSE ✓ On-chain / published Off-chain / superseded Update tx (APO) Settlement tx APO: state #3 can spend #1 directly!
Transaction graph for a 3-state Eltoo channel. Update #3 can spend any earlier update output via APO (dashed yellow arc). Only the final settlement tx produces spendable outputs.

HTLC Support in Eltoo

Lightning Network's routing relies on HTLCs. Eltoo must accommodate them within its symmetric update/settlement model.

The Challenge

In current LN, HTLC outputs are attached directly to commitment transactions. Each pending payment adds an output. In Eltoo, settlement transactions serve this role — but Eltoo replaces the entire update+settlement pair atomically when state changes.

The Solution

Settlement transactions include HTLC outputs just like current LN. When a new state is needed (HTLC added, HTLC resolved), both the update tx and settlement tx are replaced together. Only the latest pair is relevant.

Animated HTLC Flow in Eltoo

Alice → Carol (via Bob) Payment — 10,000 sat HTLC
State N
Alice: 80k / Bob: 20k
Initial channel state. No pending HTLCs.
State N+1
Alice: 70k / Bob: 20k / HTLC: 10k
Alice sends HTLC(hash=H, amount=10k, expiry=100)
New settlement tx adds HTLC output
New update tx signed with APO
Bob forwards HTLC to Carol (Bob→Carol channel). Carol has preimage R where H=hash(R).
Pending
HTLC: H awaiting reveal of R
Carol reveals R to Bob. Bob now has preimage.
State N+2
Alice: 70k / Bob: 30k
Bob presents preimage R to Alice. HTLC resolved.
New settlement tx: HTLC removed, Bob's balance +10k
New update tx replaces N+1's update tx (APO)
Key difference from current LN: In current LN, resolving an HTLC requires revoking the previous commitment and creating two new commitments (one for each party). In Eltoo, it just means creating one new symmetric update+settlement pair. The old pair is automatically superseded.

Multiple In-Flight HTLCs

// Settlement tx with 2 pending HTLCs settlement_tx_state_N: { inputs: [update_tx_N_output], outputs: [ { to: alice, amount: 70000 }, // Alice's balance { to: bob, amount: 15000 }, // Bob's balance { htlc: HTLC_A, amount: 8000, // Payment A in-flight hash: H_A, expiry: block_200 }, { htlc: HTLC_B, amount: 7000, // Payment B in-flight hash: H_B, expiry: block_150 }, ] } // When HTLC_A resolves: create state N+1 settlement without HTLC_A output // When HTLC_B times out: create state N+2 settlement reclaiming HTLC_B to Alice

Current LN vs. Eltoo — Full Comparison

Click any row to expand for detailed explanation.

Property Current LN (Poon-Dryja) Eltoo / LN-Symmetry
In Poon-Dryja, Alice holds Bob's commitment (pays Bob if Alice cheats) and vice versa. They're mirror-images with opposite HTLCs. Eltoo uses a shared settlement tx that both parties can publish, removing all asymmetry.
Current LN requires both parties to store a revocation preimage for EVERY prior state. After 10,000 payments, that's 10,000 keys. Eltoo eliminates this entirely — only the latest state matters, and it always wins due to the state number ordering.
This is philosophically significant. Poon-Dryja's penalty is a strong economic deterrent. Eltoo's argument: if cheating simply cannot succeed (latest state always replaces old state), why punish? The structural prevention is sufficient. The debate is whether the absence of punishment creates weaker incentives — see Section 7 philosophy cards below.
Current LN watchtowers (PISA, Cerberus, etc.) must track a growing database of revocation keys per channel. If they lose a key, they cannot protect against that specific old state. Eltoo watchtowers just need the latest update tx — a constant-size payload — and can respond at any time during the update window (which can be set to days or weeks).
For a channel with 1 million micro-payments (common in streaming sats scenarios), Poon-Dryja requires 1 million revocation secrets stored by each party. Eltoo requires storing exactly two transactions regardless of payment count: the latest update tx and the latest settlement tx.
The current update protocol is a carefully choreographed dance: Alice signs her commitment, Bob signs his, then revocation keys are exchanged in a specific order to prevent either party from using the old state. Eltoo reduces this to: both parties sign the same new settlement tx and update tx.
This is Eltoo's primary obstacle. BIP118 requires broad Bitcoin community consensus and miner activation signaling. The LNHANCE proposal bundles it with BIP119 (CTV) and BIP345, which some see as controversial. No activation timeline is currently confirmed.
A 3-party channel in Poon-Dryja requires each pair of participants to maintain revocation keys for all historical states of the full channel — combinatorially explosive. Eltoo's symmetric structure means an N-party channel just needs all N parties to sign each new state update, with no extra revocation overhead.
Channel factories allow multiple channels to be created from a single on-chain UTXO. In Poon-Dryja, the factory layer and channel layer each need revocation logic, creating complex interactions. Eltoo's "latest state always wins" property works recursively — factories become much more practical.
The current LN implementations (LND, CLN, Eclair) all contain significant complexity around revocation key derivation, storage, and penalty transaction construction. Eltoo eliminates this entire subsystem. The remaining complexity is in the APO signature construction and the update/settlement layering.

Penalty vs. No Penalty — The Philosophy

Poon-Dryja Philosophy
"If you cheat, you lose everything."
  • Strong economic deterrent — losing all funds is a devastating punishment
  • No need for the latest state — any old revocation key enables justice
  • Con: Complexity, watchtower dependency, O(N) storage
  • Con: Accidental old-state broadcast = self-penalty (user error catastrophe)
Eltoo Philosophy
"Cheating cannot succeed, so no punishment is needed."
  • Structural prevention — latest state always wins by protocol design
  • Safer for users — accidental old state broadcast doesn't cause catastrophic loss
  • Pro: O(1) storage, symmetric txs, simpler watchtowers
  • Con: Weak deterrent? Attacker can attempt without huge downside risk
Key Insight — Which Wins?

Both approaches prevent successful cheating. The difference is in the consequences of attempting to cheat. Eltoo's approach enables simpler construction of channel factories and multi-party channels — arguably the bigger win for long-term Lightning scalability. For most users, the practical difference is that Eltoo makes Lightning safer: a lost backup or misconfigured wallet that accidentally broadcasts an old state won't result in total fund loss.

LN-Symmetry and the Broader Ecosystem

Why "LN-Symmetry"?

The protocol was renamed from "eltoo" (a play on "LToo" / "Layer Too") to LN-Symmetry in the BIP development process. The new name better describes the core property: symmetric channel update transactions that are identical for both parties.

The LNHANCE Bundle

BIP118 is being discussed alongside other Bitcoin script improvements under the LNHANCE proposal:

BIP 118
SIGHASH_ANYPREVOUT
The core Eltoo ingredient. Allows signatures to bind to script+value rather than specific UTXO. Enables LN-Symmetry.
BIP 119
OP_CHECKTEMPLATEVERIFY (CTV)
Pre-commits transaction templates. Enables vaults, congestion control, and non-interactive channel opens.
BIP 345
OP_VAULT
Bitcoin vault construction enabling covenant-based custody with recovery paths. Builds on CTV.
LNHANCE Status

The combined LNHANCE proposal remains in active discussion as of 2026. Proponents argue bundling creates stronger activation pressure. Critics prefer evaluating each BIP independently. No activation mechanism (BIP9/BIP8) has been selected.

Impact on the Lightning Ecosystem

1. Simpler LN Implementations

The entire revocation subsystem (key derivation, storage, breach detection, justice transactions) can be removed. LND, CLN, Eclair implementations become significantly simpler and safer.

2. Channel Factories

Multi-party channel pools created from a single on-chain tx become practical. A group of 10 users can open channels with each other using 1 on-chain tx instead of 45 (all-pairs). Massive fee savings.

3. Simplified Watchtowers

Watchtowers only need the latest update tx — a constant-size payload. No growing database of revocation keys. More parties can realistically offer watchtower services. Privacy: watchtower learns only current state, not history.

4. Better User Experience

Accidental broadcast of old state (e.g., restoring an old backup) no longer catastrophically penalizes the user. The other party simply publishes the newer state — both get their correct balances.

5. Multi-Party Lightning

N-party channel pools become feasible. Combined with Taproot's key aggregation (MuSig2), an N-party Eltoo channel looks like a single Taproot keypath spend on-chain — indistinguishable from a regular transaction.

6. Post-Quantum Compatibility

The symmetric structure of Eltoo maps more cleanly onto post-quantum signature schemes (Dilithium, SPHINCS+) that were designed without the asymmetric revocation pattern in mind.

Speculative Deployment Timeline

2018 — Done
Eltoo paper — conceptual breakthrough
Christian Decker et al. show that payment channel revocation can be eliminated entirely with the right sighash flag.
2021 — Done
Taproot activation — prerequisite complete
BIP341 (Taproot) and BIP342 (Tapscript) activate. BIP118 is defined as a Tapscript extension — its foundation is now in place.
2024–2026 — Active
LNHANCE discussion, proof-of-concept implementations
Dev teams test Eltoo channels on signet. Rusty Russell and others implement LN-Symmetry prototypes in CLN. Community debates activation path.
2027–2028 (speculative)
Possible BIP118 soft fork activation
If community consensus is reached, BIP118 activates via BIP9 or BIP8 signaling. Nodes upgrade. New Tapscript opcodes become available.
2028–2030 (speculative)
LN implementations adopt LN-Symmetry channel types
LND, CLN, Eclair ship LN-Symmetry as an optional channel type. Nodes negotiate channel type during channel open. Both Poon-Dryja and LN-Symmetry coexist during transition.
2030+ (long-term)
Channel factories, N-party channels become standard
The O(1) storage and symmetric design enables large-scale channel factory deployments. Lightning's on-chain footprint shrinks dramatically as more users share funding UTXOs.

The Promise of Eltoo

Eltoo / LN-Symmetry represents not just an incremental improvement but a fundamental architectural simplification of the Lightning Network. By replacing the punishment-based revocation mechanism with a structurally sound replacement mechanism, it eliminates an entire category of complexity — and enables channel factories that could scale Lightning to hundreds of millions of users.

The cost: a Bitcoin soft fork. The benefit: a simpler, safer, more scalable payment channel network that makes Lightning development easier and Lightning usage safer for everyone.

BIP118 (APO) — Core requirement O(1) channel storage Symmetric transactions Channel factories unlocked