Loading vLEI.wiki
Fetching knowledge base...
Fetching knowledge base...
This comprehensive explanation has been generated from 61 GitHub source documents. All source documents are searchable here.
Last updated: October 7, 2025
This content is meant to be consumed by AI agents via MCP. Click here to get the MCP configuration.
Note: In rare cases it may contain LLM hallucinations.
For authoritative documentation, please consult the official GLEIF vLEI trainings and the ToIP Glossary.
The signing threshold is a critical parameter in KERI's multi-signature infrastructure that specifies the minimum number of valid cryptographic signatures—or the minimum fractional weight of signatures—that must be present on a message for that message to be considered fully signed and authorized. This threshold mechanism enables flexible governance models ranging from simple M-of-N schemes to sophisticated fractionally-weighted voting systems.
In KERI's formal model, the signing threshold appears in two distinct contexts:
kt): The threshold for the current set of signing keys, which validates non-establishment events and the signing portion of establishment eventsnt): The threshold for pre-rotated keys, which validates the rotation authority in subsequent establishment eventsThe signing threshold is represented as either:
"2") indicating the exact number of signatures required"1/2") indicating a proportional requirement relative to total key weightsSigning thresholds serve multiple critical functions in the KERI protocol:
Authorization Control: They define the minimum consensus required for any operation, from simple message signing to complex key rotation events. This enables organizations to implement governance policies that require multiple parties to approve critical actions.
Security Scaling: By requiring multiple signatures, thresholds provide exponential security improvements. An attacker must compromise multiple independent key sources rather than a single key, dramatically increasing the difficulty of unauthorized operations.
For simple integer thresholds, validation is straightforward:
For fractionally-weighted thresholds:
The tholder object in KERIpy provides reference implementation for fractional threshold logic.
Rotation events require validating against two thresholds:
Prior Next Threshold Validation:
nt (next threshold) and n (next key digests)k fieldCurrent Threshold Validation:
kt (current threshold) and k (current keys)Both validations must pass for the rotation to be valid.
When configuring witness thresholds, use the ample formula to ensure Byzantine fault tolerance:
Given:
n = total number of witnesses
f = maximum number of faulty witnesses to tolerate
Constraints:
f ≥ 1 (if n > 0)
n ≥ 3*f + 1
Ample threshold m must satisfy:
(n + f + 1)/2 ≤ m ≤ n - f
For example, with 5 witnesses tolerating 1 fault:
When changing thresholds during rotation:
Operational Flexibility: Different thresholds can be set for different operations. For example, a custodial rotation might use a lower threshold for day-to-day signing operations while maintaining a higher threshold for key rotation authority.
Delegation Patterns: Thresholds enable sophisticated delegation hierarchies where signing authority can be separated from rotation authority, allowing operational delegation without surrendering ultimate control.
Signing thresholds in KERI are classified into several types:
Simple Integer Thresholds: The most common form, specifying an exact number of required signatures. A threshold of "2" in a 3-key configuration creates a 2-of-3 multisig scheme.
Fractionally-Weighted Thresholds: Advanced configurations where different keys carry different weights. A threshold of "1/2" requires signatures totaling at least half the total weight. This is managed by the tholder object in KERI implementations.
Ample Thresholds: A special calculated threshold that ensures Byzantine fault tolerance. The ample value guarantees that at most one sufficient agreement can occur, preventing split consensus even with faulty participants.
KERI's signing threshold mechanism implements a form of Threshold Signature Scheme (TSS), though with important distinctions from traditional cryptographic TSS implementations:
Non-Interactive Verification: Unlike some TSS schemes that require interactive protocols, KERI's threshold verification is non-interactive. Each signature is independently verifiable against its corresponding public key, and threshold satisfaction is determined by counting valid signatures.
Flexible Cryptographic Agility: KERI supports multiple signature algorithms simultaneously within a single threshold configuration. Different keys in the set may use different cryptographic suites (Ed25519, ECDSA, etc.), with the threshold applying to the count or weight of valid signatures regardless of algorithm.
Post-Quantum Readiness: The threshold mechanism is algorithm-agnostic, allowing seamless integration of post-quantum signature schemes as they become standardized. The threshold logic remains unchanged while the underlying signature algorithms can be upgraded.
Fault Tolerance: A properly configured threshold provides resilience against key compromise. In an M-of-N scheme, up to (N-M) keys can be compromised without losing security, as long as M honest keys remain.
Liveness Guarantees: The threshold must be set such that enough keys are available to meet it under normal operations. Setting thresholds too high can create operational deadlock if key holders become unavailable.
Byzantine Resistance: When combined with witness infrastructure and the KAACE algorithm, thresholds provide Byzantine fault tolerance. The ample calculation ensures that even with faulty participants, at most one valid consensus can emerge.
Dual Threshold Architecture: KERI's pre-rotation mechanism requires managing two thresholds:
This dual structure enables partial rotation, where only a threshold-satisfying subset of pre-rotated keys participates in a rotation event, with others held in reserve.
Threshold Transitions: During rotation events, both the prior next threshold and the new current threshold must be satisfied. This ensures cryptographic continuity across key state changes.
Signing thresholds appear in CESR-encoded key events as JSON string fields within the event message body. The threshold is not itself a CESR primitive but rather a parameter that governs how CESR-encoded signatures are validated.
In Inception Events:
{
"v": "KERI10JSON0000e6_",
"t": "icp",
"d": "EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w",
"i": "EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w",
"s": "0",
"kt": "2",
"k": [
"DaU6JR2nmwyZ-i0d8JZAoTNZH3ULvYAfSVPzhzS6b5CM",
"DwJh1Xl2lkqZG4NTdUdqnbFJDa6ZyxCCBJq7UABlttIN",
"D1zxxf8u4Hx5IPraZzmStfSCZFZbDzMHjqVcFW5OfPBD"
],
"nt": "2",
"n": [
"ETNZH3ULvYawyZ-i0d8JZU6JR2nmAoAfSVPzhzS6b5CM",
"EYAfSVPzhzaU6JR2nmoTNZH3ULvwyZb6b5CMi0d8JZAS",
"EnmwyZdi0d8JZAoTNZYAfSVPzhzaU6JR2H3ULvS6b5CM"
],
"bt": "2",
"b": [
"BBilc4-L3tFUnfM_wJr4S4OJanAv_VmF_dJNN6vkf2Ha",
"BLskRTInXnMxWaGqcpSyMgo0nYbalW99cGZESrz3zapM"
],
"c": [],
"a": []
}
In this example:
"kt": "2" specifies the current signing threshold of 2 signatures required from the 3 keys in the k array"nt": "2" specifies the next threshold of 2 signatures required from the 3 pre-rotated key digests in the n array"bt": "2" specifies the witness threshold (TOAD) of 2 witness receipts requiredIn Rotation Events:
{
"v": "KERI10JSON000160_",
"t": "rot",
"d": "E8JZAoTNZH3ULvYAfSVPzhzS6b5CMaU6JR2nmwyZ-i0d",
"i": "EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w",
"s": "1",
"p": "EH7Oq9oxCgYa-nnNLvwhp9sFZpALILlRYyB-6n4WDi7w",
"kt": "2",
"k": [
"DTNZH3ULvYawyZ-i0d8JZU6JR2nmAoAfSVPzhzS6b5CM",
"DYAfSVPzhzaU6JR2nmoTNZH3ULvwyZb6b5CMi0d8JZAS"
],
"nt": "2",
"n": [
"EJR2nmwyZ2i0dzaU6ULvS6b5CM8JZAoTNZH3YAfSVPzh",
"ETNZH3ULvS6bYAfSVPzhzaU6JR2nmwyZfi0d8JZ5s8bk"
],
"br": [],
"ba": [],
"a": []
}
The rotation event maintains threshold fields that may differ from the prior event, enabling threshold changes during rotation.
Threshold values are represented as JSON string fields in the text domain and as UTF-8 encoded strings in the binary domain. They are not separately CESR-encoded primitives but rather parameters within the event structure.
Integer Thresholds: Simple numeric strings like "1", "2", "3"
Fractional Thresholds: Rational number strings like "1/2", "2/3", "3/5"
The tholder object in KERI implementations parses these strings and manages the threshold logic, including fractional weight calculations.
Thresholds themselves do not have derivation codes, as they are not cryptographic primitives. However, the keys that thresholds apply to are CESR primitives with derivation codes indicating their cryptographic type:
D prefix: Ed25519 public key (44 characters)1AAA prefix: ECDSA secp256k1 public keyE prefix: Blake3-256 digest (used for pre-rotated key commitments)The threshold mechanism is algorithm-agnostic, operating on the count or weight of valid signatures regardless of the underlying cryptographic scheme.
Signing thresholds are fundamental to all establishment events in KERI:
Inception Events: The initial establishment event that creates an AID must specify:
kt: Current signing threshold for the initial key setnt: Next threshold for pre-rotated keysThese thresholds define the governance model from the identifier's inception.
Rotation Events: Each rotation event specifies:
kt: New current threshold (may differ from prior)nt: New next threshold for subsequent rotationRotation events must satisfy two thresholds:
This dual validation is critical for partial rotation scenarios.
Interaction events and other non-establishment events must satisfy the current threshold from the most recent establishment event. These events do not change key state but must prove authorization from the current key set.
The witness threshold (field bt for "backer threshold" or TOAD - Threshold of Accountable Duplicity) specifies how many witness receipts are required for an event to be considered fully witnessed. This is distinct from but analogous to the signing threshold.
The witness threshold must satisfy the ample constraint to ensure Byzantine fault tolerance:
n witnesses and f potentially faulty witnessesm must satisfy: (n + f + 1)/2 ≤ m ≤ n - fThis ensures that at most one valid consensus can emerge even with faulty witnesses.
When using delegated identifiers, thresholds apply at each level of the delegation tree:
Delegator Threshold: The delegating identifier's threshold must be satisfied to approve delegation events
Delegate Threshold: The delegated identifier has its own independent threshold for its operations
This enables hierarchical governance where different organizational levels maintain appropriate threshold policies.
Single-Signature (1-of-1): Simplest case, used for individual identifiers or testing:
"kt": "1",
"k": ["DaU6JR2nmwyZ-i0d8JZAoTNZH3ULvYAfSVPzhzS6b5CM"]
Simple Multisig (M-of-N): Common for organizational identifiers:
"kt": "2",
"k": [
"DaU6JR2nmwyZ-i0d8JZAoTNZH3ULvYAfSVPzhzS6b5CM",
"DwJh1Xl2lkqZG4NTdUdqnbFJDa6ZyxCCBJq7UABlttIN",
"D1zxxf8u4Hx5IPraZzmStfSCZFZbDzMHjqVcFW5OfPBD"
]
This 2-of-3 configuration requires any 2 of the 3 key holders to sign.
Fractionally-Weighted: Advanced governance with weighted voting:
"kt": "1/2",
"k": [
"DaU6JR2nmwyZ-i0d8JZAoTNZH3ULvYAfSVPzhzS6b5CM", // weight: 1/3
"DwJh1Xl2lkqZG4NTdUdqnbFJDa6ZyxCCBJq7UABlttIN", // weight: 1/3
"D1zxxf8u4Hx5IPraZzmStfSCZFZbDzMHjqVcFW5OfPBD" // weight: 1/3
]
Requires signatures totaling at least 1/2 of total weight (any 2 of 3 equal-weight keys).
To verify that a message satisfies its signing threshold:
Extract the threshold value from the relevant establishment event (current threshold for non-establishment events, both current and prior next thresholds for rotation events)
Parse attached signatures from the CESR stream following the event message
Verify each signature against its corresponding public key from the key list
Count valid signatures (or sum fractional weights for weighted schemes)
Compare to threshold: If count/weight ≥ threshold, the message is fully signed
For rotation events, this process must be performed twice:
The tholder (threshold holder) is the implementation object that manages signing threshold logic, particularly for fractionally-weighted schemes. It provides methods to:
Signing thresholds work in conjunction with indexed signatures (also called sigers). Each signature attachment includes an index indicating which key from the key list was used to create it. This indexing is essential for threshold verification, as it maps signatures to their corresponding public keys.
In CESR streams, signature attachments use count codes to indicate how many signatures follow. The count code enables parsers to extract the correct number of signatures, which are then validated against the threshold.
While signing thresholds apply to controller signatures, witness receipts have their own threshold mechanism (the witness threshold or TOAD). Both threshold types work together to provide comprehensive validation of key events.
Implementations must carefully handle threshold validation, particularly for:
Partial Rotation: When only a subset of pre-rotated keys participate in a rotation, the implementation must verify that the participating keys satisfy the prior next threshold while the new key set satisfies the new current threshold.
Fractional Weights: The tholder object must correctly parse fractional threshold strings and perform rational arithmetic to determine if weighted signatures satisfy the threshold.
Edge Cases: Implementations must handle:
Threshold Selection: Choosing appropriate thresholds requires balancing security and operational requirements:
Key Management: Threshold schemes require careful key management:
Threshold Transitions: Changing thresholds during rotation requires careful planning:
Higher thresholds require more signatures, which impacts:
Implementations should optimize signature verification through:
Different KERI implementations must agree on threshold semantics:
The KERI specification provides normative guidance to ensure consistent threshold behavior across implementations.
Implementations must handle:
Parallel Verification: Signature verification is embarrassingly parallel—verify multiple signatures concurrently
Early Termination: Stop verification once threshold is satisfied (no need to verify remaining signatures)
Caching: Cache verification results for repeated validations of the same event
Batch Verification: Some signature schemes support batch verification for improved performance