Bitcoin Script vs Ladder Script
Side-by-side comparisons for common spending patterns. Same goal, different approach.
1. Vault with Clawback
Hot key spends after a delay. Cold key sweeps immediately.
Bitcoin Script (OP_VAULT proposal)
OP_VAULT <recovery-spk> <delay> <target-hash>
Requires: BIP-345 soft fork (not activated)
Recovery: OP_VAULT_RECOVER
Unvault: separate tx to OP_UNVAULT output
Trigger: reveal target outputs, wait delay
4 opcodes, 2 transactions minimum
Not available BIP-345 is proposed but not activated on mainnet.
Ladder Script
ladder(vault_lock(@recovery, @hot, 144))
Recovery key: sweeps immediately (no delay)
Hot key: signs + waits 144 blocks
1 block type, 1 transaction
Descriptor: vault_lock(@recovery, @hot, 144)
Native Single block type. Works on signet today.
Ladder Script: Built-in vault primitive. No multi-transaction ceremony. Recovery is one signature, not a separate recovery transaction.
2. Hash Time-Locked Contract (Atomic Swap)
Claim with preimage + signature, or refund after timeout.
Bitcoin Script
OP_IF
OP_SHA256 <hash> OP_EQUALVERIFY
<receiver-pubkey> OP_CHECKSIG
OP_ELSE
<timeout> OP_CHECKLOCKTIMEVERIFY OP_DROP
<sender-pubkey> OP_CHECKSIG
OP_ENDIF
11 opcodes, stack manipulation, branching
Witness: choose IF or ELSE path + data
Works but fragile Script execution is path-dependent. Both branches visible on-chain.
Ladder Script
ladder(or(
htlc(@sender, @receiver, <preimage>, 144),
and(sig(@sender), cltv(900000))
))
1 compound block + 1 fallback rung
Merkelised: only spending rung revealed
Descriptor: htlc(@alice, @bob, hex, 144)
Native HTLC is a single compound block. Unrevealed rung stays private (MLSC).
Ladder Script: HTLC as one typed block. No IF/ELSE branching. Only the spending path is revealed on-chain — the refund path stays private.
3. Rate-Limited Wallet
Cap how much can be spent per block, even if the key is compromised.
Bitcoin Script
Not possible with Bitcoin Script.
No opcode inspects spending rate across blocks.
OP_CHECKTEMPLATEVERIFY can constrain a single
spending transaction but cannot enforce
per-block rate limits over time.
Workaround: pre-signed transaction chains
(requires trust + key management)
Not possible No mechanism for cross-block spending rate enforcement.
Ladder Script
ladder(and(
sig(@owner),
rate_limit(200000, 1000000, 10)
))
Max 200k sats per block
Accumulation cap: 1M sats
Refill: 10 blocks
Descriptor: rate_limit(200000, 1000000, 10)
Native RATE_LIMIT is a single block type. Enforced at consensus.
Ladder Script: Native rate limiting. If your key is compromised, the attacker can only drain at the rate you set. Bitcoin Script has no equivalent.
4. Dollar-Cost Averaging Covenant
A UTXO that can be spent exactly 12 times, splitting off a fixed amount each time.
Bitcoin Script
Not possible without OP_CAT + CTV.
Recursive covenants require introspecting
the spending transaction's outputs.
OP_CTV alone can pre-commit one template.
OP_CAT (not activated) could enable
generalized covenants but with
unconstrained recursion depth.
No bounded recursion primitive exists.
Not possible Requires covenant opcodes not available on mainnet.
Ladder Script
ladder(and(
sig(@owner),
amount_lock(50000, 100000),
recurse_count(12)
))
Count decrements each spend
Terminates at 0 (free spend)
Output must carry same conditions
Descriptor: recurse_count(12)
Native Bounded recursion with automatic termination. No unbounded loops possible.
Ladder Script: Recursive covenants are first-class. Bounded by max_depth or countdown. No OP_CAT needed. The evaluator enforces that outputs carry the correct mutated conditions.
5. Dead Man's Switch (Inheritance)
Owner spends normally. If inactive for ~6 months, heir can claim.
Bitcoin Script
OP_IF
<owner-pubkey> OP_CHECKSIG
OP_ELSE
<26000> OP_CHECKSEQUENCEVERIFY OP_DROP
<heir-pubkey> OP_CHECKSIG
OP_ENDIF
Works but reveals both branches.
No way to "reset" the timer without
moving funds to a new UTXO.
Works Functional but both paths visible. No built-in timer reset.
Ladder Script
ladder(or(
sig(@owner),
and(csv(26000), sig(@heir))
))
Owner path: immediate, private
Heir path: 26,000 blocks (~6 months)
Only spending path revealed (MLSC)
Timer resets on each owner spend
Native Same logic, but only the used path is revealed. Unrevealed rung stays private.
Ladder Script: Same inheritance logic, but with MLSC privacy. The heir path is never revealed unless used. With RECURSE_SAME, each owner spend resets the timer and re-encumbers with identical conditions.
6. Post-Quantum Key Migration
Use a classical key daily, with a post-quantum fallback for long-term security.
Bitcoin Script
Not possible.
Bitcoin Script has no post-quantum
signature verification opcodes.
No soft fork proposal adds PQ support.
Migration requires a hard fork or
a new address type + opcode.
Not possible No PQ signature verification in Bitcoin Script.
Ladder Script
ladder(or(
sig(@daily),
sig(@pq_backup, falcon512)
))
Daily spending: Schnorr (32-byte key)
Recovery: FALCON-512 (897-byte key)
Also: falcon1024, dilithium3, sphincs_sha
Same descriptor notation, same RPC
Native PQ schemes are a 1-byte SCHEME field change. No new opcodes needed.
Ladder Script: Post-quantum support is built into the signature verification. Change one byte (the SCHEME field) to switch from Schnorr to FALCON-512, DILITHIUM3, or SPHINCS+. No new opcodes, no hard fork.
7. Governance-Gated Treasury
2-of-3 multisig + output must go to a specific address + max tx weight.
Bitcoin Script
OP_2 <pk1> <pk2> <pk3> OP_3
OP_CHECKMULTISIG
Multisig: yes.
Output constraints: not possible.
Weight limits: not possible.
Epoch gates: not possible.
Bitcoin Script cannot inspect the
spending transaction's outputs,
weight, or block height modulo.
Partial Multisig works. Output/weight/epoch constraints don't exist.
Ladder Script
ladder(and(
multisig(2, @dir_a, @dir_b, @dir_c),
output_check(0, 1000000, 4294967295, <hash>),
weight_limit(65536),
epoch_gate(100, 100)
))
Multisig + output constraint
+ weight limit + epoch window
All in one rung, all enforced at consensus
Native Transaction-level constraints are first-class block types.
Ladder Script: OUTPUT_CHECK, WEIGHT_LIMIT, INPUT_COUNT, OUTPUT_COUNT, EPOCH_GATE, and RELATIVE_VALUE are all native block types. Bitcoin Script has no transaction introspection beyond signature verification.
Summary
| Pattern | Bitcoin Script | Ladder Script |
|---|---|---|
| Vault with clawback | Not available | vault_lock |
| HTLC (atomic swap) | 11 opcodes | htlc (1 block) |
| Rate-limited wallet | Not possible | rate_limit |
| Recursive covenant (DCA) | Not possible | recurse_count |
| Dead man's switch | IF/ELSE + CSV | or(sig, csv+sig) |
| Post-quantum signatures | Not possible | sig(@pk, falcon512) |
| Governance treasury | Multisig only | multisig + output_check + weight_limit |
Bitcoin Script works for simple signatures, timelocks, and hash locks. For everything else — vaults, rate limiting, covenants, PQ signatures, transaction introspection — it either can't do it or requires proposed opcodes that aren't activated. Ladder Script provides all of these as native, typed block types with bounded execution and deterministic evaluation.