Assinaturas de rede Monero

Abrimos uma série de publicações sobre o dispositivo de várias cadeias de blocos e começamos a pesquisar com o Monero. Esta é uma criptomoeda bastante conhecida, implementa várias soluções algorítmicas e criptográficas interessantes. Alguns meses atrás, o suporte para multi-assinaturas foi adicionado ao Monero Core e, no artigo de hoje, examinaremos mais de perto essa tecnologia.

imagem

As assinaturas múltiplas são um mecanismo para criar e usar carteiras compartilhadas. O conceito em si não é novo, já foi implementado em algumas criptomoedas, como Bitcoin, Ethereum e outras. Sua essência está na propriedade e alienação conjunta de fundos de carteira. Algumas restrições são impostas à alienação de fundos: para realizar uma transação, é necessário coletar um certo número de votos, que é definido ao criar a carteira e depende do número de seus proprietários.

Esses parâmetros caracterizam o chamado "esquema" de uma carteira, por exemplo, 3/3 - uma carteira para três proprietários com as três assinaturas necessárias para enviar uma transação, ou 2/3 - carteira para três proprietários com as duas assinaturas necessárias de qualquer um de seus proprietários. Deve-se observar que na carteira de várias assinaturas não existe o conceito de "sua parte" e "minha parte", todos os fundos pertencem a todos os participantes ao mesmo tempo.

Criptografia em Monero


A criptografia em Monero (como na maioria das outras criptomoedas) é construída em curvas elípticas. Você pode ler sobre eles na Wikipedia . Em resumo, as vantagens desse sistema de criptografia são a maior força criptográfica em comparação com os sistemas criptográficos clássicos, um pequeno tamanho de chave e uma maior velocidade das operações criptográficas.

Cada carteira na rede Monero possui dois pares de chaves (privadas e públicas) - visualize e gaste. A exibição e o gasto do par de chaves públicas são chamados de endereço da carteira. Você pode usá-lo como um endereço para receber fundos. Se você deseja fornecer informações sobre o número e o tamanho dos recibos à sua carteira com terceiros, além do endereço, é possível fornecer uma chave de visualização privada. Um par de chave de visualização privada e gasto público é chamado de chave de rastreamento. Com ele, você pode ver o recebimento de fundos na carteira (mas não as despesas) e é absolutamente seguro - possuir um par de chaves desse tipo não poderá gastar seu dinheiro.
Talvez a chave mais secreta seja o gasto privado - você não deve compartilhá-lo com ninguém, porque possuindo uma chave de visualização privada, você pode gerenciar a carteira.

Mais adiante neste artigo, indicaremos chaves públicas em letras maiúsculas (por exemplo, B - chave de gastos públicos) e privado - em minúsculas (b - chave de gastos privados). Para entender alguns dos cálculos abaixo, no artigo, mostramos como a chave pública é herdada da privada:

Fórmula: herança de uma chave pública. B = bg

, em que G é um ponto fixo, multiplicando uma chave privada (escalar) por uma chave pública, que também é um ponto em uma curva elíptica.

Assinaturas de rede Monero


A ideia subjacente à tecnologia é simples: cada participante da carteira mantém apenas uma parte da chave de gastos privados e, ao formar e assinar transações, todas essas partes são somadas para formar uma única chave.

Obviamente, em nenhum momento, nenhum dos participantes pode coletar a chave inteira. A chave de gasto público é armazenada inteiramente por cada participante. Cada um dos participantes também armazena a versão completa da chave de exibição pública e privada, que, juntamente com os gastos públicos, permite ver os recebimentos recebidos em um endereço comum.

Criando uma carteira multisig no Monero


A versão atual do Monero suporta apenas esquemas N / N e N - 1 / N.

O processo de criação ocorre em 1 ou 2 etapas para os circuitos N / N e N - 1 / N, respectivamente. No primeiro estágio, os participantes trocam visualizações privadas e chaves de gastos públicos entre si e calculam a soma dessas chaves - todas as visualizações e todos os gastos. Assim, a chave de exibição privada da carteira se torna a soma das chaves de exibição para todos os esquemas, e a chave de gasto público para o esquema N / N é a soma das chaves de gasto público de todos os participantes. Isso encerra a geração da carteira N / N.

Para carteiras N-1 / N, outro conjunto de teclas é exibido. Esse conjunto é uma matriz de chaves privadas, calculada como o produto de sua chave de gasto particular atual por cada uma das chaves de gasto público dos outros participantes, ou seja (excluindo a função hash por simplicidade):

Fórmula: Calculando chaves multisig

E da mesma forma para cada um dos participantes.

A chave de gastos privados de cada um dos participantes será a soma de suas chaves multisig, ou seja:

imagem

Cada participante executa esta operação. Uma propriedade importante de tais obras deve ser observada, por exemplo:

imagem

A partir dessa igualdade, segue-se que cada carteira possui uma chave multisig (no nosso exemplo com esquema 2/3), que outro participante possui.

