{{ r.body }}
Distinction
What this protocol is, and what it is not.
The original mixed explainer made the motions visible, but it let protocol and implementation names bleed together. This fork gives each page its own object model, payment path, maintenance path, liquidity burden, and failure mode.
{{ bk.body }}
bucket 1 is never operator liquidity, however large it gets · the “operator liquidity” callout below tracks bucket 2 · “third parties in practice” tracks bucket 3
Flow
Five-person example flow.
Step through the timeline one slot at a time or jump directly to a highlighted event. Amounts, fees, and timings are illustrative examples, not protocol constants.
- {{ bi.text }}
-
{{ tr.root.kind }}{{ tr.root.pub }}{{ tr.root.id }}{{ tr.root.amt }}{{ tr.root.note }}{{ tr.root.script }}
-
{{ n1.kind }}{{ n1.pub }}{{ n1.id }}{{ n1.amt }}{{ n1.note }}{{ n1.script }}
-
{{ n2.kind }}{{ n2.pub }}{{ n2.id }}{{ n2.amt }}{{ n2.note }}{{ n2.script }}
-
{{ n3.kind }}{{ n3.pub }}{{ n3.id }}{{ n3.amt }}{{ n3.note }}{{ n3.script }}
-
{{ n4.kind }}{{ n4.pub }}{{ n4.id }}{{ n4.amt }}{{ n4.note }}{{ n4.script }}
-
-
-
-
Blueprint
The original sketch: four people, one coin, thirty days.
Every protocol on this page descends from one short drawing: Ruben Somsen's “Simplest Ark explanation”. His cases — holding, sending, the swap, the four outcomes, the shared tree, the lonely exit, the server's locked pile — are replayed here with four people, real amounts, and a calendar. Fees are ignored, “day 30” stands in for any timelock, and the scripts are Ruben's simplified pseudoscript, not literal Bitcoin script. On the other protocol tabs, this section becomes the delta: what each design keeps from this sketch, and what it throws away.
“Alice gives a coin to the Server, provided the Server gives a coin to Bob. There is no trust involved.”the whole protocol in one sentence · everything below is enforcement detail
One on-chain coin, four owners, a tree of escape hatches.
Alice, Bob, Carol, and Dave pool 1.00 BTC into a single on-chain output, UTXO_1. Bitcoin sees exactly one coin. Underneath it, everyone pre-signs a tree of transactions that nobody intends to publish: two branch outputs splitting the coin, four leaves — one per person — and, hanging off each leaf, that person's REDEEM_TX. The redeem is the escape hatch: publish your path through the tree, left to right, and it pays you out with nobody's permission. Every box in the diagram except UTXO_1 lives in wallets, not on the chain.
-
depth 0 · on-chainUTXO_11.00 BTCA+B+C+D+SorS after day 30
-
depth 1 · presignedBRANCH_AB0.65 BTCA+B+SorS after day 30
-
depth 2 · presignedLEAF_A0.40 BTCA+SorS after day 30
-
depth 3 · presignedREDEEM_A0.40 BTCA+SorA after a 30-day wait
-
-
depth 2 · presignedLEAF_B0.25 BTCB+SorS after day 30
-
depth 3 · presignedREDEEM_B0.25 BTCB+SorB after a 30-day wait
-
-
-
depth 1 · presignedBRANCH_CD0.35 BTCC+D+SorS after day 30
-
depth 2 · presignedLEAF_C0.20 BTCC+SorS after day 30
-
depth 3 · presignedREDEEM_C0.20 BTCC+SorC after a 30-day wait
-
-
depth 2 · presignedLEAF_D0.15 BTCD+SorS after day 30
-
depth 3 · presignedREDEEM_D0.15 BTCD+SorD after a 30-day wait
-
-
-
Two catches, both from the gist. Building this tree needs everyone — A+B+C+D+S — to pre-sign together, which is the interactivity a covenant opcode like OP_CTV would remove. But after day 0, nobody ever needs the other three again: to spend, you talk only to S. That single change is what separates Ark from the older payment-pool designs, where every spend meant herding the whole pool.
Two payments, nobody paid on-chain — and one brand-new coin.
Alice owes Dave 0.10; Bob owes Carol 0.05. Neither payment touches UTXO_1. Instead, S batches both into a new coin it funds from its own pocket: UTXO_2, 0.65 BTC, with fresh leaves for Alice's change (0.30), Bob's change (0.20), Carol (0.05), and Dave (0.10) — each with its own dashed REDEEM_TX, exactly like day 0. In exchange, Alice and Bob each sign a FORFEIT_TX: “S may take my old redeem output — but only in a world where UTXO_2 actually exists.” The moment UTXO_2 confirms, the swap is atomic: the old claims belong to S, the new claims to their owners. Until it confirms, nothing has moved — treat the payment as instant only if you trust S not to rework pending transactions.
-
depth 0 · on-chainUTXO_11.00 BTC
-
depth 1 · presignedBRANCH_AB0.65 BTC
-
depth 2 · presignedLEAF_A0.40 BTC
-
depth 3 · presignedREDEEM_A0.40 BTC
-
depth 4 · new on day 3FORFEIT_A0.40 BTCS — needs UTXO_2's anchor as a second inputorA after a 30-day wait
-
-
-
-
-
depth 0 · on-chainUTXO_20.65 BTCA+B+C+D+SorS after day 33
-
depth 1 · presignedBRANCH_AB′0.50 BTCA+B+SorS after day 33
-
depth 2 · changeLEAF_A′0.30 BTCA+SorS after day 33
-
depth 2 · changeLEAF_B′0.20 BTCB+SorS after day 33
-
-
depth 1 · presignedBRANCH_CD′0.15 BTCC+D+SorS after day 33
-
depth 2 · paidLEAF_C′0.05 BTCC+SorS after day 33
-
depth 2 · paidLEAF_D′0.10 BTCD+SorS after day 33
-
-
Carol and Dave now hold claims under two different roots at once — their untouched day-0 leaves in UTXO_1, plus their new leaves in UTXO_2, each root with its own clock. And note who had to be online: everyone with a leaf in UTXO_2 pre-signs its tree before it goes on-chain. That is the recipient interactivity the gist flags, and the thing later designs (and CTV) work to remove.
The same swap, four endings.
Everything above is machinery for exactly one guarantee: whatever anyone does after the swap is agreed, they cannot come out ahead by misbehaving. Run Alice-pays-Dave through all four worlds:
UTXO_2 confirms; Carol and Dave are paid. Every redeem transaction stays in its drawer. On day 30 the “S after day 30” clause matures and S sweeps UTXO_1 with one transaction. Total chain footprint: two coins, no matter how many payments rode inside.
After UTXO_2 confirms, she publishes REDEEM_A anyway. S answers with FORFEIT_A — valid precisely because UTXO_2 exists — and takes the 0.40 long before Alice's 30-day wait matures. She bought fee bills and nothing else.
UTXO_2 never appears, so FORFEIT_A can never be valid — its anchor input doesn't exist. Alice publishes REDEEM_A, waits out her 30 days, and takes her 0.40 back. Dave wasn't paid, but nobody was robbed. That is what “atomic” buys.
She neither swaps nor publishes her redeem before UTXO_1's clock runs out. The “S after day 30” clause matures and S can claim her arm. The one non-negotiable obligation in this design: come back online before expiry.
Carol walks out alone — and the tree unfolds behind her.
Carol never spent her day-0 leaf, and she has decided not to ask S for anything. So she publishes her path down the tree, transaction by transaction, paying a fee for each hop:
The server's books: front now, recover later.
S is not a custodian on the normal path — every user keeps a unilateral exit before expiry. But S does run a balance sheet: it funds new coins now, receives forfeits, and sweeps expired or forfeited branches later. The problem is not custody; it is timing — new money goes out today, old money comes back at maturity, and that gap is the liquidity requirement. The whole month, from S's side of the desk:
In this sketch, every cooperative payment is a server-funded swap, so: required treasury ≈ liquidity-consuming volume per period × lockup period. Ruben's back-of-envelope:
1 BTC of server-funded swaps every 10 min × 30-day recovery = 6 × 24 × 30 ≈ 4,320 BTC lockedThree assumptions make it brutal: every 10 minutes mints 1 BTC of new server-funded claims, nothing recovers before day 30, and no capital is reused. It is a stress-case intuition for this sketch, not a protocol constant — real designs attack all three assumptions, and price what remains:
liquidity cost ≈ amount × (days until recovery / 365) × BTC opportunity rate + on-chain fees + marginBitcoin script cannot say “spendable only if some other UTXO exists.” So the transaction that creates UTXO_2 also carries a tiny ANCHOR output only S can spend, and Alice's FORFEIT_TX takes that anchor as a second input.
FORFEIT_A inputs: [ REDEEM_A output ] + [ UTXO_2's anchor ]Now the forfeit literally cannot confirm unless UTXO_2 confirmed first. An impossible script condition becomes an ordinary transaction dependency.
Here, every cooperative payment is shown as a server-funded swap into a new shared coin — that is what makes this sketch liquidity-heavy. Modern Bark-style systems split the world differently: internal Ark payments happen out-of-round and need no fresh server liquidity; refreshes, offboards, and Lightning are the operations that consume it. Arkade's version of the same split: preconfirmations are free, batch settlements front capital, and expiry exists precisely so that capital recycles. Each protocol tab's “Operator liquidity” callout states its own version.
Vs original Ark
{{ vsArkTitle }}
{{ vsArkLead }}
{{ vsArkLiq }}
{{ vsArkTp }}
left: Ruben's sketch (the Original Ark tab) · right: this protocol
Sources