Firmas y Multisig
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 la autorización para transacciones en la red. Las transacciones siempre necesitan autorización de al menos una clave pública para ser válidas y generalmente, la firma proviene de la cuenta de origen. A veces las transacciones requieren más firmas, lo que abordaremos en la sección de multisig.
Las firmas de transacciones se crean firmando el contenido del objeto de la transacción con una clave secreta. Stellar utiliza el esquema de firma ed25519, pero también existe un mecanismo para añadir tipos adicionales de esquemas de clave pública y privada. 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 es necesario 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 adicionales de firma con la operación Set Options. Por defecto, todos los niveles de umbral de operación están establecidos en 0, y la clave maestra está establecida con peso 1. En la mayoría de los casos, se recomienda establecer los umbrales de manera que bajo <= medio <= alto
.
Si el peso de la clave maestra se establece en 0, no puede usarse 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 el acceso a tu cuenta (aunque si hay otros firmantes listados en la cuenta, ellos todavía podrán 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 la transacción. Si esta suma es igual o mayor al umbral para ese tipo de operación, entonces la operación está autorizada.
Este esquema es muy flexible. Puedes requerir que muchos firmantes autoricen los pagos desde una cuenta en particular. Puedes tener una cuenta que cualquier número de personas pueda autorizar. Puedes tener una clave maestra que conceda 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 de origen, requiere la firma de cada cuenta de origen para cada operación
- Se requieren firmas adicionales si la cuenta asociada a la transacción tiene múltiples claves públicas
Cada firmante adicional más allá de la clave maestra incrementa el saldo mínimo de la cuenta en una reserva base. Hasta 20 firmas pueden ser adjuntadas a una transacción. Una vez que se cumple el umbral de firmas, si quedan 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 impacto en el rendimiento antes de aceptar transacciones en consenso.
Tipos alternativos de firma
Para habilitar algunas funciones avanzadas de contratos inteligentes existen un par de tipos adicionales de firma. Estos tipos de firma también tienen pesos y pueden agregarse y eliminarse de manera similar a los tipos normales de firma. Pero en lugar de verificar una firma criptográfica para la autorización, tienen un método diferente para probar validez a la red.
Transacción pre-autorizada
Es posible que una cuenta preautorice una transacción particular añadiendo el hash de la futura transacción como firmante en la cuenta. Para eso, necesitas preparar la transacción previamente 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 se eliminan automáticamente de la cuenta cuando una transacción coincidente es aplicada, independientemente de si la transacción tiene éxito o falla. En caso de que una transacción coincidente nunca se envíe, el firmante permanece y debe ser eliminado manualmente usando la operación Set Options.
Este tipo de firmante es especialmente útil en cuentas en custodia. Puedes preautorizar dos transacciones diferentes. Ambas pueden tener el mismo número de secuencia pero destinos distintos. Esto significa que solo una de ellas puede ejecutarse.
Hash(x)
La firma Hash(x) es un concepto diferente de los hashes de transacción. Los hashes de transacción son identificadores únicos generados al aplicar una función 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 a cualquiera que conozca x firmar la transacción. Este tipo de firmante es especialmente útil en intercambios atómicos entre cadenas que se necesitan para protocolos inter-blockchain como las lightning networks.
Primero, crea un valor aleatorio de 256 bits, al que llamamos x. El hash SHA256 de ese valor puede añadirse como un firmante de tipo hash(x). Luego, para autorizar una transacción, x se añade como una de las firmas de la transacción. Ten en cuenta que x será conocido públicamente tan pronto como una transacción sea enviada a la red con x como firma. Esto significa que cualquiera podrá firmar por esa cuenta con el firmante hash(x) a partir de ese momento. A menudo querrás 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
A continuación, mostraremos algunos ejemplos de lo potente que son los umbrales y pesos. Si quieres aprender más sobre el uso de firmantes avanzados como hash(x)
, consulta esta publicación en el blog para algunos ejemplos divertidos.
- Ejemplo 1: Anchors
- Ejemplo 2: Cuentas conjuntas
- Ejemplo 3: Cuentas de gastos
- Ejemplo 4: Cuentas de empresa
Ejemplo 1: Anchors
Gestionas un anchor que quiere mantener su clave emisora fuera de línea. De esa manera, es menos probable que un actor malintencionado consiga la clave del anchor y comience a emitir crédito de manera indebida. Sin embargo, tu anchor necesita autorizar a las personas que poseen crédito ejecutando la operación Set Trust Line Flags
. Antes de emitir crédito a una cuenta, necesitas verificar que esa cuenta sea válida.
Multisig te permite hacer todo esto sin exponer la clave maestra de tu anchor. Puedes añadir otra clave de firma a tu cuenta con la operación Set Options
. Esta clave adicional debería tener un peso por debajo del umbral medio de la cuenta de tu anchor. Dado que Set Trust Line Flags
es una operación de umbral bajo, esta clave extra autoriza a los usuarios a poseer el crédito de tu anchor. Pero, como Payment
es una operación de umbral medio, esta clave no permite que nadie que comprometa tu anchor emita crédito.
Tu configuración de cuenta:
- Ejemplo
Master Key Weight: 2
Additional Signing Key Weight: 1
Low Threshold: 0
Medium Threshold: 2
High Threshold: 2
Ejemplo 2: Cuentas conjuntas
Quieres configurar una cuenta conjunta con Bilal y Carina de modo que cualquiera de ustedes pueda autorizar un pago. También quieres configurar la cuenta para que, si decides cambiar firmantes (por ejemplo, eliminar o añadir a alguien), una operación de umbral alto, los 3 deban estar de acuerdo. Añades a Bilal y Carina como firmantes de la cuenta conjunta. También aseguras que se necesiten todos los pesos de tus claves para superar el umbral alto, pero solo uno para superar el umbral medio.
Configuración de cuenta conjunta:
- Ejemplo
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
Controlas totalmente una cuenta de gastos, pero quieres que tus dos compañeros de trabajo Diyuan y Emil puedan autorizar transacciones desde esta cuenta. Añades 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, lo cual es una operación de umbral alto.
Configuración de cuenta de gastos:
- Ejemplo
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 eso: esa clave ya no podrá firmar ningún tipo de transacción, por lo que corres el riesgo de bloquearte permanentemente fuera de tu cuenta. Asegúrate de haber pensado bien lo que haces, que entiendas las implicaciones y que cambies los pesos en el orden correcto.
Tu empresa quiere configurar una cuenta que requiera que 3 de 6 empleados estén de acuerdo para cualquier transacción desde esa cuenta.
Configuración de cuenta de empresa:
- Ejemplo
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