Após a geração, os participantes trocam chaves públicas multisig:

Fórmula: Calculando uma Chave Multisig Pública

No final, a chave da carteira de gastos públicos é calculada somando os valores exclusivos das chaves multisig públicas, ou seja, para o nosso exemplo, será:

Fórmula: calcule a chave de gasto público

Como podemos ver, para calcular a chave de gasto (privado e público) no caso de 2/3, precisamos de informações suficientes de dois participantes.

Isso completa a criação da carteira e pode ser usada de acordo com o esquema selecionado.

Transações em Monero


Para explicar como as transações multisig são criadas, vamos revisar brevemente como uma transação é organizada no Monero. Simplificado (sem assinaturas de anel e RingCT), pode ser imaginado da seguinte forma:

Representação simplificada da transação

Figura 1. Visualização de transação simplificada

Aqui, à direita, são mostrados os resultados da transação - o dinheiro que ele gera (uma analogia direta: notas em uma carteira) e as entradas à esquerda são o dinheiro que ele queima.

Assim, quando Alice deseja enviar 1 XMR para Bob, ela coleta 1 XMR mais comissão entre suas saídas não gastas, as coloca no lugar das entradas da transação, calcula uma imagem-chave para cada uma delas, gera saídas para a quantidade de 1 XMR e calcula para cada uma das chave de saída.

Depois de receber a transação, Bob recupera a chave de saída para cada uma das saídas usando a exibição privada e as chaves de gasto público. Se as chaves recuperadas e recebidas na transação corresponderem, ele considera essa saída como destinatária.

Apesar de uma transação multisig do ponto de vista da rede não ser diferente de qualquer outra transação, sua criação é um pouco mais complicada e em várias etapas:

  • Os participantes trocam imagens-chave parciais por resultados conhecidos (ou simplesmente trocam resultados)
  • Os participantes re-sincronizam suas carteiras para obter um equilíbrio preciso, levando em consideração a imagem principal já completa
  • O remetente prepara a transação, assina e envia para o próximo participante
  • Cada participante subsequente adiciona uma parte da assinatura do RingCT.
  • Último assinante conclui o RingCT

E agora a transação está pronta para ser enviada à rede.

Geração de imagens-chave e compartilhamento de saída


Durante a varredura do blockchain (sincronização), a carteira não pode determinar quais entradas específicas gastam suas saídas, pois não tem a capacidade de calcular a imagem principal para elas. Portanto, ele vê apenas transações recebidas (para elas, apenas os pares de chaves de rastreamento são suficientes).

Para formar uma transação correta, você precisa restaurar a imagem da chave para cada uma das saídas, varrer a blockchain e determinar quais delas são gastas e só então prosseguir para gerá-la.

Considere o processo de formar uma imagem principal. É calculado pela fórmula:

Fórmula: imagem principal da formação

, onde Hp é uma determinada função hash predeterminada, P é a chave de saída pública (consulte a Figura 1), x é a chave de saída privada que será restaurada para o destinatário dessa saída, e é calculada da seguinte forma:

Fórmula: Restaurar chave de saída privada

, em que Hs é uma certa função hash criptográfica conhecida, a é uma chave de exibição privada, R é uma chave de transação pública (chave de publicação Tx, consulte a Figura 1) eb é uma chave de gasto privada. Substituindo uma expressão por outra e abrindo os colchetes, obtemos:

Fórmula: imagem da chave de cálculo

Mas como não temos uma chave de gastos completa, precisamos restaurá-la. No caso de N / N, tudo é simples (veja, por exemplo, 3/3):

Fórmula: recuperação de imagem principal para N / N

Aqui, H p (P) b i é uma imagem-chave parcial recebida do i-ésimo participante.

Para os regimes N - 1 / N (2/3 em nome do primeiro participante sem a participação do terceiro):

Fórmula: recuperação de imagem principal para N - 1 / N

neste caso, H p (P) b i B j é uma imagem-chave parcial.

A essência do processo de troca de saídas é precisamente que o número necessário de signatários da transação envia sua imagem de chave parcial para cada uma das saídas para outros participantes da carteira. Ao mesmo tempo, os participantes não divulgam suas chaves privadas; portanto, um observador externo ou um participante inescrupuloso não tem a oportunidade de recuperar a chave de gastos completa e se apossar apenas da carteira.

Com esses dados, o iniciador da transação pode formar e preparar a assinatura. A transação gerada é enviada a todos que concordam em assiná-la para gerar assinaturas Ring CT, todas as assinaturas necessárias são criadas e a transação é enviada para a rede.

Automação de troca de dados


Os procedimentos acima são descritos para a troca de partes de chaves e imagens de chaves que precisam ser executadas uma vez ou após cada transação enviada. Na atual implementação da Monero Core Wallet, propõe-se executar essas ações manualmente, trocando os dados necessários por meio de canais de comunicação seguros com seus correspondentes manualmente (exportando os dados necessários da carteira e enviando-os por mensagens instantâneas ou de outra maneira).

