Haven Deep Dive: descifrar el código xUSD
Neac (líder de protocolo de Haven) y yo hemos pasado los últimos meses preparándonos para el lanzamiento de xUSD en la red principal. A lo largo de nuestras pruebas, nos hemos centrado en cómo verificar de forma más segura los intercambios xUSD para garantizar un lanzamiento sin problemas y un éxito a largo plazo para esta primera moneda estable privada.
Este trabajo ha resultado en un rediseño extenso de la base de código de Haven. Como aprendimos en nuestras redes de prueba, la estructura de Monero resultó ser un desafío único para firmar y verificar transacciones xUSD. Ha sido tedioso, lento y, a veces, francamente frustrante. Pero estamos orgullosos de decir que hemos desarrollado una solución innovadora que garantizará la precisión, confiabilidad y privacidad de las transacciones xUSD ahora y en el futuro. A continuación se muestra una inmersión profunda en el proceso que nos llevó a esta solución.
Haven's primer testnet calculó un valor aproximado para decirles a los usuarios cuánto xUSD recibirían por el XHV que solicitaron cambiar. Esto se debe a que en Monero (y Cryptonote), cuando los usuarios envían una transacción, envían una compromiso a un número de monedas: tanto entradas como salidas. Estas entradas y salidas deben ser iguales o la transacción siempre fallará.
Esta estructura de Monero se convirtió en un problema para Haven cuando comenzamos a implementar intercambios xUSD. Inicialmente, no pudimos garantizar la final cantidad de xUSD intercambiada sería igual a la aproximado cantidad de xUSD cotizada antes de enviar una transacción. Esto se debe a que el precio de XHV cambia dinámicamente. El precio de XHV (y por lo tanto, el tipo de cambio xUSD) podría cambiar entre el momento en que un usuario envió una transacción y el momento en que se confirmó la transacción.
La primera forma en que abordamos una solución a este desafío fue dejar de buscar la igualdad de entradas y salidas. Pero para evitar la manipulación, necesitábamos que el remitente no pudiera especificar una cantidad falsa. Así que decidimos tomar este paso de las manos del remitente por completo y darle esa responsabilidad al minero.
Esta solución, implementada en un testnet posterior, agregó un retraso en proporcionar el tipo de cambio xUSD exacto. El remitente tendría que esperar a que se extrajera un bloque y el minero tenía que incluir el precio de intercambio en el encabezado del bloque. Sin embargo, había agujeros en esta solución, desagradables.
Imagine un atacante adversario con el dinero y el conocimiento de esta parte del código de Haven. Después de configurar la infraestructura para obtener 51% del hash de Haven, podrían convertirse tanto en el minero como en el remitente y, por lo tanto, establecer sus propios tipos de cambio xUSD. ¡Esta posibilidad era, digamos, subóptima!
Entonces en el siguiente testnet, decidimos devolver la responsabilidad al remitente, pero solo para que pudieran tomar el último registro de precios verificado ya en la cadena de Haven (el registro de precios del bloque superior) y especificar qué bloque usaron en la transacción. Esto podría ser verificado y verificado por mineros y demonios, quienes también podrían verificar que las entradas y las salidas fueran iguales no en monedas, sino en valor en dólares (crítico para xUSD).
Esta prueba de valor se convirtió en la clave del éxito de Haven. Pero el modelo descrito anteriormente también resultó vulnerable a los ataques. Varias lecciones surgieron de las siguientes redes de pruebas de xUSD realizadas con nuestro equipo y comunidad. Primero, aprendimos que una cadena más corta podría jugar con el sistema. En segundo lugar, aprendimos que necesitábamos una forma de mostrar el suministro circulante de xUSD (y futuros xAssets) o nunca podríamos determinar la salud de la red de Haven.
La siguiente etapa de desarrollo nos llevó por un camino diferente. Como se indicó anteriormente, probar el valor de una transacción era la clave, y necesitábamos reemplazar la prueba de entradas = salidas de Monero con la prueba del valor en dólares para los intercambios xUSD.
Probamos más de una docena de pruebas, comprobaciones y validaciones diferentes. Pero descubrimos que, a menos que esté enviando XHV y ningún otro tipo de activo, que en las pruebas privadas es lo que estábamos haciendo, todo el sistema se confunde después de algunas transacciones hacia atrás y hacia adelante. Cuanto más complejos eran los intercambios, más difícil resultaba verificar el valor en dólares de una transacción. Luego, agregue múltiples transacciones, que debían abarcar grandes cantidades de entradas, y las cosas se enredaron realmente.
Todos estos desafíos estaban relacionados con la forma en que funcionan las firmas de compromiso, que es un requisito absoluto en Monero. A menos que sus compromisos sean válidos, nunca podrá verificar que el dinero no se haya creado de la nada.
En este punto, decidimos revisar el antiguo modelo de "monedas de colores”, Que anteriormente se superpuso a Bitcoin, creando un nuevo conjunto de información sobre el intercambio de monedas. Usando monedas de colores, las transacciones podrían ser "coloreadas" con atributos específicos. Esto convierte efectivamente las monedas de colores en fichas, que pueden usarse para representar cualquier cosa. Pero, y esto es fundamental, las monedas de colores solo pueden funcionar si no está atado a la estructura de compromiso de Monero.
Así que ese es el desafío que asumimos: modificar la estructura de compromiso de Monero para permitir el uso de “monedas de colores” que pueden distinguir entre XHV, xUSD y futuros xAssets en una sola cadena basada en Monero. Y estoy orgulloso de compartir eso por primera vez, hemos hecho exactamente eso.
Tuvimos que reemplazar el de Monero grupo anónimo espontáneo enlazable de varias capas (MLSAG) firmas con la más reciente grupo compacto anónimo espontáneo enlazable (CLSAG) firmas para lograr esto. Pero con un poco de ayuda de uno de los principales desarrolladores de Monero, Sarang Noether, la solución ahora funciona según lo previsto. Nos gustaría agradecer a Sarang por su ayuda para ayudarnos a navegar este nuevo esquema de cifrado.
Entonces, el resultado de todas estas pruebas y retoques es el siguiente: hemos creado una nueva estructura de transacción con entradas genuinas como XHV y salidas genuinas como xUSD. Para convertir de XHV a xUSD, en realidad damos XHV como entradas y xUSD como salidas. Luego, los demonios verifican que el número de salidas sea igual en función del tipo de cambio dado en el bloque que el remitente especificó como registro de precios. Esto se hace simplemente sumando las máscaras de compromiso y el tipo de cambio recuperados independientemente por los verificadores.
La lógica es que un verificador siempre obtendrá su propio tipo de cambio. Entonces, la única forma en que un remitente puede realizar una transacción es saber tanto el tipo de cambio exacto como el número exacto de entradas (que solo ellos pueden saber, ya que está en su billetera y no se puede leer en otro lugar). A continuación, el verificador suma los compromisos de producción y, teniendo en cuenta su tipo de cambio ganado independientemente, lo compara con los insumos. Deben ser iguales para aprobar. Por supuesto, todos los valores están encriptados para que nadie pueda ver o alterar las cantidades.
Nota: el remitente solo puede usar un registro de precios ya verificado, que se crean actualmente a través de El oráculo XHV de Chainlink. Los demonios leen el número de registro de precios en la transacción y obtienen el registro (el precio real) del encabezado del bloque. Esto significa que los precios ya son inmutables en el momento de su uso.
Este es exactamente el tipo de solución que estábamos buscando después de contemplar cómo abordar los desafíos asociados con la verificación del intercambio xUSD en la primera red de prueba. Esta solución está funcionando muy bien en nuestras pruebas privadas y se compartirá en nuestro próximo stagenet público en los próximos días.
Suponiendo que no se identifiquen otros problemas en las pruebas, esta es la solución que usaremos para lanzar xUSD en vivo en la red principal de Haven. Como parte del proceso de lanzamiento, esperamos compartir públicamente el código de intercambio xUSD que hemos desarrollado en privado durante el último año para crear la primera moneda estable privada.
Mientras tanto, únase a la comunidad Haven y sea parte del futuro de la privacidad financiera. Puedes unirte a nuestro Discordia y síguenos en Gorjeo.