Upgrading to Bitcoin Core — Ladder Script is being ported from Bitcoin Ghost to a clean Bitcoin Core v30.0 fork. Some tools may be temporarily unavailable.

Transaction Anatomy

How Ladder Script transactions are structured, byte by byte

1. Funding Transaction
A standard Bitcoin input creates a Ladder Script output. This is how coins enter the system.
Version
4 bytes
04000000
Marker
2 B
0001
Input (P2PKH)
~148 bytes
txid + vout + scriptSig + sequence
Output (MLSC)
33 bytes
c2 + root
Locktime
4 bytes
00000000
Version
4 bytes, little-endian

Transaction version 4 signals a RUNG_TX. Nodes without Ladder Script treat it as a standard transaction (soft fork compatibility). The version routes validation to VerifyRungTx instead of VerifyScript.

Input
~148 bytes for P2PKH

The funding input is a standard Bitcoin input: P2PKH, P2WPKH, P2TR, or any existing type. The wallet signs it normally. Ladder Script only governs the output side.

MLSC Output
33 bytes

The scriptPubKey is exactly 33 bytes: 0xC2 prefix + 32-byte Merkle root of the spending conditions. No matter how complex the conditions are, the on-chain footprint is always 33 bytes.

0xC2MLSC prefix (1 byte)
rootSHA-256 Merkle root of conditions, relays, and coil (32 bytes)
2. Spending Transaction
An MLSC input spends a Ladder Script output. The witness carries the conditions and proof.
Version
4 B
04000000
Marker
2 B
Input
41 B
txid + vout + empty scriptSig + seq
Output
33 B
c2 + new root
Witness
variable
ladder witness + MLSC proof
Locktime
4 B

The witness stack has exactly 2 elements:

Witness Stack[0]: Ladder Witness

The serialised rung with all blocks and their witness fields (signatures, pubkeys, preimages), plus coil metadata and relay definitions.

Witness Stack[1]: MLSC Proof

The Merkle proof linking the revealed conditions to the root in the spent output. Contains the rung index, revealed conditions, and sibling hashes.

3. Inside the Ladder Witness
The witness encodes exactly one rung with all its blocks and fields.
Rungs
1 B
01
Blocks
1 B
02
Block 1
header + fields
Block 2
header + fields
Coil
type + scheme + address + destinations
Micro-header encoding

Each block starts with a single byte. Values 0x000x3E are micro-headers that encode the block type via a lookup table. Fields use the implicit layout, so no field count or type bytes are needed. Values 0x80/0x81 are escape codes for full 2-byte type + explicit fields.

0x00SIG
0x01MULTISIG
0x03CSV
0x0ACTV
0x3EOUTPUT_CHECK
0x80Escape (full type follows)
0x81Escape + inverted
Typed fields

Every field has a declared type with enforced size. No arbitrary data is possible.

TypeSizeUsed for
PUBKEY1–2,048 BPublic keys (Schnorr 33B, PQ up to 2KB)
SIGNATURE1–50,000 BSignatures (Schnorr 64B, PQ up to 49KB)
HASH25632 BSHA-256 commitments
NUMERIC1–4 BThresholds, timelocks, counts
SCHEME1 BSignature scheme selector
PREIMAGE32 BHash preimage (max 2 per witness)
Coil

Defines what happens when a rung is satisfied.

coil_typeUNLOCK (0x01) or UNLOCK_TO (0x02). All other values rejected.
attestationINLINE (0x01). All other values rejected.
schemeSCHNORR, ECDSA, or PQ scheme
address_hash0 or 32 bytes (destination for UNLOCK_TO)
rung_destinationsPer-rung destination overrides
4. Funding vs Spending
Funding (coins enter)

Input: any standard Bitcoin output

Output: 0xC2 + 32-byte Merkle root

Witness: standard Bitcoin witness

The funding wallet needs the Ladder Script library (or the engine/RPC) to compute the MLSC root from the desired conditions. The output itself is just 33 bytes, but constructing it requires building the Merkle tree.

Spending (coins leave)

Input: references the MLSC output

Output: another MLSC output

Witness: ladder witness + MLSC proof

The node verifies the Merkle proof, merges conditions with witness, and evaluates the ladder.

5. Verification flow

1. Node sees tx version 4, input spending an MLSC output

2. Routes to VerifyRungTx

3. Validates all outputs are MLSC format

4. Deserialises witness stack[0] as LadderWitness

5. Deserialises witness stack[1] as MLSCProof

6. Extracts pubkeys from witness blocks (merkle_pub_key)

7. Verifies Merkle proof against root from spent output

8. Merges conditions with witness into single structure

9. Evaluates the ladder (AND within rung, OR across rungs)

10. If SATISFIED, the input is valid