Firmas de red de Monero

Abrimos una serie de publicaciones sobre el dispositivo de varias blockchains y comenzamos a investigar con Monero. Esta es una criptomoneda bastante conocida, implementa una serie de soluciones algorítmicas y criptográficas interesantes. Hace varios meses, se agregó soporte para firmas múltiples a Monero Core, y en el artículo de hoy veremos más de cerca esta tecnología.

imagen

Las firmas múltiples son un mecanismo para crear y usar billeteras compartidas. El concepto en sí no es nuevo, ya se ha implementado en algunas criptomonedas, como Bitcoin, Ethereum y otras. Su esencia radica en la copropiedad y disposición de fondos de billetera. Se imponen algunas restricciones a la disposición de fondos: para realizar una transacción, es necesario recolectar un cierto número de votos, que se establece al crear la billetera y depende del número de sus propietarios.

Estos parámetros caracterizan el llamado "esquema" de una billetera, por ejemplo, 3/3 - una billetera para tres propietarios con las tres firmas necesarias para enviar una transacción, o 2/3 - billetera para tres propietarios con las dos firmas necesarias de cualquiera de sus propietarios. Cabe señalar que en la billetera de múltiples firmas no hay un concepto de "su parte" y "mi parte", todos los fondos pertenecen a todos los participantes al mismo tiempo.

Criptografía en Monero


La criptografía en Monero (como en la mayoría de las otras criptomonedas) se basa en curvas elípticas. Puedes leer sobre ellos en Wikipedia . En resumen, las ventajas de este sistema de cifrado son una mayor fuerza criptográfica en comparación con los sistemas criptográficos clásicos, un tamaño de clave pequeño y una mayor velocidad de las operaciones criptográficas.

Cada billetera en la red Monero tiene dos pares de claves (privadas y públicas): ver y gastar. La vista y el gasto del par de claves públicas se denomina dirección de billetera. Puede usarlo como una dirección para recibir fondos. Si desea proporcionar información sobre el número y el tamaño de los recibos a su billetera con terceros, puede, además de la dirección, proporcionar una clave de vista privada. Un par de clave de vista privada y gasto público se denomina clave de seguimiento. Con él, puede ver la recepción de fondos en la billetera (pero no los costos) y es absolutamente seguro: poseer un par de llaves de este tipo no podrá gastar su dinero.
Quizás la clave más secreta es el gasto privado: no debe compartirlo con nadie, porque poseerlo y una clave de vista privada, puede administrar la billetera.

Más adelante en el artículo, indicaremos las claves públicas en mayúsculas (por ejemplo, B - clave de gasto público) y privado - minúsculas (b - clave de gasto privado). Para comprender algunos de los cálculos a continuación, en el artículo mostramos cómo la clave pública se hereda de la privada:

Fórmula: Herencia de una clave pública.  B = bg

, donde G es un punto fijo, al multiplicar una clave privada (escalar) se obtiene una clave pública, que también es un punto en una curva elíptica.

Firmas de red de Monero


La idea subyacente a la tecnología es simple: cada participante de la billetera solo mantiene una parte de la clave de gasto privado, y al formar y firmar transacciones, todas estas partes se resumen para formar una clave única.

Por supuesto, en ningún momento, ninguno de los participantes puede recopilar la clave completa. La clave de gasto público se almacena en su totalidad por cada participante. Cada uno de los participantes también almacena la versión completa de la clave de vista privada y pública, que, junto con el gasto público, le permite ver los recibos entrantes en una dirección común.

Crear una billetera multisig en Monero


La versión de lanzamiento actual de Monero solo admite esquemas N / N y N - 1 / N.

El proceso de creación se lleva a cabo en 1 o 2 etapas para los esquemas N / N y N - 1 / N, respectivamente. En la primera etapa, los participantes en el proceso intercambian puntos de vista privados y claves de gasto público entre sí y calculan la suma de estas claves: todas las vistas y todos los gastos. Por lo tanto, la clave de vista privada de la billetera se convierte en la suma de las claves de vista para todos los esquemas, y la clave de gasto público para el esquema N / N es la suma de las claves de gasto público de todos los participantes. Esto termina la generación de la billetera N / N.

Para las billeteras N - 1 / N, aparece otro conjunto de claves. Este conjunto es una matriz de claves privadas, calculadas como el producto de su clave de gasto privado actual por cada una de las claves de gasto público de los otros participantes, es decir (excluyendo la función hash por simplicidad):

Fórmula: cálculo de claves multigrado

Y de manera similar para cada uno de los participantes.

La clave de gasto privado de cada uno de los participantes será la suma de sus claves multigrado, es decir:

imagen

Cada participante realiza esta operación. Cabe destacar una propiedad importante de tales obras, por ejemplo:

imagen

De esta igualdad se deduce que cada billetera tiene una clave multisig (en nuestro ejemplo con esquema 2/3), que tiene otro participante.

Después de la generación, los participantes intercambian claves públicas multigrado:

Fórmula: cálculo de una clave multigrado pública

