Skip to main content
The Clementine protocol uses various signature types for different transaction scenarios. Signatures are categorized into normal signatures (used once) and numbered signatures (used multiple times).

TaggedSignature

A signature with metadata identifying the transaction input it corresponds to.
normal_signature
NormalSignatureId
Identifier for normal (single-use) signatures
numbered_signature
NumberedSignatureId
Identifier for numbered (multi-use) signatures
signature
bytes
required
The actual signature bytes
The signature ID is set to NotStored for signatures created on-the-fly by the operator (these are not stored).

NormalSignatureKind

Signature types that are needed once per deposit transaction.
NormalSignatureUnknown
enum
default:"0"
Unknown or unspecified signature type
OperatorSighashDefault
enum
default:"1"
Used for transaction handlers that verifiers don’t care about. Created on-the-fly by the operator.
Challenge
enum
default:"2"
Challenge transaction signature
DisproveTimeout2
enum
default:"3"
Second disprove timeout signature
Disprove2
enum
default:"4"
Second disprove signature
Reimburse1
enum
default:"5"
First reimbursement signature
KickoffNotFinalized1
enum
default:"6"
First kickoff not finalized signature
KickoffNotFinalized2
enum
default:"7"
Second kickoff not finalized signature
Reimburse2
enum
default:"8"
Second reimbursement signature
NoSignature
enum
default:"9"
No signature required
ChallengeTimeout2
enum
default:"10"
Second challenge timeout signature
MiniAssert1
enum
default:"11"
First mini assert signature
OperatorChallengeAck1
enum
default:"12"
First operator challenge acknowledgment signature
NotStored
enum
default:"13"
Signature not stored (created on-the-fly)
YieldKickoffTxid
enum
default:"14"
Yield kickoff transaction ID signature
LatestBlockhashTimeout1
enum
default:"15"
First latest blockhash timeout signature
LatestBlockhashTimeout2
enum
default:"16"
Second latest blockhash timeout signature
LatestBlockhashTimeout3
enum
default:"17"
Third latest blockhash timeout signature
LatestBlockhash
enum
default:"18"
Latest blockhash signature

NumberedSignatureKind

Signature types that are needed multiple times per operator kickoff. Some watchtower signatures are needed once per watchtower, while assert signatures are needed multiple times.
NumberedSignatureUnknown
enum
default:"0"
Unknown or unspecified numbered signature type
NumberedNotStored
enum
default:"1"
Numbered signature not stored (created on-the-fly by operator)
OperatorChallengeNack1
enum
default:"2"
First operator challenge negative acknowledgment
OperatorChallengeNack2
enum
default:"3"
Second operator challenge negative acknowledgment
OperatorChallengeNack3
enum
default:"4"
Third operator challenge negative acknowledgment
AssertTimeout1
enum
default:"5"
First assert timeout signature
AssertTimeout2
enum
default:"6"
Second assert timeout signature
AssertTimeout3
enum
default:"7"
Third assert timeout signature
UnspentKickoff1
enum
default:"8"
First unspent kickoff signature
UnspentKickoff2
enum
default:"9"
Second unspent kickoff signature
WatchtowerChallengeTimeout1
enum
default:"10"
First watchtower challenge timeout
WatchtowerChallengeTimeout2
enum
default:"11"
Second watchtower challenge timeout
WatchtowerChallenge
enum
default:"12"
Watchtower challenge signature

Signature Models

SchnorrSig

Schnorr signature wrapper.
schnorr_sig
bytes
required
Schnorr signature bytes

PartialSig

Partial signature used in MuSig2 protocol.
partial_sig
bytes
required
Partial signature bytes for aggregation

DepositSignatures

Collection of tagged signatures for a deposit.
signatures
repeated TaggedSignature
required
Array of tagged signatures with their identifiers

Nonce Generation

NonceGenRequest

Request to generate nonces for MuSig2 signing.
num_nonces
uint32
required
Number of nonces to generate

NonceGenFirstResponse

Initial response from nonce generation containing session metadata.
id
string
required
Nonce session ID (string representation of u128 number)
num_nonces
uint32
required
Number of nonces generated

NonceGenResponse

Streamed nonce generation response.
first_response
NonceGenFirstResponse
First response with session metadata (sent once)
pub_nonce
bytes
Individual public nonce (streamed multiple times)

Challenge ACK Digest

Digest used for challenge acknowledgment.
hash
bytes
required
Challenge ACK hash

Winternitz Public Key

Winternitz signature public key used for commitment schemes.
digit_pubkey
repeated bytes
required
Array of digit public keys forming the Winternitz public key
Winternitz signatures are used in the Clementine protocol for BitVM assert transactions and blockhash commitments.

Example Usage

Tagged Signature with Normal Signature

{
  "normal_signature": {
    "signature_kind": "Challenge"
  },
  "signature": "<64_bytes_schnorr_signature>"
}

Tagged Signature with Numbered Signature

{
  "numbered_signature": {
    "signature_kind": "AssertTimeout1",
    "idx": 5
  },
  "signature": "<64_bytes_schnorr_signature>"
}

Build docs developers (and LLMs) love