Taproot Coverage Audit

BINST was designed to live as close to Bitcoin L1 as possible. This page cross-references every feature introduced by the Taproot upgrade (BIPs 340, 341, 342) against what the pilot actually uses, deliberately skips, or defers to production.

Features We Use

Taproot FeatureBIPWhere We Use It
P2TR output (SegWit v1)341Vault address (tb1p... / bc1p...) — every inscription UTXO is locked to a Pay-to-Taproot output
x-only public keys (32 bytes)340Admin key, committee keys, NUMS internal key — all stored and transmitted as 32-byte x-only keys, saving 1 byte vs compressed ECDSA
Schnorr signatures (64 bytes)340Admin single-sig (Leaf 0) and committee multi-sig (Leaf 1) — 64-byte Schnorr sigs replace 71–72-byte ECDSA sigs
MAST (Merkelized Alternative Script Tree)3412-leaf script tree: Leaf 0 (admin + CSV) and Leaf 1 (committee override). Only the exercised leaf is revealed on-chain — the other stays hidden
Tagged hashes341TapLeaf, TapBranch, TapTweak — domain-separated SHA-256 used for tree construction and output key derivation
Taptweak (Q = P + t·G)341NUMS internal key + Merkle root → tweaked output key. This is the core of BIP 341 key commitment
NUMS internal key341Provably unspendable point — disables key-path spend entirely, forcing all spends through the script tree
Script-path spend341Both vault unlock paths (admin and committee) use Taproot script-path spending with control blocks
Control blocks341(parity | leaf_version) || internal_key || sibling_hash — built for both leaves, enabling Taproot proof-of-inclusion
Leaf version 0xc0342All leaf scripts use the BIP 342 Tapscript leaf version
OP_CHECKSIG (Schnorr variant)342Admin leaf — single-key Schnorr signature check
OP_CHECKSIGADD342Committee leaf — the BIP 342 replacement for OP_CHECKMULTISIG (which is disabled in Tapscript). Accumulates a counter across multiple signature checks
OP_CHECKSEQUENCEVERIFY (CSV)112Admin leaf — enforces 144-block (~24h) relative timelock before the admin can move the inscription UTXO
Schnorr precompile on Citrea340Citrea's precompile at 0x…0200 can verify BIP-340 Schnorr signatures in Solidity — used for Bitcoin-key-based L2 authorization
Ordinals inscription in witness341The inscription envelope lives inside Tapscript witness data. Taproot's witness discount makes inscriptions economically viable
Bech32m address encoding341All P2TR addresses use Bech32m (BIP 350), distinct from SegWit v0's Bech32

Features We Deliberately Skip

Taproot FeatureBIPWhy We Skip It
Key-path spend341We kill it with the NUMS internal key. The entire purpose of the vault is to prevent accidental spending — a live key-path would let any Taproot-aware wallet move the inscription UTXO.
Key aggregation / MuSig2340MuSig2 aggregates N public keys into a single key for key-path spend. Since we disable the key-path, there is no aggregated key to spend with. For the committee, we use OP_CHECKSIGADD in a script leaf instead — this is simpler, independently auditable, and requires no interactive MuSig signing rounds between committee members.
Batch signature verification340Batch verification is a node-level optimization: Bitcoin Core can verify N Schnorr signatures faster than verifying them individually. This is transparent to script authors — our transactions benefit automatically when nodes use batch validation. There is nothing to implement.
Annex field341The annex is a reserved witness field (identified by the 0x50 prefix) with no current consensus meaning. It is reserved for future soft-fork extensions. No use case today.
OP_SUCCESS opcodes342These are upgrade placeholders that make unrecognized opcodes succeed unconditionally, allowing future soft forks to assign them new semantics. They exist precisely so that new opcodes can be added without a hard fork. Nothing to use today.

Design Rationale

Why kill the key-path?

In a normal P2TR workflow, the key-path is the happy path — it looks like a regular single-sig spend and provides maximum privacy. BINST deliberately sacrifices this because the vault's primary job is to prevent spending:

  • The inscription UTXO is the root of authority
  • Accidental spending = loss of the institution
  • The NUMS point makes the key-path provably dead
  • All spends must go through a script leaf with explicit conditions

This is the correct tradeoff for a protocol where the UTXO represents identity, not money.

Why OP_CHECKSIGADD instead of MuSig2?

MuSig2 would produce a cleaner on-chain footprint (single key, single sig), but it requires:

  1. Interactive signing rounds between committee members
  2. Nonce commitment coordination (two rounds minimum)
  3. Specialized MuSig2 software on each signer's machine
  4. All parties online at roughly the same time

OP_CHECKSIGADD in a Tapscript leaf is:

  1. Non-interactive — each member signs independently
  2. Standard tooling — any BIP-340 Schnorr signer works
  3. Auditable — the script is human-readable and each signature is individually verifiable
  4. PSBT-compatible — members sign via PSBT (BIP 174/371) without being online simultaneously

For an emergency recovery mechanism (which the committee path is), simplicity and independence matter more than on-chain size.

Potential Future Enhancements

These Taproot-adjacent features are not in the pilot but could be adopted in production:

EnhancementBasisWhat It EnablesComplexity
MuSig2 aggregated key-path (separate vault variant)BIP 340Aggregate committee keys into one key for key-path spend. Looks like a regular P2TR on-chain → maximum privacy. Script tree remains as fallback.High — requires MuSig2 signing infrastructure
Deeper MAST trees (3+ leaves)BIP 341Add a third leaf: e.g., a dead-man switch that becomes spendable after 1 year of inactivity, or a dedicated "migrate to covenant vault" leafMedium — straightforward script extension
Schnorr-signed L2 actions (single-wallet UX)BIP 340Admin signs L2 transactions with their Bitcoin Schnorr key via Citrea's precompile → one wallet, one identity, both layersMedium — needs account abstraction on L2
Covenants (OP_CTV / OP_CAT)ProposedRestrict the output of a vault spend — the UTXO can only move to a pre-approved address. True on-chain spending constraints.Requires soft fork (not yet activated)
Batch inscriptions in one treeBIP 341Embed multiple inscription commitments in different MAST leaves of a single transaction, reducing on-chain cost for multi-template institutionsLow–Medium

Summary

BINST uses every active Taproot feature relevant to its design goal of UTXO-locked institutional identity:

  • ✅ P2TR outputs with Bech32m
  • ✅ MAST script tree (2 leaves, hidden until spent)
  • ✅ Schnorr signatures (64 bytes, provably secure)
  • ✅ OP_CHECKSIGADD (BIP 342 multisig)
  • ✅ Tagged hashes and taptweak for key commitment
  • ✅ NUMS point to disable key-path
  • ✅ Control blocks for script-path proofs
  • ✅ CSV timelocks in Tapscript
  • ✅ Schnorr precompile on L2

The features we skip (key-path, MuSig2, annex, OP_SUCCESS) are either deliberately disabled for security, irrelevant to script authors, or reserved for future upgrades. No Taproot capability is left on the table without a documented reason.


Post-Quantum Considerations

See the dedicated Post-Quantum Analysis page for a full assessment of how Taproot's P2PK structure affects BINST and what mitigations are already in place.

References