Mergulho Profundo Haven: Decifrando o Código xUSD
Neac (líder de protocolo do Haven) e eu passamos os últimos meses nos preparando para o lançamento da mainnet do xUSD. Ao longo de nossos testes, nos concentramos em como verificar as trocas xUSD com mais segurança para garantir um lançamento tranquilo e sucesso de longo prazo para este primeiro stablecoin privado.
Este trabalho resultou em um amplo redesenho da base de código do Haven. Como aprendemos em nossas redes de teste, a estrutura do Monero provou ser um desafio único para assinar e verificar transações xUSD. Tem sido tedioso, lento e, às vezes, francamente frustrante. Mas temos orgulho em dizer que desenvolvemos uma solução inovadora que garantirá a precisão, confiabilidade e privacidade das transações xUSD agora e no futuro. Abaixo está um mergulho profundo no processo que nos levou a essa solução.
Haven's primeiro testnet calculou um valor aproximado para informar aos usuários quanto xUSD eles receberiam pelo XHV que solicitaram para trocar. Isso ocorre porque no Monero (e no Cryptonote), quando os usuários enviam uma transação, eles estão enviando um comprometimento a um número de moedas: entradas e saídas. Essas entradas e saídas precisam ser iguais ou a transação sempre falhará.
Essa estrutura Monero se tornou um problema para Haven quando começamos a implementar as trocas xUSD. Inicialmente, não podíamos garantir o final quantidade de xUSD trocada seria igual a aproximado valor de xUSD cotado antes de uma transação ser enviada. Isso ocorre porque o preço XHV muda dinamicamente. O preço XHV (e, portanto, a taxa de câmbio xUSD) pode mudar entre o momento em que um usuário submeteu uma transação e quando a transação foi confirmada.
A primeira maneira de abordarmos uma solução para este desafio foi não mais buscando igualdade de entradas e saídas. Mas, para evitar a manipulação, precisávamos que o remetente não pudesse especificar um valor falso. Portanto, decidimos tirar essa etapa inteiramente das mãos do remetente e dar essa responsabilidade ao minerador.
Esta solução, implementada em um subsequente testnet, acrescentou um atraso no fornecimento da taxa de câmbio xUSD exata. O remetente teria que esperar a mineração de um bloco e o minerador deveria incluir o preço de troca no cabeçalho do bloco. No entanto, havia buracos nesta solução - alguns desagradáveis.
Imagine um atacante adversário com o dinheiro e o conhecimento dessa parte do código do Haven. Depois de configurar a infraestrutura para obter 51% do hash de Haven, eles poderiam se tornar o minerador e o remetente e, assim, definir suas próprias taxas de câmbio xUSD. Essa possibilidade era, digamos, subótima!
Então no próximo testnet, decidimos transferir a responsabilidade de volta para o remetente, mas apenas para que ele pudesse pegar o último registro de preços verificado já na cadeia de Haven (o registro de preços do bloco superior) e especificar qual bloco eles usaram na transação. Isso poderia ser verificado e verificado por mineradores e daemons, que também podiam verificar se as entradas e as saídas eram iguais não em moedas, mas em valor em dólares (crítico para xUSD).
Isto prova de valor tornou-se a chave para o sucesso do Haven. Mas o modelo descrito acima também se mostrou vulnerável a ataques. Várias lições saíram das próximas redes de teste xUSD conduzidas com nossa equipe e comunidade. Primeiro, aprendemos que uma corrente mais curta pode enganar o sistema. Em segundo lugar, aprendemos que precisávamos de uma forma de mostrar o fornecimento circulante de xUSD (e futuros xAssets) ou nunca poderíamos determinar a integridade da rede de Haven.
O próximo estágio de desenvolvimento nos levou por um caminho diferente. Como afirmado acima, provar o valor de uma transação era a chave, e precisávamos substituir a prova de entradas = saídas do Monero pela prova do valor em dólares para trocas xUSD.
Tentamos mais de uma dúzia de provas, verificações e validações diferentes. Mas descobrimos que, a menos que você esteja realmente enviando XHV e nenhum outro tipo de ativo, que em testes privados é o que estávamos fazendo, todo o sistema fica confuso após algumas transações para trás e para frente. Quanto mais complexas as trocas, mais difícil ficava verificar o valor em dólares de uma transação. Em seguida, inclua várias transações, que precisam abranger grandes quantidades de entradas, e as coisas ficam realmente complicadas.
Esses desafios estavam todos relacionados com a forma como as assinaturas de compromisso funcionam, que é uma exigência absoluta no Monero. A menos que seus compromissos sejam válidos, você nunca pode verificar se o dinheiro não foi criado do nada.
Neste ponto, decidimos revisar o antigo modelo de “moedas coloridas”, Que foi anteriormente colocado sobre o Bitcoin, criando um novo conjunto de informações sobre as moedas sendo trocadas. Usando moedas coloridas, as transações podem ser “coloridas” com atributos específicos. Isso efetivamente transforma moedas coloridas em tokens, que podem ser usados para representar qualquer coisa. Mas - e isso é fundamental - moedas coloridas só podem funcionar se você não estiver vinculado à estrutura de compromisso do Monero.
Portanto, este é o desafio que assumimos: modificar a estrutura de compromisso do Monero para permitir o uso de “moedas coloridas” que podem distinguir entre XHV, xUSD e futuros xAssets em uma única cadeia baseada em Monero. E estou orgulhoso de compartilhar isso pela primeira vez, fizemos exatamente isso.
Tivemos que substituir o de Monero grupo anônimo espontâneo vinculável multicamadas (MLSAG) assinaturas com o mais recente grupo anônimo espontâneo ligável compacto (CLSAG) para fazer isso. Mas com uma pequena ajuda de um dos principais desenvolvedores do Monero, Sarang Noether, a solução agora está funcionando conforme o esperado. Gostaríamos de agradecer a Sarang por sua ajuda em nos ajudar a navegar neste novo esquema de criptografia.
Portanto, o resultado de todos esses testes e ajustes é o seguinte: criamos uma nova estrutura de transação com entradas genuínas como XHV e saídas genuínas como xUSD. Para converter de XHV para xUSD, realmente fornecemos XHV como entradas e xUSD como saídas. Daemons então verificam se o número de saídas é igual com base na taxa de câmbio fornecida no bloco que o remetente especificou como o registro de preços. Isso é feito simplesmente somando as máscaras de compromisso e a taxa de câmbio recuperada independentemente pelos verificadores.
A lógica é que um verificador sempre obterá sua própria taxa de câmbio. Portanto, a única maneira de um remetente concluir uma transação é saber a taxa de câmbio exata e o número exato de entradas (que só ele pode saber, pois está em sua carteira e ilegível em outro lugar). O verificador então soma os compromissos de produção e, levando em consideração sua taxa de câmbio obtida independentemente, compara-a com as entradas. Eles devem ser iguais para passar. Claro, todos os valores são criptografados para que ninguém possa ver ou alterar os valores.
Nota: o remetente só pode usar um registro de preços já verificado, que são todos criados atualmente através de Oráculo XHV do Chainlink. Os daemons lêem o número do registro de preços na transação e obtêm o registro (o preço real) do cabeçalho do bloco. Isso significa que os preços já são imutáveis no momento do uso.
Este é exatamente o tipo de solução que estávamos procurando depois de contemplar como abordar os desafios associados à verificação de troca xUSD no primeiro testnet. Esta solução está funcionando bem em nossos testes privados e será compartilhada em nosso próximo estágio público nos próximos dias.
Assumindo que nenhum outro problema seja identificado no teste, esta é a solução que usaremos para iniciar o xUSD ao vivo na rede principal do Haven. Como parte do processo de lançamento, esperamos compartilhar publicamente o código de troca xUSD que desenvolvemos em privado no ano passado para criar a primeira stablecoin privada.
Enquanto isso, junte-se à comunidade Haven e faça parte do futuro da privacidade financeira. Você pode se juntar ao nosso Discórdia e siga-nos no Twitter.