En la final, la clave de la billetera de gasto público se calcula sumando los valores únicos de las claves públicas multigrado, es decir, para nuestro ejemplo, esto será:

Fórmula: calcular la clave de gasto público

Como podemos ver, para calcular la clave de gasto (tanto privada como pública) en el caso de 2/3, necesitamos suficiente información de cualquiera de los dos participantes.

Esto completa la creación de la billetera y puede usarse de acuerdo con el esquema seleccionado.

Transacciones en Monero


Para explicar cómo se crean las transacciones multigrado, repasemos brevemente cómo se organiza una transacción en Monero. Simplificado (sin firmas de anillo y RingCT) se puede imaginar de la siguiente manera:

Representación de manipulación simplificada

Figura 1. Vista de transacción simplificada

Aquí, a la derecha, se muestran los resultados de la transacción: el dinero que genera (una analogía directa: billetes en una billetera), y las entradas a la izquierda son el dinero que quema.

Por lo tanto, cuando Alice quiere enviar 1 XMR a Bob, ella recoge 1 XMR más comisión entre sus salidas no gastadas, las coloca en el lugar de las entradas de transacción, calcula una imagen clave para cada una de ellas, genera salidas por la cantidad de 1 XMR y calcula para cada una ellos clave de salida.

Después de recibir la transacción, Bob recupera la clave de salida para cada una de las salidas utilizando una vista privada y claves de gasto público, y si las claves recuperadas y recibidas en la transacción coinciden, considera que esta salida está destinada a él.

A pesar de que una transacción multigrado desde el punto de vista de la red no es diferente de cualquier otra transacción, su creación es un poco más complicada y en varias etapas:

  • Los participantes intercambian imágenes clave parciales por salidas conocidas (o simplemente intercambian salidas)
  • Los participantes vuelven a sincronizar sus billeteras para obtener un equilibrio preciso, teniendo en cuenta la imagen clave ya completa
  • El remitente prepara la transacción, la firma y la envía al siguiente participante.
  • Cada participante posterior agrega una parte de su firma RingCT.
  • El último firmante completa RingCT

Y ahora la transacción está lista para ser enviada a la red.

Generación de imágenes clave y salida compartida


Durante el escaneo de blockchain (sincronización), la billetera no puede determinar qué entradas específicas gastan sus salidas, ya que no tiene la capacidad de calcular la imagen clave para ellas. Por lo tanto, solo ve las transacciones entrantes (para ellas, solo los pares de claves de seguimiento son suficientes).

Para formar una transacción correcta, debe restaurar la imagen clave para cada una de las salidas, escanear la cadena de bloques y determinar cuál de ellas se gasta, y solo luego proceder a generarla.

Considere el proceso de formar una imagen clave. Se calcula mediante la fórmula:

Fórmula: imagen clave de formación

, donde Hp es una determinada función hash predeterminada, P es la clave de salida pública (ver Figura 1), x es la clave de salida privada que restauraremos para el destinatario de esta salida, se calcula de la siguiente manera:

Fórmula: Restaurar clave de salida privada

, donde Hs es una determinada función hash criptográfica bien conocida, a es una clave de vista privada, R es una clave de transacción pública (Tx pub key, consulte la Figura 1) yb es una clave de gasto privado. Sustituyendo una expresión en otra y abriendo los corchetes, obtenemos:

Fórmula: imagen clave de cálculo

Pero como no tenemos una clave de gasto completa, debemos restaurarla. En el caso de N / N, todo es simple (tome, por ejemplo, 3/3):

Fórmula: recuperación de imagen clave para N / N

Aquí H p (P) b i es una imagen clave parcial recibida del i-ésimo participante.

Para los esquemas N - 1 / N (2/3 en nombre del primer participante sin la participación del tercero):

Fórmula: recuperación de imagen clave para N - 1 / N

en este caso, H p (P) b i B j es una imagen de clave parcial.

La esencia del proceso de intercambio de salidas es precisamente que el número necesario de firmantes de la transacción envía su imagen de clave parcial para cada una de las salidas a otros participantes en la billetera. Al mismo tiempo, los participantes no revelan sus claves privadas, por lo que un observador externo o un participante inescrupuloso no tiene la oportunidad de restaurar la clave de gasto completo y confiscar la billetera solo.

Con estos datos, el iniciador de transacciones puede formarlos y prepararlos para la firma. La transacción generada se envía a todos los que aceptan firmarla para generar firmas de Ring CT, se crean todas las firmas necesarias y la transacción se envía a la red.

Automatización de intercambio de datos.


Los procedimientos anteriores se describen para intercambiar partes de claves e imágenes de claves que deben realizarse una vez o después de cada transacción enviada. En la implementación actual de Monero Core Wallet, se propone realizar estas acciones manualmente intercambiando manualmente los datos necesarios a través de canales de comunicación seguros con sus corresponsales (exportando los datos necesarios de la billetera y enviándolos a través de mensajeros instantáneos o de otra manera).

