Saltar al contenido principal

Firmas y Multisig

nota

Esta sección detalla la firma de transacciones que no son contratos inteligentes. Para la autenticación relacionada con transacciones de contratos inteligentes, consulta autorización

Las firmas son autorizaciones para transacciones en la red. Las transacciones siempre necesitan autorización de al menos una clave pública para ser válidas y, en general, la firma proviene de la cuenta fuente. A veces, las transacciones requieren más firmas, de las que hablaremos en la sección de multisig.

Las firmas de transacciones se crean firmando el contenido del objeto de transacción con una clave secreta. Stellar utiliza el esquema de firma ed25519, pero también hay un mecanismo para agregar tipos adicionales de esquemas de claves públicas y privadas. Una transacción con una firma adjunta se considera que tiene autorización de esa clave pública.

Umbrales

Cada operación cae bajo una categoría de umbral específica: bajo, medio o alto, con un nivel numérico entre 0-255 (para leer más sobre esto, consulta nuestra sección sobre Operaciones y Transacciones). Este umbral determina qué peso de firma se necesita para autorizar una operación.

Para ver el umbral de cada operación, consulta nuestra Lista de Operaciones.

Las cuentas pueden establecer su propio peso de firma, valores de umbral y claves de firma adicionales con la operación Establecer Opciones. Por defecto, todos los niveles de umbral de operación se establecen en 0, y la clave maestra se establece en peso 1. En la mayoría de los casos, se recomienda establecer umbrales de tal manera que bajo <= medio <= alto.

Si el peso de la clave maestra se establece en 0, no se puede usar para firmar transacciones, incluso para operaciones con un valor de umbral de 0. Ten mucho cuidado al establecer el peso de tu clave maestra en 0. Hacerlo puede bloquearte permanentemente de tu cuenta (aunque si hay otros firmantes listados en la cuenta, ellos aún pueden continuar firmando transacciones)

Autorización

Para determinar si una transacción tiene la autorización necesaria para ejecutarse, se suman los pesos de todas las firmas en el sobre de transacciones. Si esta suma es igual o mayor que el umbral para ese tipo de operación, entonces la operación está autorizada.

Este esquema es muy flexible. Puedes requerir muchos firmantes para autorizar pagos de una cuenta en particular. Puedes tener una cuenta que cualquier número de personas puede autorizar. Puedes tener una clave maestra que otorgue acceso o revoque el acceso a otros. Admite cualquier configuración de m de n.

Multisig

En algunos casos, una transacción puede necesitar más de una firma:

  • Si la transacción tiene operaciones con múltiples cuentas fuente, requiere la firma de la cuenta fuente para cada operación
  • Se requieren firmas adicionales si la cuenta asociada con la transacción tiene múltiples claves públicas

Cada firmante adicional más allá de la clave maestra aumenta el saldo mínimo de la cuenta en una reserva base. Se pueden adjuntar hasta 20 firmas a una transacción. Una vez que se alcanza un umbral de firma, si hay firmas sobrantes, la transacción fallará. Por ejemplo, si tu transacción requiere tres firmas, proporcionar más de tres firmas, incluso si todas son válidas, resultará en un error de transacción fallida: TX_BAD_AUTH_EXTRA. Este diseño se debe a que la verificación innecesaria de firmas tiene un gran efecto en el rendimiento antes de aceptar transacciones en consenso.

Tipos de firma alternativos

Para habilitar algunas características avanzadas de contratos inteligentes, hay un par de tipos de firma adicionales. Estos tipos de firma también tienen pesos y se pueden agregar y eliminar de manera similar a los tipos de firma normales. Pero en lugar de verificar una firma criptográfica para autorización, tienen un método diferente de probar la validez a la red.

Transacción pre-autorizada

Es posible que una cuenta preautorice una transacción en particular al agregar el hash de la futura transacción como firmante en la cuenta. Para hacer esto, necesitas preparar la transacción de antemano con el número de secuencia adecuado. Luego puedes obtener el hash de esta transacción y agregarlo como firmante a la cuenta.

Los firmantes de este tipo son eliminados automáticamente de la cuenta cuando se aplica una transacción coincidente, independientemente de si la transacción tiene éxito o falla. En caso de que nunca se envíe una transacción coincidente, el firmante permanece y debe ser eliminado manualmente usando la operación Establecer Opciones.

Este tipo de firmante es especialmente útil en cuentas de depósito en garantía. Puedes preautorizar dos transacciones diferentes. Ambas podrían tener el mismo número de secuencia pero diferentes destinos. Esto significa que solo una de ellas puede ser ejecutada.

Hash(x)

nota

La firma Hash(x) es un concepto diferente de los hashes de transacción. Los hashes de transacción son identificadores únicos generados aplicando una función de hash criptográfica a los datos de una transacción en una blockchain. Sirven como una huella digital y permiten a los usuarios verificar y referenciar transacciones en la red. Hash(x) es un tipo de firma.