Você pode demonstrar isso pelo exemplo da criação de uma carteira de acordo com o esquema 2/3 e da assinatura da transação. Cada um dos participantes executa os seguintes comandos usando o utilitário monero-wallet-cli:

  [carteira 9uKCgo]: prepare_multisig
 MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
 Envie essas informações multisig para todos os outros participantes e use make_multisig <threshold> <info1> [<info2> ...] com as informações multisig de outras pessoas
 Isso inclui a chave de exibição PRIVATE, portanto, precisa ser divulgada apenas aos participantes da carteira multisig 

 [Wallet 9uKCgo]: make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH
 É necessário outro passo
 MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP
 Envie essas informações multisig para todos os outros participantes e use finalize_multisig <info1> [<info2> ...] com as informações multisig de outras pessoas

 [Wallet 9uKCgo]: finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5 

Antes de enviar uma transação, as partes devem trocar imagens-chave parciais:

  [carteira 9uKCgo]: export_multisig_info ki1
 Informações multisig exportadas para o ki1
 [carteira 9uKCgo]: import_multisig_info ki2 ki3
 Altura 1103873, txid <f7e648915287fafca1dc67eb26267e09f92bba7ab7fd52a12600c3e6440db0eb>, 2.000000000000, idx 0/0
 Altura 1103882, txid <2e3a5591c741c0943a47a2bcbd1ec26493158088c88308bcbfc97423ea95c491>, 0.009000000000, idx 0/0
 Informações multisig importadas 

Em seguida, a carteira é sincronizada novamente, levando em consideração as chaves completas e, após receber dados sobre pagamentos, o participante pode preparar a transação:

  [carteira 9uKCgo]: transferência 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX 1
 Nenhum ID de pagamento está incluído nesta transação.  Tudo bem?  (S / Sim / N / Não): S
 Atualmente, há um atraso de 2 blocos nesse nível de taxa.  Tudo bem?  (S / Sim / N / Não) S

 Transação 1/1:
 Gastos do índice de endereço 0
 Enviando 1.000000000000.  A taxa de transação é 0,012000000000
 Tudo bem?  (S / Sim / N / Não): S
 Transações não assinadas gravadas com sucesso no arquivo: multisig_monero_tx 

É necessário transferir o arquivo gerado para outro participante para assinar e enviar para a rede:

  [carteira 9twQxU]: sign_multisig multisig_monero_tx
 Carregado 1 transações, para 1,031762770000 0,012000000000, taxa, o envio de 1,000 bilião de 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0,019762770000 mudança 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, com tamanho min anel 7, nenhum ID de pagamento.  Tudo bem?  (S / Sim / N / Não): S
 Transação assinada com êxito no arquivo multisig_monero_tx, txid 1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6
 [carteira 9twQxU]: submit_multisig multisig_monero_tx
 Carregado 1 transações, para 1,031762770000 0,012000000000, taxa, o envio de 1,000 bilião de 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0,019762770000 mudança 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, com tamanho min anel 7, nenhum ID de pagamento.  Tudo bem?  (S / Sim / N / Não): S
 Transação enviada com sucesso, transação <1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6>
 Você pode verificar seu status usando o comando `show_transfers`. 

Obviamente, essa abordagem, embora permita o uso de carteiras multisig, se você realmente quiser, não pode ser aplicada por usuários inexperientes ou, por exemplo, usuários de carteiras móveis.

Portanto, estamos desenvolvendo nossa própria solução que automatizaria a troca desses dados sem violar a privacidade das partes e a segurança das transações, a fim de tornar a tecnologia de assinatura múltipla em Monero acessível a mais pessoas. A solução é baseada em aplicativos que suportam carteiras padrão e multisig e em uma parte do servidor aberta que fornece troca de dados e encaminhamento para carteiras apropriadas.

Você pode aprender mais sobre esse projeto em wallet.exan.tech e sobre os recursos que apoiamos para a rede Monero, consulte exan.tech/en/projects/monero .

Conclusão


Examinamos o mecanismo para criar carteiras multisig e formar transações com várias assinaturas em Monero. Atualmente, apenas um conjunto limitado de esquemas de assinatura é suportado, mas ele será expandido para fórmulas arbitrárias do formato 2/5, etc. O mecanismo existente para trocar os dados necessários para o funcionamento da carteira é bastante inconveniente, mas devido à abertura do ecossistema Monero com a ajuda de soluções de terceiros, ele pode ser trazido à qualidade usual para usuários comuns.

Nos artigos a seguir, falaremos sobre outros aspectos do dispositivo Monero: assinaturas RingCT e anel, a arquitetura da carteira e a biblioteca libwallet, bem como as perspectivas de desenvolvimento deste blockchain.

Faça suas perguntas, sugira tópicos para novos artigos sobre tecnologias de criptomoeda e assine nosso grupo no Facebook para acompanhar nossos eventos e publicações.

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


All Articles