Puede demostrar esto con el ejemplo de crear una billetera de acuerdo con el esquema 2/3 y firmar la transacción. Cada uno de los participantes ejecuta los siguientes comandos utilizando la utilidad monero-wallet-cli:

  [billetera 9uKCgo]: prepare_multisig
 MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
 Envíe esta información de multigrado a todos los demás participantes, luego use make_multisig <threshold> <info1> [<info2> ...] con la información de multigrado de otros
 Esto incluye la clave de vista PRIVADA, por lo que debe divulgarse solo a los participantes de esa billetera multigrado 

 [Monedero 9uKCgo]: make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH
 Se necesita otro paso
 MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP
 Envíe esta información de multigrado a todos los demás participantes, luego use finalize_multisig <info1> [<info2> ...] con la información de multigrado de otros

 [Monedero 9uKCgo]: finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5 

Antes de enviar una transacción, las partes deben intercambiar imágenes de claves parciales:

  [billetera 9uKCgo]: export_multisig_info ki1
 Información multigrado exportada a ki1
 [billetera 9uKCgo]: import_multisig_info ki2 ki3
 Altura 1103873, txid <f7e648915287fafca1dc67eb26267e09f92bba7ab7fd52a12600c3e6440db0eb>, 2.000000000000, idx 0/0
 Altura 1103882, txid <2e3a5591c741c0943a47a2bcbd1ec26493158088c88308bcbfc97423ea95c491>, 0.009000000000, idx 0/0
 Información multigrado importada 

A continuación, la billetera se vuelve a sincronizar teniendo en cuenta las claves completas y, después de recibir los datos de los pagos salientes, el participante puede preparar la transacción:

  [wallet 9uKCgo]: transfer 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX 1
 No se incluye identificación de pago con esta transacción.  Esta bien?  (S / Sí / N / No): S
 Actualmente hay una acumulación de 2 bloques en ese nivel de tarifa.  Esta bien?  (S / Sí / N / No) S

 Transacción 1/1:
 Gasto del índice de dirección 0
 Enviando 1.000000000000.  La tarifa de transacción es 0.012000000000
 Esta bien?  (S / Sí / N / No): S
 Transacciones sin firmar escritas correctamente en el archivo: multisig_monero_tx 

Es necesario transferir el archivo generado a otro participante para firmar y enviar a la red:

  [billetera 9twQxU]: sign_multisig multisig_monero_tx
 Cargado 1 transacciones, para 1,031762770000, cuota ,012000000000, el envío de 1,000000000000 a 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, ,019762770000 cambio a 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, con tamaño de anillo min 7, no ID pago.  Esta bien?  (S / Sí / N / No): S
 La transacción se firmó correctamente en el archivo multisig_monero_tx, txid 1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6
 [billetera 9twQxU]: submit_multisig multisig_monero_tx
 Cargado 1 transacciones, para 1,031762770000, cuota ,012000000000, el envío de 1,000000000000 a 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, ,019762770000 cambio a 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, con tamaño de anillo min 7, no ID pago.  Esta bien?  (S / Sí / N / No): S
 Transacción enviada correctamente, transacción <1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6>
 Puede verificar su estado utilizando el comando `show_transfers`. 

Obviamente, este enfoque, aunque le permite usar billeteras multigrado si realmente lo desea, no puede ser aplicado por usuarios inexpertos o, por ejemplo, usuarios de billeteras móviles.

Por lo tanto, estamos desarrollando nuestra propia solución que automatizaría el intercambio de estos datos sin violar la privacidad de las partes y la seguridad de las transacciones para que la tecnología de firma múltiple en Monero sea accesible para más personas. La solución se basa en aplicaciones que admiten billeteras estándar y multigrado, y una parte de servidor abierto que proporciona intercambio de datos y reenvío a billeteras apropiadas.

Puede obtener más información sobre este proyecto en wallet.exan.tech , y sobre los recursos que apoyamos para la red Monero, consulte exan.tech/en/projects/monero .

Conclusión


Examinamos el mecanismo para crear billeteras multigrado y formar transacciones con múltiples firmas en Monero. Actualmente, solo se admite un conjunto limitado de esquemas de firma, pero se ampliará a fórmulas arbitrarias de la forma 2/5, etc. El mecanismo existente para intercambiar los datos necesarios para que la billetera funcione es bastante incómodo, pero debido a la apertura del ecosistema Monero con la ayuda de soluciones de terceros, se puede llevar a la calidad habitual para los usuarios comunes.

En los siguientes artículos, hablaremos sobre otros aspectos del dispositivo Monero: RingCT y firmas de anillo, la arquitectura de billetera y la biblioteca libwallet, así como las perspectivas de desarrollo de esta cadena de bloques.

Haga sus preguntas, sugiera temas para nuevos artículos sobre tecnologías de criptomonedas y suscríbase a nuestro grupo de Facebook para mantenerse al tanto de nuestros eventos y publicaciones.

Source: https://habr.com/ru/post/es412921/


All Articles