Agregar una firma de tipo hash(x) permite que cualquiera que conozca x firme la transacción. Este tipo de firmante es especialmente útil en intercambios atómicos entre cadenas, que son necesarios para protocolos inter-bloques como redes relámpago.

Primero, crea un valor aleatorio de 256 bits, que llamamos x. El hash SHA256 de ese valor puede ser agregado como un firmante de tipo hash(x). Luego, para autorizar una transacción, x se agrega como una de las firmas de la transacción. Ten en cuenta que x será conocido por el mundo tan pronto como se envíe una transacción a la red con x como firma. Esto significa que cualquiera podrá firmar por esa cuenta con el firmante hash(x) en ese momento. A menudo quieres que haya firmantes adicionales, para que alguien deba tener una clave secreta particular y conocer x para alcanzar el umbral de peso requerido para autorizar transacciones en la cuenta.

Ejemplos

  • Ejemplo 1: Anchors
  • Ejemplo 2: Cuentas conjuntas
  • Ejemplo 3: Cuentas de gastos
  • Ejemplo 4: Cuentas de empresa

Ejemplo 1: Anchors

Tú administras un anchor que desea mantener su clave de emisión fuera de línea. De esa manera, es menos probable que un actor malicioso pueda hacerse con la clave del anchor y comenzar a emitir crédito de manera indebida. Sin embargo, tu anchor necesita autorizar a las personas que poseen crédito mediante la ejecución de la operación Establecer Flags de Línea de Confianza. Antes de emitir crédito a una cuenta, necesitas verificar que esa cuenta está bien.

Multisig te permite hacer todo esto sin exponer la clave maestra de tu anchor. Puedes agregar otra clave de firma a tu cuenta con la operación Establecer Opciones. Esta clave adicional debería tener un peso por debajo del umbral medio de tu cuenta de anchor. Dado que Establecer Flags de Línea de Confianza es una operación de bajo umbral, esta clave adicional autoriza a los usuarios a mantener el crédito de tu anchor. Pero, dado que Pago es una operación de umbral medio, esta clave no permite que nadie que comprometa tu anchor emita crédito.

La configuración de tu cuenta:

Master Key Weight: 2
Additional Signing Key Weight: 1
Low Threshold: 0
Medium Threshold: 2
High Threshold: 2

Ejemplo 2: Cuentas conjuntas

Tú quieres establecer una cuenta conjunta con Bilal y Carina de modo que cualquiera de ustedes pueda autorizar un pago. También deseas configurar la cuenta para que, si decides cambiar los firmantes (por ejemplo, eliminar o agregar a alguien), en una operación de alto umbral, los 3 deben estar de acuerdo. Agregas a Bilal y Carina como firmantes a la cuenta conjunta. También aseguras que se necesiten todos sus pesos de clave para despejar el umbral alto, pero solo uno para despejar el umbral medio.

Configuración de cuenta conjunta:

Master Key Weight: 1
Low Threshold: 0
Medium Threshold: 0
High Threshold: 3
Bilal's Signing Key Weight: 1
Carina's Signing Key Weight: 1

Ejemplo 3: Cuentas de gastos

Tú controlas completamente una cuenta de gastos, pero deseas que tus dos compañeros de trabajo, Diyuan y Emil, puedan autorizar transacciones de esta cuenta. Agregas las claves de firma de Diyuan y Emil a la cuenta de gastos. Si Diyuan o Emil dejan la empresa, puedes eliminar su clave de firma, que es una operación de alto umbral.

Configuración de la cuenta de gastos:

Master Key Weight: 3
Low Threshold: 0
Medium Threshold: 0
High Threshold: 3
Diyuan's Key Weight: 1
Emil's Key Weight: 1

Ejemplo 4: Cuentas de empresa

Advertencia: este ejemplo implica establecer el peso de la clave maestra de una cuenta en 0. Ten mucho cuidado si decides hacer esto: esa clave ya no podrá firmar ningún tipo de transacción, por lo que estás en peligro de bloquearte permanentemente de tu cuenta. Asegúrate de haber pensado cuidadosamente en lo que estás haciendo, que comprendes las implicaciones y que cambias los pesos en el orden correcto.

Tu empresa quiere establecer una cuenta que requiera que 3 de 6 empleados acuerden cualquier transacción de esa cuenta.

Configuración de cuenta de empresa:

Master Key Weight: 0 (Turned off so this account can't do anything without an employee.)
Low Threshold: 3
Medium Threshold: 3
High Threshold: 3
Employee 1 Key Weight: 1
Employee 2 Key Weight: 1
Employee 3 Key Weight: 1
Employee 4 Key Weight: 1
Employee 5 Key Weight: 1
Employee 6 Key Weight: 1