MuSig2/FROST aggregate threshold signature verification. M-of-N signers produce a single aggregate Schnorr signature off-chain. On-chain footprint is identical to single-sig (~131 bytes) regardless of M or N.
Signature Non-Invertible| Field | Data Type | Size | Side | Description |
|---|---|---|---|---|
| threshold_m | NUMERIC | 1-4 B | Conditions | Minimum number of signers required (M) |
| group_size_n | NUMERIC | 1-4 B | Conditions | Total number of signers in the group (N) |
| pubkey | PUBKEY | 32-33 B | Witness | Aggregate public key (verified via Merkle leaf) |
| signature | SIGNATURE | 64-65 B | Witness | Aggregate Schnorr signature (single sig regardless of M/N) |
Public key folded into Merkle leaf via merkle_pub_key (PubkeyCountForBlock = 1). No key field in conditions.
Conditions side (in scriptPubKey):
Witness side (in input witness):
Compared to MULTISIG (3-of-5): 549 bytes → 131 bytes (saves 76%). On-chain, MUSIG_THRESHOLD is indistinguishable from single-sig.
| Condition | Result |
|---|---|
| Missing required fields | ERROR |
| M = 0 or M > N or N > 100 | ERROR |
| PQ signature scheme requested | ERROR |
| Merkle leaf verification fails | UNSATISFIED |
| Schnorr signature verification fails | UNSATISFIED |
| Aggregate key matches commitment AND signature valid | SATISFIED |
{
"type": "MUSIG_THRESHOLD",
"inverted": false,
"fields": [
{ "type": "PUBKEY", "hex": "02abc1...33 bytes" },
{ "type": "NUMERIC", "value": 2 },
{ "type": "NUMERIC", "value": 3 }
]
}{
"type": "MUSIG_THRESHOLD",
"inverted": false,
"fields": [
{ "type": "PUBKEY", "hex": "02abc1...33 bytes" },
{ "type": "SIGNATURE", "hex": "e4f2a1...64 bytes" }
]
}