# Firmantes de sBTC

### Resumen

El [contrato sBTC Signers](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-bootstrap-signers.clar) (`sbtc-bootstrap-signers.clar`) gestiona el conjunto de firmantes para el sistema sBTC. Maneja la rotación de las claves de firma y proporciona utilidades para generar direcciones multisig.

**Constantes**

* `key-size`: La longitud requerida de las claves públicas (33 bytes).

**Constantes de error**

* `ERR_KEY_SIZE_PREFIX`: Prefijo para errores de tamaño de clave en el procesamiento por lotes.
* `ERR_KEY_SIZE` (u200): Indica que una clave proporcionada no tiene la longitud correcta.
* `ERR_INVALID_CALLER` (u201): Significa que quien llama a la función no es el principal firmante actual.
* `ERR_SIGNATURE_THRESHOLD` (u202): Indica un umbral de firma no válido (debe ser >50% y ≤100% del total de claves de firmantes).

#### Funciones públicas

**`rotate-keys-wrapper`**

Rota las claves de los firmantes. Se llama cuando se actualiza el conjunto de firmantes.

* Parámetros:
  * `new-keys`: `(list 128 (buff 33))` - Lista de nuevas claves públicas de firmantes
  * `new-aggregate-pubkey`: `(buff 33)` - Nueva clave pública agregada
  * `new-signature-threshold`: `uint` - Nuevo umbral de firma
* Devuelve: `(response (buff 33) uint)`

Flujo de la función:

{% stepper %}
{% step %}
**Validar umbral de firma**

Asegurarse de que el nuevo umbral de firma sea válido (debe ser >50% y ≤100% del total de claves de firmantes).
{% endstep %}

{% step %}
**Verificar llamante**

Verificar que quien llama sea el principal firmante actual.
{% endstep %}

{% step %}
**Validar claves**

Comprobar la longitud de cada nueva clave y de la clave pública agregada (debe ser de 33 bytes).
{% endstep %}

{% step %}
**Actualizar registro**

Llamar al contrato del Registro sBTC para actualizar las claves y la dirección.
{% endstep %}
{% endstepper %}

#### Funciones de solo lectura

**`pubkeys-to-spend-script`**

Genera el script de redención p2sh para una multisig.

* Parámetros:
  * `pubkeys`: `(list 128 (buff 33))` - Lista de claves públicas
  * `m`: `uint` - Número de firmas requeridas
* Devuelve: `(buff 1024)` - El script de redención p2sh

**`pubkeys-to-hash`**

Calcula el hash160 del script de redención p2sh.

* Parámetros:
  * `pubkeys`: `(list 128 (buff 33))` - Lista de claves públicas
  * `m`: `uint` - Número de firmas requeridas
* Devuelve: `(buff 20)` - El hash160 del script de redención

**`pubkeys-to-principal`**

Genera un principal (dirección de Stacks) a partir de un conjunto de pubkeys y un umbral m-de-n.

* Parámetros:
  * `pubkeys`: `(list 128 (buff 33))` - Lista de claves públicas
  * `m`: `uint` - Número de firmas requeridas
* Devuelve: `principal` - La dirección de Stacks generada

**`pubkeys-to-bytes`**

Concatena una lista de pubkeys en un búfer con prefijos de longitud.

* Parámetros:
  * `pubkeys`: `(list 128 (buff 33))` - Lista de claves públicas
* Devuelve: `(buff 510)` - Pubkeys concatenadas con prefijos de longitud

**`concat-pubkeys-fold`**

Concatena un búfer de pubkey con un prefijo de longitud.

* Parámetros:
  * `pubkey`: `(buff 33)` - Una sola clave pública
  * `iterator`: `(buff 510)` - Acumulador para la concatenación
* Devuelve: `(buff 510)` - Búfer concatenado actualizado

**`bytes-len`**

Devuelve la longitud de un búfer de bytes como un solo byte.

* Parámetros:
  * `bytes`: `(buff 33)` - Búfer de bytes de entrada
* Devuelve: `(buff 1)` - Longitud como un solo byte

**`uint-to-byte`**

Convierte un uint en un solo byte.

* Parámetros:
  * `n`: `uint` - Número de entrada
* Devuelve: `(buff 1)` - Número como un solo byte

#### Funciones privadas

**`signer-key-length-check`**

Comprueba que la longitud de cada clave sea exactamente de 33 bytes.

* Parámetros:
  * `current-key`: `(buff 33)` - Clave pública a comprobar
  * `helper-response`: `(response uint uint)` - Acumulador para el manejo de errores
* Devuelve: `(response uint uint)` - Acumulador actualizado o error

#### Constantes

**`BUFF_TO_BYTE`**

Una lista constante que asigna valores uint (0-255) a sus representaciones de byte correspondientes.

Interacciones con otros contratos

* `.sbtc-registry`: Llama a `get-current-signer-data` y `rotate-keys` para gestionar los datos de los firmantes.

Consideraciones de seguridad

{% hint style="warning" %}

* Control de acceso: Solo el principal firmante actual puede llamar a la función de rotación de claves.
* Validación de claves: Asegura que todas las claves proporcionadas tengan la longitud correcta.
* Umbral de firma: Impone un umbral mínimo de más del 50% de los firmantes y un máximo del 100%.
* Generación multisig: Proporciona utilidades para la generación segura de direcciones multisig.
  {% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.stacks.co/learn/es/sbtc/clarity-contracts/sbtc-signers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
