Você está na página 1de 215

Mastering Monero

Prefácio
Sobre o autor
Eu sou o Nico (“SerHack”), um pesquisador em segurança italiano,
contribuidor do Monero e autor deste livro. Encontrar boas fontes e aprender
sobre criptomoedas pode ser uma tarefa um tanto quanto desanimadora.
Especialmente para novos usuários, pode ser bastante desafiador encontrar
uma documentação técnica e ao mesmo tempo escrita de forma
compreensível. Quando comecei a aprender sobre o Monero pela primeira
vez, despendi uma quantidade enorme de tempo procurando e avaliando
diferentes materiais sobre o tema.

Decidi escrever Mastering Monero para guiá-lo nesta jornada, esteja você
querendo criar sua primeira carteira ou apenas curioso para aprender sobre
os detalhes técnicos por trás do Monero. Os primeiros capítulos foram
escritos para aqueles curiosos em saber porquê e como usar o Monero; eles
contém explicações e exemplos fáceis de entender, juntamente com
instruções práticas de uso. Os capítulos seguintes abordam progressivamente
tópicos mais avançados, compilando informações para desenvolvedores que
desejam desenvolver e contribuir com o ecossistema do Monero.

Minha aventura no mundo das criptomoedas começou quando eu conheci o


Bitcoin em Janeiro de 2016 e sempre me preocupei com as consequências do
seu livro-razão (ledger) público e transparente. Dado que o Bitcoin e a
maioria das outras criptomoedas foram desenvolvidas em torno de endereços
vinculados abertamente e moedas com históricos evidentes, as transações
acabam inevitavelmente expondo detalhes das finanças pessoais dos
usuários. O saldo de cada o endereço é público, permitindo a qualquer um
pesquisar a renda, os hábitos de consumo e o patrimônio em criptomoedas
de um indivíduo. Tal fato pode levar a consequências indesejáveis, como a
manipulação de preços com base no saldo em carteira.

Eu pensava que o Bitcoin era a única criptomoeda que existia até um amigo
me apresentar o Monero em Maio de 2017. Fiquei completamente
surpreendido pela beleza desse novo paradigma: um mundo onde detalhes
sensíveis como saldo em conta e quantias transacionadas são mantidas de
forma confidencial para proteger tanto o remetente quanto o destinatário.
Com as funcionalidades de privacidade obrigatórias e habilitadas por padrão,
a blockchain inteira do Monero é encoberta; os usuários não têm sequer a
opção de se expor acidentalmente ao realizar transações.

Reconhecendo a importância deste projeto, comecei a procurar por formas


de contribuir com a comunidade. Logo vi a oportunidade de ajudar a adesão
em massa desenvolvendo gateways de pagamentos para negócios online,
tendo liderado assim o projeto Integrações Monero (Monero Integrations,
em inglês). Seu código-fonte é aberto e foi projetado levando em
consideração a mentalidade de privacidade do Monero: nenhum cadastro ou
serviços de terceiros são necessários uma vez que os saldos são enviados
diretamente para a carteira do destinatário. A comunidade Monero sempre se
mostrou muito solidária ao longo desta empreitada e o projeto foi financiado
em sua totalidade através de um financiamento coletivo do Monero Forum
Funding System (FFS), atualmente chamado Community Crowdfunding
System (CCS) (Sistema de Financiamento Coletivo da Comunidade (SFCC),
em tradução livre).

Enquanto trabalhava no projeto Integrações Monero, descobri que a falta de


um guia compreensivo sobre o Monero era um obstáculo para usuários e
contribuidores em potencial. Essa necessidade de um guia completo me
inspirou a escrever Mastering Monero como um recurso universal para nossa
comunidade global. Sou grato pelo suporte generoso do SFCC que
possibilitou a publicação deste documento para o público geral na forma de
um eBook gratuito (e livro físico!). Seja lendo Mastering Monero na íntegra
ou apenas as seções mais pertinentes aos seus questionamentos, espero que
desfrute deste aprendizado sobre o Monero e demais projetos igualmente
interessantes da comunidade.

Como este livro está organizado


Os primeiros dois capítulos deste livro contém instruções amigáveis e não-
técnicas sobre tópicos e competências essenciais. Aos leitores curiosos em
aprender mais sobre os detalhes dos bastidores, os capítulos 3 e 4 contém
explicações conceituais e não-matemáticas sobre os recursos de privacidade
e blockchain do Monero. Os capítulos seguintes mergulham em detalhes
mais técnicos e complexos para se entender, desenvolver e integrar com o
Monero.

O primeiro capítulo (Introdução às criptomoedas e ao Monero) traz uma


introdução não-técnica voltada ao público geral, cobrindo ideias e conceitos
sobre blockchains e criptomoedas (indicado tanto para iniciantes quanto para
usuários atuais que desejam ler mais sobre os princípios do Monero).
Cobriremos a história e os fundamentos das criptomoedas e descreveremos
como o uso da tecnologia blockchain resolve muitos dos problemas
presentes no sistema financeiro tradicional, especialmente nos serviços
bancários. Infelizmente, existem fragilidades endêmicas na privacidade da
maioria das criptomoedas – discutiremos as implicações que estas
fragilidades têm em nossa vida pessoal e aprenderemos como o Monero
mitiga estes riscos e protege suas informações financeiras.

O segundo capítulo (Primeiros passos: receber, guardar e enviar Monero) é


seu guia de bolso e contém todas as competências práticas e ferramentas que
você precisará para usar o Monero sozinho! Iremos explicar alguns dos
jargões necessários e desvendar os prós e contras de cada tipo de carteira.
Você aprenderá como criar sua primeira carteira e ainda poderá usar a
carteira do Mastering Monero para praticar!

No terceiro capítulo (Como o Monero funciona), discutiremos as quatro


principais tecnologias de privacidade do Monero: RingCT, assinaturas em
anel, endereços (sigilosos) de uso único e Kovri. Estas explicações são
amigáveis e sem o uso de matemática ou códigos, assim você poderá
aprender conceitualmente como funciona cada uma dessas funcionalidades e
quais benefícios elas fornecem.

O quarto capítulo (A Rede Monero) descreve conceitualmente como a rede


do Monero e os mineradores processam as transações na blockchain.
Discutiremos o incentivo aos mineradores (recompensa do bloco + taxas) e
quais serviços eles fornecem (confirmação de transações e segurança da rede
descentralizada e “sem a necessidade de confiança”). Falaremos também
sobre o tema “polêmico” dos equipamentos especializados de mineração
(ASICs) e detalharemos a filosofia de igualdade da comunidade Monero,
bem como quais contramedidas têm sido tomadas para resistir aos ASICs.
Enquanto os capítulos iniciais focaram em aprender os conceitos e como
usar o Monero de forma prática e intuitiva, os capítulos seguintes do livro
abordarão com profundidade as especificidades do Monero, sua matemática
e seu código. Se você optar por desbravar estes tópicos avançados, estará
verdadeiramente “dominando” o Monero!

O quinto capítulo (Uma imersão profunda no Monero e em criptografia)


conduz a uma imersão aprofundada nas tecnologias de privacidade
abordadas conceitualmente no capítulo 3. Este estudo vai além das
analogias, abordando efetivamente a matemática e as especificações do
protocolo utilizado no Monero, que é uma versão melhorada do protocolo
CryptoNote.

O sexto capítulo (Comunidade e contribuição) contém informações para


aqueles que se interessam em contribuir com seu tempo e habilidades para
ajudar a comunidade Monero. Independente de quais sejam seus pontos
fortes, existem oportunidades para contribuir com traduções, marketing e
divulgação, desenvolvimento de código, aplicações e muito mais.

O sétimo capítulo (Integração do Monero para desenvolvedores) discute


meios de pagamentos e métodos úteis para representar endereços usando o
OpenAlias (legível por humanos) e o Monero URI (legível por máquinas).
Desenvolvedores de meios de pagamentos para comerciantes aprenderão
sobre a geração de endereços simplificados através do OpenAlias e como
interagir com a blockchain via chamadas remotas de procedimento (RPC,
acrônimo de Remote Procedure Calls, em inglês) ao daemon Monero. Uma
implementação em Python também foi incluída para demonstrar como
algumas tarefas simples são executadas.

O oitavo capítulo (Guia da carteira e dicas para resolução de problemas)


contém informações adicionais sobre como configurar uma carteira com
interface gráfica ou usando um terminal (linha de comando), juntamente
com dicas para resolução dos problemas mais comuns.
Capítulo 1
Introdução às criptomoedas e ao
Monero
Maria está comprando um carro de George, e neste capítulo iremos
considerar três diferentes formas que ela pode usar para pagá-lo: bancos
tradicionais, criptomoedas transparentes (por exemplo, Bitcoin) e Monero.

1.1 Pagamento através de bancos


Figura 1.1 – Maria envia dinheiro a George através do sistema bancário
tradicional.

Se Maria enviar o dinheiro a George através do sistema bancário tradicional,


eles devem confiar em três partes intermediárias (seus respectivos bancos e
um sistema de pagamentos que age como intermediário entre dois bancos
diferentes) para movimentar o saldo de maneira simbólica para eles.

Não ocorre uma movimentação real de notas ou ativos físicos; ambos bancos
simplesmente editam seus bancos de dados para representar que o saldo foi
transferido. Quando Maria realiza a transação (seja no caixa eletrônico,
usando o site do banco ou pelo app), esse sistema de pagamentos solicita ao
banco dela a subtração de 2.500,00 dólares do saldo em sua conta e depois
avisa ao banco de George para adicionar 2.500,00 dólares ao saldo dele.

Existem algumas desvantagens e riscos neste sistema, e ele ainda requer total
confiança nos bancos. Maria, George e os bancos devem assumir de boa fé
que as transações são legítimas e que os registros nos bancos de dados são
feitos de forma honesta. Essa confiança em intermediários e terceiros
representa um risco, uma vez que um banco ou agente desonesto pode
“criar” dinheiro ao editar tais registros de transações ou saldos de forma
fraudulenta.

Além do mais, Maria não possui efetivamente os 3.900,00 dólares e sim uma
promessa formal vinda de seu banco, e que ela deve confiar que será horada.
Não existe uma forma dela auditar seu banco e verificar se eles realmente
possuem esses 3.900,00 dólares. Na verdade, eles não precisam possuir essa
quantia, pois a maioria dos bancos operam legalmente no sistema de reserva
fracionária – o que permite que o valor dos ativos mantidos em caixa seja
ligeiramente inferior ao valor total dos saldos de seus correntistas.

Dependendo da forma em que o saldo foi enviado, poderá levar alguns


minutos ou até dias para que os 2.500,00 dólares apareçam na conta de
George. E dado que George não tem acesso aos registros bancários, o
processo todo torna-se opaco e não pode ser monitorado.

Muitas pessoas, especialmente aquelas que nunca passaram por experiências


de interferência econômica ou confisco, assumem a validade das notas
promissórias como algo garantido. Poucos indivíduos consideram
preocupantes as consequências de confiar suas economias de uma vida toda
a empresas pouco transparentes, muitas vezes colocando “todos os seus ovos
em uma única cesta” institucional.

Perdas podem ocorrer por uma variedade de outros motivos. A negligência


do operador bancário (enquanto, por exemplo, realiza a movimentação dos
ativos entre duas contas), é um exemplo claro. Um operador bancário precisa
lidar com sobrecarga de trabalho, falta de padronização e condições de
trabalho precárias; mesmo que se desenvolva um sistema para verificar erros
automaticamente, alguns relatos recentes provam o contrário. Devemos notar
que bancos operam com ativos parcialmente inexistentes e se todas as
pessoas sacarem seu dinheiro ao mesmo tempo, o banco excede sua
capacidade financeira e precisa encerrar suas atividades. Malícia e corrupção
também têm impacto sobre sistemas econômicos; um hacker ou empregado
mal-intencionado pode abusar de suas prerrogativas e esvaziar toda sua
conta.

A disponibilidade dos bancos sempre foi um problema para seus


correntistas: especialmente durante os finais de semana e feriados nacionais
(que variam de país para país), sempre existem algumas dificuldades práticas
pelo fato deles estarem fechados. A maioria das operações bancárias não
funcionam durante “feriados bancários” e você deve esperar sua abertura
para enviar ou receber dinheiro.

Além do mais, algoritmos não-públicos e criptografados tentam prever se


você deve ou não ser considerado um criminoso. Eles baseiam-se em uma
quantidade indescritível de dados pessoais correlacionados com informações
de compras online, dia, hora e diversos outros hábitos de consumo da sua
vida digital. Embora eu não seja totalmente contra usar a segurança nacional
ou do próprio sistema como justificativa para o monitoramento ou
vigilância, esses métodos com algoritmos podem acabar por marcar uma
conta como criminosa e bloqueá-la. Você tentou movimentar 1.000,00
dólares para uma conta no exterior para usar nas férias? Eu imagino que não
deva ser nada agradável descobrir que sua transferência foi recusada.

Somado a isso, também temos que pensar na emissão de dinheiro e quem a


controla. Atualmente, quase todas as economias mundiais baseiam-se em
bancos centrais geridos por entidades privadas (como o Federal Reserve nos
Estados Unidos) ou grandes corporações reguladas por governos (como o
BCE – Banco Central Europeu). Esses bancos centrais seguem leis ou
acordos entre estados membros para formalizar e decidir quantas notas
(Euro, Dólar, etc.) devem ser impressas. Outro problema do sistema
monetário atual é que ninguém – incluindo empresas, autoridades e governos
– consegue saber quantos Dólares ou Euros estão em circulação neste exato
momento. Mesmo os bancos tentando ser transparentes em relatórios e
publicações, não existe uma forma concreta de verificar tais informações.

Com o sistema monetário atual, um cidadão também pode estar sujeito a


outro grave problema. Em primeiro lugar: como ter certeza que você possui
uma nota verdadeira e não uma falsificada? Notícias recentes mostram que é
muito simples para criminosos “criarem” dinheiro ao imprimir notas falsas.
A constelação EURion (um padrão de símbolos incorporados às notas de
Euro) previne a realização de cópias e auxilia os usuários a identificarem
notas verdadeiras. Você deve estar se perguntando: então como tantas
pessoas ainda são enganadas, mesmo com essas medidas anti-cópias? Por
desconhecimento. O sistema monetário, por padrão, deveria garantir a
impossibilidade de criação de dinheiro ao “imprimir” mais notas.

A economia também pode ser usada como uma forma de atacar uma nação.
Às vezes, imprudência, especulações e acordos secretos entre governos
podem causar crises econômicas em um país, totais ou parciais. Devido à
globalização, tais atos podem levar à um “efeito dominó” e acabar por
desestabilizar outras economias também. Da mesma forma, um país
estrangeiro poderia “brincar” com a economia global em caso de guerra.
Como veremos nos próximos parágrafos, a última crise econômica em 2008
desempenhou um papel importantíssimo para o surgimento das
criptomoedas.

Em resumo, existia a necessidade de se ter um sistema econômico que


pudesse garantir o aspecto fundamental da confiança (isso implica também a
necessidade de qualquer um ser capaz de verificar e auditar as informações a
qualquer momento). Como garantir isso? Imaginou-se um sistema
distribuído e descentralizado. Entretanto, o problema do “general bizantino”
(paradoxo dos dois generais) precisava ser encarado. Esse problema
descreve a seguinte situação: imagine um general bizantino que precise
comunicar aos demais tenentes uma ordem para atacar alguns inimigos.
Pelas circunstâncias da guerra, todos sabem que uma ou mais pessoas podem
ser impostores e que estes, ao invés de repassar a mensagem correta,
repassam uma ordem falsa. Agora, como esses tenentes vão saber se a ordem
é verdadeira ou não? Este é o problema do consenso posto sob a ótica de um
sistema econômico: como basear-se em informações sobre transações que
foram confirmadas por um “adversário” que não deve ser confiado?

Felizmente, uma nova tecnologia emergente chamada blockchain é capaz de


mitigar todos os riscos mencionados acima ao criar um registro distribuído
em que todas as partes podem, igualmente, usar, visualizar e verificar tal
registro. Essa capacidade extraordinária de desconhecidos concordarem em
um documento compartilhado, que é chamada de consenso descentralizado,
tem sido revolucionada na última década.

É fácil nos confundirmos com essas terminologias num primeiro momento,


especialmente porque na maioria das vezes somos apresentados a diversos
conceitos e jargões de uma só vez. Você pode pensar em “blockchains”
como uma tecnologia que permite às redes estabelecerem acordos usando
um “consenso distribuído”. Ao possibilitar que desconhecidos compartilhem
um registro de forma segura, torna-se possível o desenvolvimento de
“criptomoedas” que funcionam como dinheiro digital. Existe uma infinidade
de moedas (euros, dólares, reais, etc.); de forma análoga, diversas equipes
desenvolveram diferentes criptomoedas (Monero, Ethereum, Bitcoin, etc.).
Figura 1.2 – Uma analogia entre vários termos em criptomoedas
(blockchain, consenso descentralizado e criptomoedas) e palavras
relacionadas aos sistemas de transportes mais comuns.

1.2 Introdução às blockchains


Qualquer um pode aprender tudo sobre o Monero e como sua blockchain
funciona sem precisar entender a matemática e a criptografia por trás deles
(semelhante a como qualquer um pode ter facilidade em usar a internet sem
precisar estudar como servidores DNS ou o protocolo IPv6 funcionam). Este
capítulo é focado nos principais conceitos e vocabulário sem aprofundar
em todos os detalhes técnicos – fique a vontade para pular para os capítulos
4 e 5 se você deseja imergir diretamente na estrutura e aspectos
criptográficos.

1.2.1 O que é uma blockchain?


O termo blockchain refere-se a um método específico para armazenar, de
forma segura, registros em um banco de dados compartilhado com todos os
usuários da rede. Este método é inovador por ser um sistema sem a
necessidade de confiança, onde os indivíduos possuem total autonomia
sobre seus fundos (saldo), também onde não existe uma autoridade central e
cada participante pode facilmente verificar e auditar o sistema.
Figura 1.3 – A cada poucos minutos a rede adiciona à cadeia outro
bloco permanente de informações, associando-o de forma segura ao
bloco anterior através de seu hash.

Qualquer pessoa no mundo está convidada à participar da rede como


mantenedor, e cada participante mantém os demais honestos ao verificar a
blockchain. Quando usuários transmitem informações para serem colocadas
na blockchain, os mantenedores da rede agrupam essas transmissões em
blocos e usando ferramentas criptográficas para finalizar os registros e
associá-los de forma permanente na blockchain.
Figura 1.4 – Em uma rede tradicional e centralizada (acima) todos os
usuários devem conectar-se aos computadores designados e mantidos
por terceiros, demonstrado pelo hub de servidores centrais. Em uma
rede descentralizada (abaixo) os usuários criam uma rede adhoc de
dispositivos interconectados. O Monero utiliza o segundo tipo de
sistema sem servidores centralizados especiais, empregando, em vez
disso, uma rede ponto-a-ponto resiliente de nós voluntários
compartilhando novas informações uns com os outros.

Uma vez que dados são gravados na blockchain, eles não podem mais ser
deletados, movidos ou alterados de nenhuma forma. Os registros são
imutáveis e cada participante da rede possui uma cópia correspondente da
blockchain para verificarem por si próprios. A maioria das blockchains de
criptomoedas empregam um modelo inteligente de mineração que encoraja a
participação na rede e mantém todos os registros de forma honesta e
sincronizados. Estes tipos de sistemas descentralizados são incrivelmente
robustos, uma vez que não existe um servidor ou banco de dados central
sequer que possa ser atacado ou manipulado de forma mal-intencionada.

Estes sistemas descentralizados também não necessitam de confiança, uma


vez que cada participante da rede mantém e verifica sua própria cópia dos
registros, ao invés de depender de algum terceiro. Dado que blockchains
fornecem um sistema de registros global e à prova de violação, elas são
extremamente adequadas para armazenar informações financeiras.
Em 31 de Outubro de 2008, um indivíduo ou grupo de indivíduos anônimos
conhecido como Satoshi Nakamoto publicou um white paper intitulado
“Bitcoin: Um Sistema Ponta-a-Ponta de Dinheiro Eletrônico”. Este
documento revolucionário descrevia a estrutura de uma criptomoeda
descentralizada de código aberto, bem como a tecnologia blockchain que a
tornava possível.

A Figura 1.1 na primeira seção destacou como enviar dinheiro através do


sistema bancário tradicional requer múltiplas transações, registros separados
e confiança em mais de um banco. A Figura 1.5 (abaixo) mostra como Maria
poderia enviar dinheiro a George transferindo 10,5 Bitcoin de seu endeço
(1BuUygisXY) para um endereço controlado por George (1eK5FSywkp).
Este exemplo faz referência ao Bitcoin (BTC) por mera conveniência, porém
praticamente todas as criptomoedas utilizam esse tipo de registro público e,
da mesma forma, compartilham os benefícios e problemas que veremos a
seguir.
Figura 1.5 – Maria envia dinheiro a George usando uma criptomoeda
com uma blockchain pública e transparente, como o Bitcoin.

1.2.2 Benefícios da blockchain


Alguns dos benefícios da blockchain são imediatamente aparentes:

Simplicidade (e velocidade): Enviar o dinheiro da Maria a George


requer um único passo para atualizar um único registro. Enquanto uma
transferência ou compensação bancária podem levar dias, registros na
blockchain de criptomoedas normalmente são atualizados em minutos
ou segundos (o tempo de confirmação de uma transação varia de
criptomoeda para criptomoeda).

Sem riscos ao envolver terceiros: Maria e George contam com um


sistema criptograficamente seguro e mantido por eles próprios, ao invés
de colocar seu dinheiro e confiança nas mãos de terceiros.

Pseudoanonimato: Diferentemente dos bancos, registros de


criptomoedas nunca registram nomes de pessoas, como “Maria” e
“George”. Na verdade, informações pessoais nunca são necessárias para
gerar uma carteira de criptomoeda. George acessará seus fundos
pseudoanonimamente, usando a chave do seu endereço 1eK5FSywkp
para o qual Maria enviou o dinheiro (usando sua conta 1BuUygisXY).

Bitcoin e as demais criptomoedas que surgiram depois iniciaram uma


revolução financeira que ainda está se desenvolvendo. Com estas novas
redes descentralizadas, qualquer pessoa é capaz de guardar e transferir
fundos de maneira independente e a seu próprio critério. Antes das
criptomoedas, porém, era difícil armazenar grandes fortunas de forma segura
sem ter que confiá-las a bancos ou instituições financeiras. Da mesma forma,
transferir dinheiro para outra pessoa ou comércio sempre requeria o uso de
sistemas de pagamentos terceirizados, para processar cheques, transações
bancárias ou cartões de crédito e débito.

Graças às criptomoedas, pela primeira vez, qualquer um pode exercer seu


“direito financeiro” sem depender do acesso e aprovação fornecido por
bancos e demais instituições! Em poucos minutos, qualquer dispositivo
(computador, celular, tablet) pode ser usado para inicializar uma nova
carteira de criptomoeda, totalmente funcional para receber, guardar e enviar
fundos. Configurar uma carteira não querer nenhum tipo de identificação,
taxas ou autorizações, já que o sistema identifica os usuários usando
endereços (que se parecem com um conjunto de letras e números aleatórios)
ao invés de detalhes pessoais como nome, endereço residencial ou número
de telefone.

1.2.3 Problemas da blockchain


A maioria das criptomoedas são pseudoanônimas, pois seus usuários são
identificados por números e letras incompreensíveis e não por informações
pessoais. Quando você recebe um pagamento em criptomoeda, você não tem
acesso ao nome da pessoa que o enviou; em vez disso, você recebe os fundos
de um endereço como esse: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.

Embora isso preserve a privacidade de certa forma, ainda assim algumas


informações sensíveis são expostas. Lembre-se, todo participante do sistema
de blockchain descentralizada pode acessar uma cópia completa de todos os
registros já feitos. No contexto das criptomoedas, este registro é utilizado
para determinar o saldo de qualquer endereço, por exemplo, do Bitcoin.

Nesses registros transparentes compartilhados o saldo e histórico de cada


conta são públicos! De fato, muitos sites possuem ferramentas que permitem
pesquisar qualquer endereço ou transação na blockchain de forma muito
fácil.

Imagine que você tenha uma padaria e um de seus clientes paga por uma
porção de pães usando o endereço Bitcoin
3P3QsMVK89JBNqZQv5zMAKG8FK3kJM4rjt. Rapidamente você pesquisa na
blockchain e descobre que essa conta já recebeu mais de 5.000 Bitcoins!
Sabendo que seu cliente movimentou cerca de 50.000.000,00 de dólares
(cinquenta milhões!) recentemente, você pode querer cobrar mais caro dele
na próxima vez ou simplesmente roubá-lo. Esse problema de privacidade
representa um sério risco para nossa segurança pessoal.
Além de conseguir saber o saldo de seus clientes, você também poderá ver
cada transação que eles receberam ou enviaram, incluindo: a quantidade, o
dia, a hora e ambos endereços participantes. A análise de transações e
históricos pode ser usada para traçar um perfil dos seus hábitos de consumo,
renda, economias e com quem você interage.

Uma quantidade significativa de informações pessoais sensíveis podem


acabar sendo expostas se sua identidade pseudoanônima na blockchain for
associada com sua identidade na vida real (por exemplo, durante uma
compra online ou ao registrar-se em uma corretora de criptomoedas). Muitas
vezes é possível revelar o dono de uma conta realizando uma simples
pesquisa; por exemplo, talvez você já deva ter pesquisado e acabou
descobrindo que os dois endereços Bitcoin listados acima pertencem à
Satoshi Nakamoto e ao fundo de caridade Pineapple, respectivamente.

Muitas empresas existem pelo simples propósito de rastrear e desanonimizar


blockchains transparentes. A empresa Elliptic, por exemplo, oferece uma
ferramenta interativa que mostra o fluxo de fundos entre Satoshi, meios de
pagamentos, corretoras, fóruns, lojas, serviços de aposta, caridades, pessoas
conhecidas e demais serviços.
Figura 1.6 – Análise da Elliptic mostrando o fluxo de Bitcoin no início
de 2010, extraída da ferramenta interativa Bitcoin Big Bang.

A Figura 1.6 mostra uma captura de tela detalhando transações Bitcoin no


início de 2010, incluindo conexões entre pools de mineração, Mt. Gox e o
mercado Silk Road.

Reserve alguns minutos e pare para pensar na quantidade de informações


confidenciais e valiosas que produzimos todos os dias: compras no cartão de
crédito, cada termo que você pesquisa na internet, produtos que você
visualiza ou compra, interações nas redes sociais e aplicativos de mensagens,
etc. Toda essa informação é armazenada e comercializada rotineiramente
pelo seu banco, pelos meios de pagamentos, por grandes empresas de
tecnologia e governos.

Essa coleta em massa dos seus dados leva à centralização de informações


pessoais e privadas em grandes aglomerados de material confidencial, que
tornam-se alvos cobiçados por hackers e vendedores do mercado negro. É
provável que seus dados pessoais (como nome, endereço, e-mail, número de
telefone, etc.) já estejam circulando pela internet sem seu conhecimento,
talvez associados com um dossiê demográfico e/ou de marketing.

Lembre-se dos vazamentos de dados recentes da Equifax, Target, Home


Depot, Uber e Panera. Em muitos casos, tanto informações pessoais quanto
financeiras vazaram, colocando as pessoas e seus cartões em risco.

Vazamentos acidentais de dados não são a única preocupação. Grandes


empresas de dados e tecnologia registram cuidadosamente sua atividade
online, de modo que eles podem traçar um perfil com suas preferências para
lhe prover um serviço melhor. Com frequência, esse perfil é usado para
campanhas de marketing e anúncios direcionados; porém, esses dados
também podem ser aproveitados em situações mais questionáveis, como
manipulação do seu humor ou da sua intenção de voto.

Qualquer coisa que uma empresa monitore sobre você pode acabar sendo
roubada, cuidadosamente vendida ou usada de maneira antiética. Você
deveria exercitar enorme cautela em relação à sua pegada digital, já que
informações não podem ser “desvazadas” depois que seus dados pessoais
foram expostos.

Neste exato momento, privacidade é um tema visivelmente ausente dos


principais sistemas econômicos e comerciais. Meios de pagamentos
tradicionais, bancos e criptomoedas deixam rastros plenamente visíveis que
são usados para lhe estudar, vigiar e explorar comercialmente.

A única forma garantida de exercitar seu direito à privacidade financeira é,


em primeiro lugar, evitando revelar informações pessoais! Para nos
mantermos seguros, necessitamos de um mecanismo para interagir de forma
segura – onde transações não podem ser associadas com sua identidade, suas
economias ou demais transações. A criptomoeda Monero é sua melhor
ferramenta para ajudar a recuperar o controle sobre todas essas questões!

1.3 Apresentando o Monero


MONERO (pronúncia /mōnĕrō/, plural moneroj) é uma criptomoeda, líder
no segmento com foco em transações privadas e resistentes à censura. A
natureza aberta e verificável da maioria das criptomoedas (como Bitcoin e
Ethereum) permite que qualquer pessoa no mundo rastreie seu dinheiro.
Além disso, a associação de hábitos financeiros com sua identidade pessoal
pode comprometer sua segurança.

Para evitar esses perigos, o Monero utiliza técnicas criptográficas poderosas


para criar uma rede que permita aos participantes interagir sem ter que
revelar o remetente, o destinatário ou o valor das transações. Assim como
outras criptomoedas, o Monero possui um registro descentralizado que todos
os participantes podem baixar e verificar por si mesmos.

Porém, uma série de truques matemáticos são utilizados para ocultar todos
os detalhes sensíveis e impossibilitar o rastreamento na blockchain. As
características de privacidade do Monero permitem à rede verificar a
validade de uma transação e determinar se o remetente possui ou não saldo
suficiente em conta, sem saber exatamente o valor da transação ou o próprio
saldo da conta! Ninguém pode ver o saldo em conta dos outros e as
transações não revelam a origem dos fundos que estão sendo transferidos.

Uma das características determinantes do Monero é sua filosofia de impor a


privacidade por padrão. Usuários são expressamente impedidos de iniciar
transações que sejam acidentalmente ou até mesmo propositalmente
inseguras. Assim, fornecendo aos seus usuários a tranquilidade em saber que
a rede não aceitará transações que exponham informações! Os usuários do
Monero desfrutam de todos os benefícios de um sistema financeiro
descentralizado e sem a necessidade de confiança, e ainda assim, não
precisam arriscar sua segurança e privacidade, inerentes a uma blockchain
transparente.

A Figura 1.7 mostra como Maria pagaria a George pelo carro usando
Monero. O processo funciona da mesma forma que a transação em
criptomoeda mostrada na figura 1.5, porém, informações confidenciais são
ocultadas criptograficamente. Informações como o saldo das contas e o valor
das transações são marcados com “****” na ilustração, dado que nenhum
observador externo pode determinar tais valores.
Figura 1.7 – Maria envia dinheiro a George usando Monero. Os ****s
representam informações confidenciais, como endereços e saldos, que
são ocultados pelas características de privacidade do Monero.

1.3.1 Princípios do Monero


Monero foi projetado com os seguintes princípios em mente:

Descentralização da rede: A rede Monero e seu registro são


distribuídos globalmente. Não existe um servidor ou banco de dados
sequer que possa ser hackeado, censurado ou controlado de maneira
mal-intencionada. Se um governo tentasse desativar os nós Monero em
seu país ou limitar quem pode enviar e receber Monero, o esforço seria
em vão! O restante do Mundo continuará mantendo a rede e
processando transações normalmente.

Segurança financeira: A rede Monero é protegida automaticamente


por mecanismos criptográficos incorrompíveis, não precisando confiar
a nenhum terceiro a responsabilidade sobre seus fundos e transações.
Cada participante do Monero pode verificar a validade dos registros por
si mesmos, não precisando confiar nem mesmo no operador de um nó!

Privacidade financeira: A maioria dos sistemas blockchain alcançam


elevada segurança às custas da privacidade. Porém, o Monero prioriza o
fornecimento de privacidade total sem nenhuma concessão em
segurança. Valores das transações, identidade do remetente e
destinatário são ocultadas na blockchain, de forma que suas atividades
de consumo e quanto Monero você possui não são rastreáveis.

Fungibilidade: O termo fungibilidade refere-se aos ativos cujas


unidades são consideradas indistinguíveis e intercambiáveis. Por
exemplo, imagine que você empreste ao seu vizinho 1 kg de farinha de
trigo para ele fazer um bolo. Na próxima semana, quando ele for lhe
devolver o trigo, certamente ele não estará devolvendo o mesmo 1 kg
de farinha de trigo e sim outro semelhante (uma vez que ele usou
aquele que você emprestou). Mas isso não é um problema, pois farinha
de trigo é um ativo fungível. Carros, em contrapartida, não são
fungíveis; se você emprestar seu carro ao vizinho, provavelmente vai
querer que ele devolva exatamente o mesmo a você!

No caso do Monero, sua fungibilidade é consequência de suas práticas


sofisticadas de privacidade; ocultar o registro das transações esconde
também todo o histórico do Monero. Se você emprestar 1 Monero ao seu
amigo, ele poderá lhe devolver qualquer 1 Monero, uma vez que eles são
indistinguíveis. Essa qualidade excepcional pode parecer um mero detalhe;
porém, fungibilidade é imprescindível para a maioria das aplicações de
qualquer unidade monetária (confira os exemplos abaixo). E essa
característica está ausente da maioria das criptomoedas, todas aquelas com
registros transparentes e históricos rastreáveis.

1.3.2 “Aplicações” do Monero na vida real


Esta seção trata de algumas dificuldades e riscos que surgem ao fazer uso de
criptomoedas inseguras. Por questões de simplicidade, os exemplos referem-
se ao “Bitcoin” como o exemplo de criptomoeda com blockchain
transparente. Estas desvantagens, porém, estão presentes basicamente em
todas criptomoedas.

Manipulação de preço: Sofia é a única mecânica de uma cidadezinha


no interior. Um de seus clientes pagou por uma troca de óleo usando
Bitcoin. Pouco tempo depois Sofia pesquisa pelo endereço na
blockchain e vê que a carteira de seu cliente continha Bitcoins
suficientes para comprar uma Lamborghini. A próxima vez que ele
precisou de um reparo, ela cobrou o dobro do preço. Se esse cliente
tivesse usado Monero, Sofia não teria como ver seu saldo nem usar tal
informação para manipular os preços.

Vigilância financeira: Os pais de Oleg enviam-no alguns Bitcoins para


ele comprar livros, e depois continuam a bisbilhotar seu endereço e
movimentações. Alguns meses depois, Oleg envia o restante de seus
Bitcoins em forma de doação para o endereço Bitcoin de uma
organização que possui uma posição política diferente da de seus pais.
Ele não imagina que eles estão bisbilhotando sua atividade no Bitcoin
até seus pais lhe enviarem um e-mail furioso, condenando-o. Se Oleg
tivesse usado Monero, sua família não teria ficado magoada por
intrometer-se em sua atividade financeira.

Privacidade da cadeia de suprimentos: Kyung-seok é dono de uma


pequena empresa provedora de serviços de bufê para eventos locais.
Uma grande empresa do ramo alimentício usa rastreamento de
blockchain para identificar seus clientes mais frequentes, criando uma
lista. A grande empresa utiliza então essa lista para entrar em contato
com os clientes de Kyung-seok e oferece-lhes os mesmos serviços com
5% de desconto. Se a empresa de Kyung-seok tivesse usado Monero, o
histórico de suas transações não poderia ter sido explorado por seus
concorrentes para roubar clientes.

Discriminação: Ramona encontra o apartamento de seus sonhos,


convenientemente próximo a seu novo trabalho e em uma ótima
vizinhança. Todo mês ela paga seu aluguel usando Bitcoin. Porém, o
proprietário nota que alguns dos pagamentos originam-se de um casino
online devidamente regularizado. Por questões pessoais, o proprietário
repudia sistemas de apostas e inesperadamente decide não renovar o
contrato de Ramona. Se Ramona tivesse usado Monero para pagar o
aluguel, o proprietário não seria capaz de revisar o histórico de suas
movimentações e discriminar sua fonte de renda legalmente conforme.

Privacidade e segurança de transações: Sven vende sua guitarra a um


desconhecido e fornece ao comprador seu endereço Bitcoin, o mesmo
que ele usa para guardar suas economias de longo-prazo. O comprador
verifica a blockchain, vê a quantidade de dinheiro que Sven tem
guardado e acaba assaltando-o a mão armada. Se Sven tivesse dado ao
comprador um endereço Monero, o comprador não teria conseguido ver
sua fortuna.

Moedas manchadas: Loki vende algumas de suas pinturas online para


juntar dinheiro para a universidade. No momento em que foi pagar pela
matrícula, ficou chocado ao receber a mensagem “pagamento
INVÁLIDO” no portal do curso. Sem que Loki soubesse, um de seus
quadros foi comprado usando Bitcoin que havia sido roubado de uma
corretora hackeada no ano passado. Dado que a universidade rejeita
qualquer pagamento oriundo de uma lista negra de Bitcoins
“manchados”, eles se recusam a marcar a matrícula como “paga”. Loki
encontra-se em uma situação extremamente difícil: os Bitcoins que ele
poupou já foram transferidos de sua conta, e ainda assim a taxa de
inscrição não foi considerada paga. Essa situação poderia ter sido
evitada por completo se Loki tivesse vendido suas pinturas por Monero,
uma vez que sua característica de fungibilidade impede o rastreamento
e a criação de listas negras.

Esses exemplos demonstram como as características de privacidade do


Monero mantém seus usuários a salvo de uma família bisbilhoteira, moedas
manchadas e práticas de negócios antiéticas. Todas as criptomoedas são uma
tecnologia relativamente nova e não existe essa coisa de “privacidade
perfeita”. Se manter um pagamento específico privado é uma questão de
vida ou morte, pode ser arriscado usar qualquer criptomoeda para essa
transação.

1.3.3 Monero: comunidade e software descentralizados de


código aberto
Monero é um projeto código aberto ativamente desenvolvido por
especialistas em criptografia e sistemas distribuídos de todas as partes do
mundo. Muitos desses desenvolvedores doam seu tempo livre ao Projeto
Monero. Outros são financiados pela própria comunidade Monero para que
eles possam focar exclusivamente no projeto.

A natureza descentralizada da equipe de desenvolvimento do Monero trás


muitos benefícios em relação a uma empresa ou organização consolidada. O
Projeto Monero é uma entidade consciente, muito maior que qualquer
indivíduo ou grupo. Uma vez que tanto a rede quanto a equipe de
desenvolvimento estão espalhados pelo mundo, eles não podem ser
desativados por nenhum país.

O termo código aberto significa que o código-fonte (programação de


software) está publicamente disponível para qualquer um inspecionar. A
alternativa são softwares com código-fonte fechados, onde os
desenvolvedores disponibilizam somente o produto compilado (como os
arquivos .exe) que não podem ser abertos e estudados. Se você utiliza
software com código-fonte fechado, você está confiando nos
desenvolvedores e distribuidores. O problema é que mesmo um
desenvolvedor com as melhores das intenções pode cometer erros, que
posteriormente serão descobertos e abusados por hackers. Somente utilize
criptomoedas com software de código aberto e que tenha sido auditado por
entidades independentes para verificar a ausência de códigos mal-
intencionados, erros acidentais e limitações de implementação.

A comunidade de criptomoedas abraçou os softwares de código aberto desde


o início: o Bitcoin foi publicado na forma de um white paper público com
código-fonte aberto e feito pela comunidade, em forte contraste com a
estrutura de decisão proprietária e opaca endêmica às moedas fiduciárias
(mantidas por governos). Mas é claro que a filosofia código aberto já existe
há muito mais tempo que as criptomoedas! Por mais de 25 anos, mais de
5.000 desenvolvedores têm contribuído com o kernel Linux, que é
amplamente considerado como um dos sistemas operacionais mais seguros.

Os benefícios de confiança e segurança proporcionados por softwares código


aberto são de extrema importância para qualquer criptomoeda, assim, o
Projeto Monero é inteiramente de código aberto. Os desenvolvedores usam o
GitHub para controlar versões, permitindo a qualquer um revisar com
facilidade cada linha de código a ser adicionada, removida ou modificada.
Mais de 240 desenvolvedores já contribuíram, revisaram e testaram o código
do Monero, reduzindo assim drasticamente a chance de deixar algum erro
passar despercebido. Desenvolvedores poderão encontrar mais informações
sobre como interagir com o código-base do Monero nos capítulos 6 e 7.

Transparência por parte da equipe de desenvolvimento é muito importante


para a confiança da comunidade, especialmente para criptomoedas. As
discussões sobre desenvolvimento acontecem em canais abertos no IRC e o
site do Projeto Monero disponibiliza os históricos de todas as reuniões.

1.3.4 História do Monero


Em 2013, Nicolas van Saberhagen publicou o protocolo “CryptoNote”,
tornando-se este a base para muitas moedas, a começar pelo Bytecoin. O
criador do Bytecoin, assim como Satoshi Nakamoto no Bitcoin, permaneceu
anônimo e promoveu sua moeda em um tópico do fórum Bitcointalk.
Alguns aspectos do Bytecoin pareceram duvidosos sob um olhar mais
crítico. Um membro do Bitcointalk chamado “thankful_for_today”
investigou a curva de emissão e notou que aproximadamente 82% das
moedas já haviam sido emitidas, assim, era provável que a quantidade de
moedas em circulação estivesse perigosamente centralizada.

Por fim, essa mineração prévia gananciosa deteriorou a viabilidade e a


credibilidade do Bytecoin. Felizmente, thankful_for_today reconheceu o
valor das características do CryptoNote e incorporou-as em um novo projeto
centrado numa equipe de desenvolvimento forte e liderada pela comunidade.
A criptomoeda Monero, sob a liderança de thankful_for_today, foi lançada
em Abril de 2014. A moeda foi originalmente chamada de “BitMonero”,
mas logo a comunidade votou para encurtar seu nome para “Monero”, cuja
palavra significa “moeda” no idioma Esperanto.

1.3.5 Discussão ética


O Monero foi cuidadosamente projetado para fornecer características como
fungibilidade e privacidade das transações, as quais são necessárias para que
qualquer moeda (cripto ou não) seja viável para o uso geral. Como discutido
na seção “‘Aplicações’ do Monero na vida real”, existem diversos problemas
práticos que acarretam sistemas financeiros que não protegem a privacidade
de seus usuários.

Exatamente as mesmas características necessárias para manter o Monero


seguro para seus usuários e para as empresas, infelizmente também são
atraentes para aqueles que desejam ocultar atividades ilícitas. O Monero não
foi especialmente projetado para facilitar atividades ilícitas, fato que têm
acometido todas as moedas desde que a noção de dinheiro foi concebida
milhares de anos atrás. A proporção de transações ilegais conduzidas usando
criptomoedas é insignificante perto da extraordinariamente grande
quantidade de atividade criminosa que ocorre diariamente usando moedas
fiduciárias como Euro, Rúpia, Yen ou Dólar.

A mineração no Monero foi projetada para ser compatível com


computadores, celulares, tablets e a maioria dos navegadores; isso permite
que qualquer um ingresse facilmente no ecossistema de mineração sem
barreiras quanto ao custo de equipamentos. Infelizmente, hackers têm tirado
proveito dessa acessibilidade para criar sites e softwares que mineram
Monero secretamente. Mineração sem consentimento é equivalente a roubo
de recursos e a comunidade Monero organizou recentemente uma equipe de
voluntários para auxiliar as vítimas de forma gratuita. O Grupo de Resposta
a Malwares proporciona educação, ferramentas e suporte em tempo real para
ajudar a combater softwares que usam o Monero para mineração ilegal e
ransomware.

Os criadores de Mastering Monero estão empolgados com o uso


disseminado da moeda para fins pessoais, no varejo e em aplicações
comerciais. Esperamos que nossos leitores usem o Monero frequentemente e
com ética! Vou pode procurar lojas online que aceitam Monero através do
Project Coral Reef. Existem muitos sites que facilitam o uso filantrópico de
seu computador para minerar Monero e apoiar várias organizações sem fins
lucrativos como a UNICEF Austrália, BailBloc e Change.org.
Capítulo 2
Primeiros passos: receber, guardar e
enviar Monero
O último capítulo focou em POR QUE usar Monero; neste capítulo você
aprenderá COMO usar Monero. É possível dominar o Monero sem precisar
aprender nenhum detalhe complexo nem técnico sobre criptografia ou redes,
logo, esse tipo de informação extra será apresentada mais à frente neste
livro. O Capítulo 2 abordará todas as habilidades necessárias para você
começar a receber, guardar e enviar seus moneroj.

A primeira parte deste capítulo aborda os principais conceitos e


terminologias para usar Monero, com informações expostas de uma maneira
generalista e que servirá para qualquer carteira ou software. Próximo ao fim
do capítulo, você encontrará guias práticos para realizar estes passos usando
a carteira gratuita, oficial e de código aberto do Monero, tanto para linha de
comando (CLI) quanto usando uma interface gráfica (GUI).

2.1 O que é uma carteira?


Antes de comprar alguns moneroj, é preciso planejar com antecedência onde
você receberá e armazenará seus fundos. E você precisará de uma carteira
para ajudá-lo a guardar e gastar seus moneroj. O papel moeda que você usa
atualmente (por exemplo, euros ou dólares) pode ser armazenado em
diferentes tipos de carteiras físicas. Da mesma forma, existem vários tipos
diferentes de carteiras Monero, e você sempre poderá movimentar um pouco
do seu dinheiro de uma carteira antiga para uma nova.

As carteiras encarregam-se dos processos criptográficos e complicados por


você, logo, você não precisa ser especialista em matemática aplicada para
usar Monero. Você só precisará gerenciar uma “semente” e seus endereço(s),
e aprender como utilizar as funcionalidades oferecidas pela carteira que
escolher. Demais detalhes como chaves públicas e privadas são gerenciados
automaticamente pela sua carteira, então eles não serão discutidos até o
Capítulo 5.
Embora sua semente seja convertida em um conjunto de 12 a 25 palavras
para maior conveniência, ela é na verdade um número secreto que sua
carteira utiliza para localizar e gastar seus moneroj. Esse segredo é como um
mapa do tesouro que localiza seu dinheiro na blockchain e qualquer pessoa
que saiba sua semente poderá usar uma carteira para acessar e gastar seus
moneroj. Por essa razão, você deve ser extremamente cuidadoso ao gerar e
armazenar sua semente. Nunca configure sua carteira enquanto numa
cafeteria, onde outras pessoas ou câmeras poderão ver seu segredo. É
igualmente perigoso armazenar sua semente em meios eletrônicos (por
exemplo, em um arquivo de texto ou e-mail), uma vez que softwares ou
serviços mal-intencionados poderão ser capazes de encontrá-la e fugir com
seus moneroj.

Sua semente é usada para gerar seu(s) endereço(s) para receber moneroj.
Assim como seu endereço postal, você compartilha seu endereço Monero
com as pessoas que querem lhe enviar algo. A maioria das carteiras mostram
seu endereço em dois formatos diferentes – um conjunto de letras e número
ou de forma visual usando um código QR. Você pode compartilhar
tranquilamente qualquer um dos dois sempre que quiser fornecer seus
endereços a alguém.

Se sua carteira Monero for fisicamente comprometida ou corrompida, basta


importar sua semente em uma nova carteira e retomar exatamente de onde
você parou! Enquanto você tiver uma cópia da sua semente, sempre poderá
acessar seus fundos. No entanto, se perder sua semente, nunca mais será
possível recuperar o acesso aos seus moneroj. Talvez você esteja
acostumado com senhas, que geralmente podem ser redefinidas ao contatar
um administrador. Sementes não são como senhas – ninguém além de você
mesmo sabe esse segredo e a rede não será capaz de transferir seus moneroj
para uma nova conta se você perder sua semente.

A maioria dos softwares irão solicitar que você escreva sua semente em um
pedaço de papel sempre que criar uma nova carteira. Outros apps, no
entanto, pulam esse passo e você deve tomar a iniciativa de encontrar a
opção de backup e anotar sua semente em um papel. Certifique-se de fazê-lo
imediatamente, porque se algum dispositivo parar de funcionar você perderá
seus fundos para sempre.
Figura 2.1 – As carteiras encarregam-se das principais funções para que
você possa usar Monero.

2.2 Selecionando a(s) melhore(s) carteira(s)


para suas necessidades
Nesta seção, você aprenderá sobre os diferentes tipos de carteiras
disponíveis para armazenar seus moneroj.

Você provavelmente guarda grande parte do seu dinheiro (por exemplo,


euros ou dólares) em um banco ou cofre, e carrega em sua carteira uma
pequena quantia para usar no dia-a-dia. Da mesma forma, muitas pessoas
utilizam dois tipos complementares de carteiras para suas criptomoedas: uma
carteira mais conveniente, chamada “carteira quente”, para manter pequenas
quantias e usar no dia-a-dia, e outra complementar mais segura, chamada
“carteira fria”, para manter grandes quantidades ou economias a longo-
prazo.

Existem várias soluções de armazenamento e elas variam em termos de


conveniência, privacidade e segurança. Suas necessidades individuais irão
determinar quais tipos de carteira funciona melhor para você. Os tipos de
carteiras descritos abaixo diferem principalmente em onde sua semente é
armazenada.

2.2.1 Carteiras de software e para dispositivos móveis


Carteiras de software (em um computador ou celular) são convenientes para
armazenar e usar Monero. Muitos usuários Monero mantém uma carteira
quente em seus celulares para comprar coisas no dia-a-dia. Uma boa regra
geral é manter em seu celular a mesma quantidade de criptomoedas que você
normalmente manteria em dinheiro “vivo” na sua carteira. Carteiras de
software armazenam sua semente secreta no próprio dispositivo, então seus
moneroj podem ser roubados caso você seja infectado por um vírus ou
keylogger.
Figura 2.2.a – Monerujo (Carteira para Android)

Figura 2.2.b – Cake Wallet (Carteira para iOS)

2.2.2 Carteira de hardware


Carteiras de hardware são dispositivos físicos que encarregam-se de funções
sensíveis da carteira, executando-as completamente isoladas do computador
ou celular que estejam conectadas. Carteiras de hardware possuem suas
próprias telas, onde exibem sua semente e os detalhes das transações sem
nunca mandá-los a um dispositivo externo!

Embora carteiras de hardware sejam menos convenientes que as de software,


elas são extremamente seguras! Pela forma como elas armazenam e
protegem sua semente, você pode usar uma carteira de hardware para enviar
transações com segurança, mesmo a partir de dispositivos que você suspeite
que estejam comprometidos com softwares mal-intencionados. A
comunidade Monero está desenvolvendo atualmente a “Kastelo” – a
primeira carteira de hardware de código aberto.

Figura 2.3 – Kastelo é uma carteira de hardware para Monero e de


código aberto.

2.2.3 Carteiras em papel


Carteiras em papel oferecem uma forma barata de guardar os moneroj que
você não pretende usar com tanta frequência. Você simplesmente imprime
uma cópia física das suas chaves públicas e secretas para armazenar em
segurança. Dado que os segredos da sua semente Monero estão somente no
papel, e não em forma digital, não é preciso preocupar-se com vírus ou
vazamento de dados. As carteiras em papel, porém, não são tão convenientes
para o uso frequente, já que você precisará transferir os segredos para um
dispositivo digital toda vez que desejar gastar seus moneroj.
Figura 2.4 – Uma carteira em papel é uma cópia impressa das suas
chaves Monero. Certifique-se que ninguém veja as informações
secretas!

2.2.4 Carteiras web


Carteiras web são contas Monero que você acessa através de um site
hospedado por um terceiro. Essas carteiras online são extremamente
convenientes, embora a conveniência venha às custas de menor segurança e
privacidade. Existem basicamente dois tipo de carteiras web – a principal
diferença está no fato de você ter ou não acesso à sua semente.

O primeiro tipo de carteira web armazena seu dinheiro em contas próprias e


fornece a você um nome de usuário e senha para acessá-lo (nota: isso inclui
suas “carteiras” em corretoras). Dado que você não tem acesso à semente,
você não controla seus fundos diretamente; você deve confiar no prestador
do serviço para controlar seu dinheiro por você. É preciso ser extremamente
cuidadoso ao manter seus moneroj nesses tipos de carteiras, que estão
essencialmente lhe provendo um serviço bancário. É possível que eles
percam seus fundos a qualquer momento, seja acidentalmente ou por roubo.
Se o site for desativado, seu nome de usuário e senha não servirão de nada –
já que você não possui a semente da carteira, seus fundos estão perdidos para
sempre.

O segundo tipo de carteira web, em contrapartida, mantém sua semente e


seus fundos exclusivamente sob seu controle. Carteiras web bem projetadas,
como a MyMonero, utilizam métodos seguros para acessar seus fundos sem
nunca precisar enviar sua semente secreta para servidores externos. É
preciso inserir sua semente toda vez que for acessar, pois o provedor não a
conhece nem a armazena em seu dispositivo. Esse tipo de carteira web é
(relativamente) segura, uma vez que nenhum terceiro controla seus fundos.
Eles apenas oferecem uma interface de software em seu navegador. Se um
site deste tipo ficar inacessível, você sempre poderá inserir sua semente em
outra carteira e recuperar seus fundos por completo.

Embora carteiras web sejam convenientes, nenhum tipo delas é


recomendado para armazenamento de longo prazo ou de grandes quantias.
Ambos tipos possuem aspectos negativos (confiar seus fundos a um terceiro
ou ter que inserir frequentemente sua semente em um navegador) e existem
concessões de privacidade em ambos os casos.

Figura 2.5 – Interface da MyMonero.

2.2.5 Carteiras frias


O termo carteira fria é uma designação abrangente usada para referir-se a
carteiras em papel e demais métodos de armazenamento offline. Por
exemplo, uma carteira fria eletrônica pode ser um celular ou computador que
é usado exclusivamente para interagir com criptomoedas e permanece
desconectado da internet, exceto quando em uso. O dispositivo pode usar
qualquer sistema operacional; a parte importante é sempre manter sólidas
práticas de segurança (incluindo firewall, antivírus e extrema cautela,
acessando somente sites e softwares confiáveis). A semente ainda estará
neste dispositivo, porém você o manterá isolado do restante do mundo o
máximo possível.

Figura 2.6 – Uma carteira fria refere-se a um dispositivo seguro,


destinado somente para armazenar e transacionar criptomoedas. Um
computador executando a linha de comando do Monero é mostrada no
exemplo acima.

2.2.6 Links para as carteiras Monero


Independentemente do tipo que carteira que escolher, tenha sempre o
cuidado de baixar softwares aprovados e usando os meios corretos. Ataques
de phishing e carteiras falsas existem aos montes, então certifique-se de
verificar mais de uma vez que está instalando um software legítimo! Se você
inserir sua semente em uma carteira mal-intencionada, seus moneroj terão
desaparecido antes mesmo de você notar.

Esta seção contém links para diversas carteiras de código aberto que são
desenvolvidas e confiadas pela comunidade Monero.

Carteiras Leves:

Monerujo – Android
Cake Wallet – iOS
Mymonero.com – Carteira Web, para Área de Trabalho, Android e iOS

SOFTWARE OFICIAL:

Interface Gráfica (GUI) – Windows, Mac e Linux


Linha de Comando (CLI) – Windows, Mac e Linux

2.2.7 Conectando-se a um nó remoto (opcional)


É possível reduzir o tempo de sincronização e uso em disco conectando-se a
um nó remoto ao invés de armazenar a blockchain inteira em seu dispositivo.
A maioria das carteiras para dispositivos móveis, como os apps leves
listados acima, são automaticamente configurados para conectarem-se a um
nó remoto por padrão. Se precisar direcionar manualmente seu software a
um nó remoto, você pode usar os recursos disponibilizados pela comunidade
em node.moneroworld.com (porta 18089).

Nós são computadores que baixaram a blockchain inteira e ajudam outros


usuários a sincronizar suas carteiras e a transmitir suas transações. Executar
seu seu próprio nó (local) é melhor para privacidade e você pode optar por
compartilhá-lo publicamente se desejar ajudar a manter a rede segura. Nós
remotos são convenientes e permitem que você comece a usar Monero
rapidamente, sem ter que baixar a blockchain inteira.

Executar um nó não é a mesma coisa que minerar Monero. Mineração é um


processo diferente que exige mais recursos, e não será discutido até o
Capítulo 4. Uma vez que a blockchain esteja sincronizada, executar um nó
local não exige muitos recursos de CPU e nem de rede.

2.3 Usando Monero


Esta seção explica o que é preciso saber para enviar e receber Monero.
Todos os exemplos neste livro utilizam a seguinte semente:
SEMENTE DE DEMONSTRAÇÃO DO MASTERING MONERO: lamb hexagon aces
acquire twang bluntly argue when unafraid awning academy nail
threaten sailor palace selfish cadets click sickness juggled
border thumbs remedy ridges border
Figura 2.7 – Carteiras utilizam a semente secreta para gerar endereços
para receber Monero.

Você pode importar essa semente para praticar a geração de endereços,


consultar o histórico de transações e verificar pagamentos. Fique a vontade
para usar essa semente para seguir todos os exemplos do livro, mas não
envie seus moneroj para ela! Qualquer pessoa lendo Mastering Monero será
capaz de gastá-los!

2.3.1 Recebendo Monero


Tudo que você precisa fazer para receber Monero é compartilhar o endereço
da sua carteira com a pessoa que lhe enviará moneroj. A maioria das
carteiras irão exibir seu endereço em dois formatos: uma sequência
alfanumérica que é fácil de copiar e colar, e um código QR que é prático
para escanear com uma câmera. Aqui estão os exemplos dos dois formatos
usando a semente de demonstração acima:

Seu endereço para receber Monero pode ser representado por uma
sequência alfanumérica ou um código QR. Você pode compartilhar o
que for mais conveniente para você, ou ambos. Neste exemplo, temos:
4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9
sghopxXgQSh1RTd54JdvvCRsXiF41xvfeW5

Esse endereço que você compartilha nunca será armazenado na blockchain


(graças a uma característica do Monero conhecida como endereços sigilosos,
discutida conceitualmente no Capítulo 3 e tecnicamente no Capítulo 5). O
Monero também permite a geração de múltiplos subendereços a partir de
uma mesma semente secreta, assim você pode compartilhar vários endereços
e todos depósitos irão para a mesma carteira.
Cada conta do Monero possui um único endereço primário (começando com
um “4”). Por conveniência, você pode gerar uma quantidade ilimitada de
subendereços (começando com um “8”). Fundos recebidos por qualquer
endereço ou subendereço serão direcionados ao saldo principal da carteira.

As carteiras podem precisar esperar de 10 a 20 minutos para marcar fundos


como recebidos e seguros para serem gastos (você poderá aprender o porquê
disso no Capítulo 4). Trata-se de uma prática comum de segurança e
normalmente as carteiras mostram a transação como não-confirmada durante
o período de espera. Se sua carteira estiver esperando um pagamento no
valor de 0,06 XMR ser confirmado, você provavelmente verá algo como na
imagem abaixo.
Não precisa se preocupar quando isso acontecer! Em menos de meia-hora, os
fundos serão confirmados e adicionados ao saldo disponível da carteira.

O Monero também conta com a habilidade de compartilhar uma versão


somente-leitura da sua carteira, que é capaz de ver todas as transações de
entrada mas não pode ver nem enviar transações de saída. Essa característica
tem muitas aplicações importantes: proporcionar transparência total a
doações para caridades, fornecer acesso aos registros financeiros por
auditores autorizados e criação de dispositivos com acesso limitado para
monitorar o recebimento de pagamentos. Inicializar uma carteira somente-
leitura envolve o compartilhamento de uma chave de visualização secreta,
que é diferente da semente secreta; este tópico será abordado no Capítulo 5.

2.3.2 Enviando Monero


Para enviar Monero, basta inserir ou escanear o endereço do destinatário e
digitar a quantia que deseja transferir. Clique em “enviar” e sua transação
será inicializada!

Se estiver enviando moneroj para um negócio, talvez eles também solicitem


que você insira uma ID de pagamento para associar o pagamento com seu
pedido. Se estiver enviado moneroj para si mesmo ou um amigo, pode deixar
o campo ID do pagamento em branco. Alguns serviços utilizam “endereços
integrados”, que combinam uma ID de pagamento e um endereço em uma
única sequência alfanumérica para maior conveniência e privacidade.

Em 2018, Monero adicionou a habilidade de cada carteira gerar um vasto


número de subendereços para receber pagamentos. Consequentemente, IDs
de pagamento e endereços integrados têm sido usados com menor
frequência. Ao invés de fornecer a cada consumidor o mesmo endereço mas
com IDs de pagamento diferentes, comerciantes mais modernos fornecem a
cada cliente um subendereço único (este sistema é mais simples e tem menos
espaço para “erros do usuário”).

Qualquer pessoa usando o sistema gratuito OpenAlias pode oferecer um


endereço Monero legível por humanos (por exemplo,
“donate.getmonero.org”) ao invés de um endereço “cru” (44AFFq5k…).
Enviar a um endereço OpenAlias não é diferente de enviar a um endereço
cru. Porém, configurar um novo endereço OpenAlias é uma tarefa um pouco
mais técnica, abordada no Capítulo 7.

Por fim, sua carteira adicionará uma pequena taxa para recompensar a rede
por encaminhar e processar sua transação. Sua carteira irá recomendar uma
taxa apropriada baseando-se no estado atual da rede, a urgência da sua
transação e algumas outras considerações. Você pode aprender como essas
taxas funcionam e por que são necessárias para manter a rede no Capítulo 4.

2.3.3 Prova de pagamento


Devido ao anonimato do Monero, você deve estar se perguntando como
alguém pode provar que um pagamento foi enviado. Além de IDs de
pagamento opcionais, o Monero possui uma segunda característica para
revelar, de forma seletiva, que fundos foram enviados. Isso é feito
compartilhando uma chave da transação que somente o verdadeiro remetente
seria capaz de gerar.

Exemplo

Imagine que seus amigos Khan e Maria lhe devem, cada um, 0,06552376
XMR por um lanche que vocês dividiram. Você só recebe 1 pagamento, com
as seguintes informações:

Quantidade: 0,06552376 XMR


ID da transação:
4b540773ddf9e819f0df47708f3d3c9f7f62933150b90edc89103d36d42c
a4b7
Recebido no (seu) subendereço:
899Ao1NQtu4ezACgw1QKXK4QBf5s8a3WHHtAjFfPm3Nf71mAkR
EEgAuKzASXHt8E7vVJFKsQJuvApBfu21WY9WN97Put8M5

Essa é uma transação real recebida pela carteira de DEMONSTRAÇÃO no


dia 20 de Abril de 2018. Você pode ver algumas informações através do
explorador de blockchain, porém, no Monero o remetente sempre será
desconhecido. Tanto Maria quanto Khan afirmam que enviaram o
pagamento, então você pede aos dois que forneçam a chave da transação.
Khan:
OutProofV1N4Y5pUJEnRACJyB5C3zK1zTqAihdnN8MfVZhEWfD13Z2N7Npt1uxa1
EY7N7jnvuJF76tXUwKrakvZSxTj4Zux5SpavFb4X1jRcLAJ2b5hqviQPiS58j2qH
53QL44CJEgHtY5

Maria:
OutProofV1To53Qu2gegZbUevosKCTwrEdqiECgFyUygutXMEdhrHg1EtXMrFNas
zWYFjdU4aXFZ2iPF8G8jzoDJzCoW5dsWvb4mVN65abAya3U47cGXs7WABrTzG5aP
fV4YBANhwPgwD2

Quando você verifica ambas chaves da transação, o pagamento de Maria é


confirmado para seu endereço e a chave de Khan retorna “assinatura inválida
(bad signature)”. Você pode praticar esse exemplo usando o endereço e as
chaves da transação fornecidos acima!

2.4 Segurança operacional


Figura 2.8 – Ataques phishing muitas vezes utilizam links (URLs)
levemente diferentes para enganar usuários e fazê-los inserir suas
sementes ou senhas em uma cópia do site verdadeiro (por exemplo,
www./mymonera/.com, ao invés de www.mymonero.com). Sempre
verifique a URL cuidadosamente, especialmente quando for clicar em
algum link.

O Monero permite que você seja seu próprio banco, uma vez que ninguém
controla seus fundos a não ser você mesmo! Esse empoderamento financeiro
raiz é um dos maiores benefícios das criptomoedas. Entretanto, com grandes
poderes vêm grandes responsabilidades! Cuidar da sua segurança
operacional (OpSec) é importante para manter você e seus fundos seguros.

2.4.1 Nunca diga quanto Monero você possui


Ditados como “o peixe morre pela boca” existem por um motivo. Quando
você divulga publicamente quanto Monero você tem, você acabará,
invariavelmente, tornando-se alvo de golpistas e ladrões. Isso é
especialmente verdade no caso de fóruns online e redes sociais.

Golpistas e ladrões vasculham a internet procurando por pessoas que tenham


revelado informações sobre elas mesmas e sobre sua fortuna.

A maioria das pessoas são melhores do que isto e não postam nas redes
sociais sobre o saldo de sua conta bancária ou seu patrimônio financeiro.
Além de indelicado, representa um risco à segurança e pode comprometer
relações interpessoais quando desigualdades financeiras estão envolvidas.
Mesmo assim, muitas pessoas ingenuamente dizem quanto Bitcoin ou
Monero eles compraram.

Lembre-se que o preço de criptomoedas é volátil e conhecido por subir


drasticamente. Uma postagem dizendo “Acabei de gastar 50 dólares em
Bitcoin” de 2012 poderia parecer modesta na época, porém esses 50 dólares
(aproximadamente 10 BTC em 2012) valiam quase um milhão de dólares no
final de 2017, menos de 5 anos depois! Mensagens na internet podem ser
difíceis de apagar, então a melhor forma de evitar essa situação é, em
primeiro lugar, nunca postar.
Dado o interesse generalizado em investimentos em criptomoedas, existem
muitas conversas sobre composição de portfólios e carteiras.

2.4.2 Mantenha sua semente segura


Seus fundos estão tão seguros quanto sua semente e existem dois tipos de
problemas para se atentar: perda acidental ou perda por roubo.

Para evitar a perda acidental, sempre tenha certeza que sua semente está
guardada em um local seguro. Pergunte a si mesmo: “Se meu celular ou esse
site parar de funcionar, eu tenho outra forma de acessar meus fundos?” Você
deve considerar manter uma segunda cópia escrita da sua semente em um
segundo local seguro. Você não vai querer perder seu dispositivo e o backup
da sua semente ao mesmo tempo caso sua casa seja afetada por uma
enchente ou por um incêndio.

Para evitar a perda por roubo, nunca compartilhe sua semente ou chaves com
ninguém. Qualquer pessoa com acesso a sua semente poderá roubar 100%
dos seus fundos e as características de privacidade do Monero garantirão que
seja impossível para você determinar para onde eles foram enviados.

2.4.3 Precauções com transações


Quando for enviar uma transação de grande valor a uma nova pessoa ou
corretora, você deveria sempre testar o endereço ou serviço enviando uma
quantia menor antes. Quando for enviar uma transação de grande valor a
uma nova pessoa ou endereço, você deveria sempre enviar uma pequena
transação de teste e esperar pela confirmação do destinatário, atestando que a
quantia chegou. Este é um hábito importante que pode ajudar a descobrir
erros com antecedência, uma vez que não existe “Ctrl + Z” ou botão de
“desfazer” em criptomoedas.

Em cada transação usando criptomoedas, sempre verifique mais de uma vez


o endereço da carteira para certificar-se que está correto. Mesmo se você
copiar e colar o endereço, confirme visualmente que você colou o endereço
corretamente e que ele está completo. Hackers criaram alguns malwares que
manipulam endereços de criptomoedas copiados para a área de transferência
(substituindo-os por endereços dos próprios criminosos). Se você verificar
visualmente o endereço, será capaz de identificar esse malware antes de
enviar uma “doação” ao hacker.

2.4.4 Segurança em relação às corretoras


Corretoras criam carteiras próprias para você e geralmente não
compartilham a semente. Isso é arriscado, já que você não possui uma forma
de recuperar seu dinheiro se a corretora for atacada, desativada ou
simplesmente desaparecer. Existe uma frase famosa “Não possui as chaves?
Não possui os Bitcoins!” referindo-se a carteiras e serviços que detém
controle sobre suas chaves e assim, de seus fundos.

Como mencionado na seção 2.4.2, você deve sempre se perguntar “se este
site desaparecer, eu tenho alguma outra forma de acessar meus fundos?”.
Uma boa dica é só manter seus moneroj em uma correta se você pretende
negociá-los em breve. Caso contrário, mova-os para uma carteira que você
controle.

2.5 “Primeiros passos” para negócios


2.5.1 Monero é ideal para comerciantes
Neste capítulo, abordamos até agora todas as habilidades principais para usar
Monero de uma forma geral. Esta seção que se inicia apresenta algumas
ferramentas extras que ajudam comerciantes a integrarem o Monero em seus
sistemas e serviços. Você pode pular esta próxima seção se não estiver
envolvido com recebimento de pagamentos em negócios.

Comerciantes aceitando pagamentos em Monero beneficiam-se de


transações rápidas, privadas e irreversíveis. Existem muitas ferramentas
projetadas para garantir que o recebimento de Monero seja uma experiência
intuitiva tanto para negócios online quanto para estabelecimentos
tradicionais.

E é claro, qualquer um pode usar as habilidades desenvolvidas no último


capítulo para configurar uma carteira e começar a receber Monero
imediatamente. As ferramentas mencionadas nesta seção, porém, foram
desenvolvidas para facilitar o uso por negócios que desejam automatizar a
integração e o processamento de pagamentos, com emissão de faturas e
recibos, por exemplo.

2.5.2 Ferramentas intuitivas para aceitar Monero


Os gateways de pagamentos do projeto Integrações Monero permitem a
qualquer loja online adicionar uma opção para pagamento em Monero ao
instalar qualquer uma das extensões desenvolvidas para os sistemas de
gerenciamento de conteúdo mais populares. A solução Integrações Monero
foi criada (pelo autor deste livro) para ser condizente com a mentalidade do
Monero: o projeto inteiro é gratuito, de código aberto, descentralizado e
privado. As transações são encaminhadas diretamente para sua carteira, não
existindo assim nenhuma das concessões em privacidade ou segurança que
surgem ao confiar em um terceiro para processar pagamentos.

Kasisto foi o primeiro sistema ponto de vendas a aceitar Monero e é também


um projeto de código aberto que não requer terceiros. O aplicativo destina-se
ao uso em um celular ou tablet dentro da loja e aceita pagamentos de forma
praticamente instantânea ao detectar transações antes mesmo delas serem
mineradas. É possível testar esse sistema usando a demonstração disponível
no GitHub do Kasisto.

Outra opção de pagamento é a GloBee, que permite aos comerciantes aceitar


pagamentos em criptomoedas e cartão de crédito. GloBee é uma empresa
terceira, o que permite a eles oferecem funcionalidades adicionais – por
exemplo, aceitar vários outros tipos de criptomoedas com conversão
instantânea para Monero, para outras criptomoedas e até para conta correntes
(por exemplo, euros ou dólares). Dando assim aos negócios a opção de
aceitar criptomoedas e ser pago em sua moeda local imediatamente,
eliminando assim exposição ao risco da volatilidade de preços.

Se desejar imergir em programação e construir sua própria opção de


pagamentos do zero, você poderá aprender tudo sobre criar o backend no
Capítulo 7.
Capítulo 3
Como o Monero funciona
Os primeiros dois capítulos abordaram tudo que você precisa saber sobre
POR QUE usar Monero (Capítulo 1) e COMO usar Monero (Capítulo 2).
Até agora, você já aprendeu tudo que era necessário para começar a usar
Monero sozinho!

O restante deste livro contém detalhes extras para aqueles que desejam
imergir em como o Monero funciona “por trás das cortinas”. Os capítulos 3 e
4 descrevem as tecnologias por trás do Monero, como suas características de
privacidade, a blockchain e o processo de mineração – focando no
entendimento dos conceitos, sem seguir para a matemática avançada. Os
capítulos seguintes contém todos os detalhes minuciosos para
desenvolvedores e nerds apaixonados por criptografia.

3.1 Transação e o Registro


Para construir as bases necessárias para entender as tecnologias de
privacidade do Monero, iremos considerar como moneroj são enviados e
recebidos no registro da blockchain. Neste capítulo, focaremos na
funcionalidade da blockchain – seu papel como um banco de dados
compartilhado e à prova de adulteração que mantém uma lista das transações
Monero. Os detalhes sobre segurança da blockchain (mineração, hashes,
etc.) são outro tópico, reservados para o Capítulo 4.

Quando você cria uma carteira pela primeira vez, ela gera uma nova semente
que você manterá em segredo e usará para acessar seus moneroj na
blockchain. Esse processo de inicialização é feito por seu dispositivo e pode
ser executado completamente offline; nada é enviado ou armazenado na rede
durante a geração da carteira.

Nos bastidores, sua carteira calcula dois conjuntos de chaves a partir da sua
semente. Suas chaves privadas são cuidadosamente mantidas em segredo,
uma vez que você as usa para provar sua identidade e acessar seus moneroj.
Suas chaves públicas podem ser, assim como sugere o nome, tornadas
públicas aos demais usuários Monero. Chaves públicas e privadas são
geradas em conjunto, usando propriedades matemáticas específicas que
criam uma relação especial entre as chaves.

Para receber moneroj, você fornece seu endereço (criado a partir de suas
chaves públicas) ao remetente. Quando alguém (um cliente, corretora ou um
amigo) envia Monero a você, eles irão transmitir uma transação que
transfere alguns moneroj que eles possuem a uma nova entrada no registro
que você (e somente você) poderá desbloquear com suas chaves privadas.

Usando uma linguagem técnica, a saída da transação deles é armazenada na


blockchain para que você acesse-a e gaste-a com suas chaves privadas,
quando bem entender. Essa terminologia pode parecer um pouco confusa já
que o uso da palavra “saída” em criptomoedas tem um significado diferente
da sua definição habitual.

Toda vez que você recebe moneroj, você ganha uma nova saída; toda vez
que você gasta moneroj, você usa uma de suas saídas e gera uma nova para
alguém. Na verdade, todos os moneroj que você “possui” são simplesmente
saídas na blockchain que você desbloqueia usando suas chaves privadas.

Quando sua carteira está escaneando ou sincronizando, isso geralmente


significa que ela está usando suas chaves privadas para verificar todas as
transações e saídas na blockchain para identificar registros relevantes. O
saldo da sua carteira representa a soma de todas as saídas que suas chaves
privadas conseguem desbloquear e gastar.

Quando você envia moneroj da sua carteira, você usa umas de suas saídas
como entradas para uma transação que você transmite à rede.
Conceitualmente, a blockchain é simplesmente um registro dessas
transações, cada uma consumindo a saída do remetente em forma de
entradas, para gerar uma nova saída para o destinatário.

O processo descrito acima foi ligeiramente simplificado para representar as


partes mais cruciais (chaves públicas e privadas, transações, e entradas e
saídas). As seções a seguir fornecem explicações não-técnicas dos conceitos
principais por trás do conjunto de características de privacidade do Monero.
3.2 Panorama das tecnologias de
privacidade
Os princípios gerais e terminologias introduzidos acima são compartilhados
pela maioria das criptomoedas. O Monero oferece funcionalidades e
privacidade aperfeiçoadas através de técnicas criptográficas únicas que
protegem os usuários e suas atividades de serem vistas publicamente.

A Figura 3.1 mostra como estas características complementares trabalham


juntas para proteger detalhes sensíveis das transações:

RingCT oculta o valor da transação.


Assinaturas em anel protegem o remetente ao ofuscar qual saída foi
gasta.
Endereços sigilosos garantem que o endereço do destinatário não seja
armazenado na blockchain.
Kovri rompe o elo entre suas transações e sua localização física ao
ofuscar a origem da transmissão e ocultar sinais de atividade Monero na
rede.
3.2.1 Transações confidenciais em anel (RingCT)
RingCT é uma tecnologia criptográfica que oculta a quantidade de moneroj
que está sendo gasta em uma transação. Na maioria das criptomoedas, o
valor das transações é enviado em texto simples, ou seja, visível a qualquer
observador. A RingCT mantém essa informação confidencial ao permitir que
o remetente prove que ele possui moneroj suficientes para uma transação,
sem revelar o valor ou a quantidade! Isso é possível graças a
comprometimentos e provas de intervalo.

Quando você envia moneroj, você se “compromete” de forma privada a


enviar determinado valor, revelando o mínimo de informação necessária
para a rede confirmar a legitimidade da transação, sem divulgar
publicamente o valor em si. Um comprometimento válido garante que a
transação não esteja criando moneroj de forma fraudulenta ou gastando
moneroj em excesso.

Prova de intervalo é outro mecanismo importante em RingCT, como um


método para garantir que a quantidade que foi firmada no compromisso é
maior que zero e menor que determinado número. Isso é necessário para
impedir que remetentes comprometam-se a enviar quantidades negativas ou
absurdamente grandes de moneroj. Juntos, comprometimentos e provas de
intervalo protegem a oferta de moneroj contra manipulação fraudulenta e
tentativas de falsificação.

Anteriormente à RingCT, as transações Monero eram divididas em


denominações específicas (por exemplo, 12,5 XMR seriam enviados na
forma de 10 XMR + 2 XMR + 0,5 XMR) e os valores das transações eram
visíveis a observadores externos. A RingCT foi ativada em Janeiro de 2017 e
imediatamente atingiu adoção em massa. Dentro de um mês após sua
ativação, aproximadamente 98% das novas transações já estavam
voluntariamente usando o protocolo RingCT!

Para manter a política do Monero de impor privacidade por padrão, a


RingCT tornou-se obrigatória para todas as transações Monero a partir de
Setembro de 2017. Para gastar saídas pré-RingCT, elas precisam primeiro
ser convertidas em saídas RingCT com quantidades ocultas.
3.2.2 Endereços sigilosos (de uso único)
Todas transações Monero utilizam endereços sigilosos para proteger a
privacidade do destinatário. Para evitar o armazenamento do endereço da
carteira do destinatário na blockchain, cada transação Monero é enviada a
um endereço de uso único descartável e exclusivo. O destinatário pode
acessar os fundos enviados a um endereço sigiloso sem expor qualquer
conexão com seus endereços públicos ou outras transações.
Para contextualizar sobre a utilização de códigos de uso único aleatórios
para proteger a identidade de um destinatário, imagine que seu amigo André
esteja enfrentando uma doença crônica e você deseja presenteá-lo com
alguns livros raros que você tem sobre como lidar com a doença.
Infelizmente você está saindo de férias para viajar e André, que não está em
casa, só retornará dentro de duas semanas. Talvez você possa pedir a um
vizinho que fique com os livros temporariamente e depois repasse-os ao
destinatário.

Seu vizinho precisará verificar que qualquer pessoa tentando pegar os livros
realmente seja o destinatário correto. E uma vez que seu amigo é uma pessoa
reservada, você deseja preservar sua identidade. Seria inapropriado pedir a
seu vizinho que verifique o RG de André e confirme seu nome. Como você
poderia providenciar a entrega dos livros e ao mesmo tempo preservar a
privacidade de André? Basta que você invente um código aleatório de uso
único e diga a seu vizinho que a pessoa que apresentar esse código poderá
levar os livros (por exemplo: dê esses livros à pessoa que saiba a frase
“PolarComboTango357”). Seu vizinho será capaz de repassar os livros a
André sem ter que saber nenhuma informação extra sobre o destinatário.

Similar à forma como você pode usar um código aleatório para garantir que
seu vizinho não saiba nada sobre quem receberá os livros, o Monero utiliza
um sistema de códigos de uso único para impedir que a rede saiba sobre os
destinatários de Monero! Ao invés de explicitamente armazenar o endereço
do destinatário na blockchain (equivalente à “dê esses livros a André”), os
fundos sempre serão enviados a um “endereço sigiloso” de uso único
(equivalente à “dê esses livros à pessoa que saiba o código
‘PolarComboTango357’”). As técnicas criptográficas que asseguram
endereços sigilosos aos destinatários são discutidas no Capítulo 5, porém
seus pontos importantes estão detalhados abaixo.

Como estes endereços de uso único são gerados? O endereço público da sua
carteira Monero contém 95 caracteres e incorpora duas chaves públicas
(chave pública de visualização e chave pública de gasto) que são
matematicamente derivadas da sua semente. Quando alguém lhe envia
fundos, eles irão utilizar as chaves públicas do seu endereço juntamente com
alguns dados aleatórios para gerar uma chave pública de uso único e
exclusiva. Essas chaves públicas de uso único que são armazenadas em
transações na blockchain são chamadas de endereços sigilosos porque é
impossível para a rede ou para um observador externo conectar estes códigos
aleatórios com a carteira que os originou.
Note que subendereços não são a mesma coisa que endereços sigilosos.
Subendereços são endereços públicos reutilizáveis da sua carteira e estes não
são armazenados na blockchain. Mesmo múltiplas transações enviadas a um
único subendereço irão apontar para endereços sigilosos diferentes e não
vinculados.

O aumento da privacidade ao não se armazenar endereços na blockchain é


um claro benefício trazido pela implementação de endereços sigilosos. Uma
consequência ainda maior é que a utilização dessas chaves de uso único
exclusivas evitam que múltiplos pagamentos enviados ao mesmo endereço
sejam associados entre si!

Suponha que você exponha sua arte em um local público e adicione um


endereço para receber doações em criptomoedas. Se você usar uma moeda
com blockchain transparente (por exemplo, Bitcoin), cada transação recebida
naquele endereço será permanentemente armazenada de forma associável e
pesquisável. Qualquer um poderá usar um explorador de blockchain para ver
quantas doações em Bitcoin você recebeu, os valores e se você movimentou
ou não esses fundos. Cada transação Bitcoin recebida é indexada no registro
usando o endereço que você compartilhou publicamente.

Se você, em contrapartida, utilizar um endereço Monero, as doações


recebidas não serão expostas à opinião pública. Cada doador irá gerar um
endereço de uso único exclusivo e o armazenará no registro da blockchain.
O endereço público que você colocou junto ao seu projeto para receber
doações nunca será referenciado diretamente em uma transação, e os
endereços sigilosos não fornecem nenhuma informação sobre o destinatário.
Uma vez que cada doador mistura suas próprias informações aleatórias para
criar um endereço sigiloso ao enviar transações, um doador não será capaz
de reconhecer um endereço sigiloso que tenha sido gerado por outro doador.

3.2.3 Assinaturas em anel


Assinaturas em anel são uma característica do Monero projetada para
proteger o remetente da transação ao ofuscar a origem dos moneroj que estão
sendo enviados. Antes de começar a tratar das assinaturas em anel em si,
discutiremos o conceito geral sobre assinaturas digitais.
Assinatura digital é um método criptográfico usado para confirmar a
autenticidade e a origem de dados ou de uma mensagem. As assinaturas
podem ser verificadas contra uma chave pública para confirmar a identidade
do signatário e verificar se a mensagem está completa e sem modificações.
Se a mensagem assinada for modificada, mesmo somente um caractere
(intencionalmente ou por alguma falha acidental na comunicação), a
assinatura será considerada inválida.

Diferentes implementações de assinaturas digitais são um dos componentes


principais de todas criptomoedas. Para gastar uma de suas saídas, você cria
uma mensagem descrevendo a transação para a rede, assina-a com sua chave
privada correspondente e depois transmite o resultado à rede. Antes de
executar a transação de fato, a rede verifica a validade da assinatura para
certificar-se que a mensagem não foi alterada, ou forjada, por um terceiro
que não possui a chave privada correta.

Em criptomoedas transparentes (por exemplo, Bitcoin) cada mensagem


descrevendo a transação declara explicitamente quais saídas estão sendo
gastas. Isso é útil pois torna fácil o controle, uma vez que a rede
simplesmente mantém um registro de saídas de transações não gastas
(UTXOs) que serão consideradas como entradas válidas em novas
transações. Se alguém tentar gastar a mesma saída Bitcoin duas vezes, a
segunda transação fraudulenta será prontamente rejeitada, já que a rede sabe
que aquela saída já foi gasta por seu dono (quando ele assinou e transmitiu a
primeira transação). Infelizmente, essa prova de titularidade direta é
altamente prejudicial para a privacidade, ao indicar de forma definitiva a
origem dos fundos e também quando determinada saída foi gasta.

O Monero utiliza uma construção diferente, conhecida como assinaturas em


anel. Esse método de assinatura em grupo permite que um membro assine
digitalmente a mensagem em nome do grupo, misturando as chaves públicas
de todos os membros, tornando assim incerto qual deles efetivamente
assinou a mensagem. É possível verificar criptograficamente que um dos
membros do anel assinou a mensagem, mas é impossível determinar qual
deles realmente construiu a assinatura.

Assinaturas em anel são usadas no Monero para combinar chaves de


múltiplas saídas na blockchain, ofuscando assim quais saídas realmente
estão sendo gastas. Suponha que Maria quer gastar uma de suas saídas
Monero. Sua carteira irá selecionar de forma semi aleatória várias outras
saídas antigas na blockchain (que não pertencem a Maria) e misturar chaves
públicas à assinatura em anel como chamarizes. A rede é capaz de verificar
que uma das saídas está sendo gasta, porém os chamarizes e quem realmente
está gastando são criptograficamente indistinguíveis.

As assinaturas em anel protegem o remetente em todas as transações, uma


vez que o destinatário e a rede Monero não conseguem determinar qual
membro do anel é o verdadeiro dono dos fundos. Um importante resultado
do uso das assinaturas em anel é que um observador externo não é capaz de
provar que uma saída foi gasta! O fato de uma saída aparecer em uma
assinatura em anel é totalmente inconclusivo, já que é impossível distinguir
se ela está realmente sendo gasta ou simplesmente atuando de forma passiva
como membro chamariz do anel.

Visto que é impossível dizer se uma saída em particular já foi gasta, você
pode estar se perguntando o que impede um usuário desonesto de tentar
gastar uma mesma saída duas vezes? Em blockchains transparentes com
“uma saída, um gasto” (por exemplo, Bitcoin) isso é uma tarefa fácil:
qualquer saída que tenha sido assinada criptograficamente e transferida uma
vez é marcada como gasta e não pode ser usada novamente. As saídas
Monero, entretanto, podem aparecer nas assinaturas em anel antes e depois
que elas tenham sido gastas de verdade, assim, a reutilização de saídas deve
ser prevenida de outra forma.

Isto é feito utilizando imagens-chave que são geradas e armazenadas com


cada transação, unicamente derivadas a partir da verdadeira saída sendo
gasta. A rede não pode determinar qual membro do anel está relacionado à
imagem-chave; porém, outros participantes só precisam verificar se aquela
imagem-chave já foi utilizada alguma outra vez ou não. Se um usuário mal-
intencionado tentar gastar a mesma saída duas vezes, ele gerará a mesma
imagem-chave duas vezes e a rede imediatamente rejeitará a segunda
transação fraudulenta. Graças às imagens-chave, a rede consegue prevenir a
reutilização de uma saída mesmo sem saber quais saídas estão gastas!
Originalmente a rede Monero não obrigava a utilização de assinaturas em
anel, o que infelizmente permitia a criação de transações com “zero-
mistura”, prejudiciais à privacidade. Essas transações antigas possuiam a
mesma estrutura e pontos negativos das blockchains transparentes, ao
invariavelmente identificar tanto o remetente quanto o destinatário,
juntamente com a revelação de quando a saída foi gasta. A partir de 2016, a
rede começou a requerer dois membros no anel para cada assinatura,
obrigando privacidade por padrão para o remetente. Esse número mínimo do
tamanho do anel foi aumentado para cinco possíveis signatários no final de
2017 e depois novamente aumentado para sete no início de 2018.

Perceba que entre 2016 e 2018, as regras para tamanho do anel foram
postuladas na forma de um valor mínimo, e era permitido aos usuários criar
transações com anéis maiores caso desejassem. Em teoria, pode-se pensar
que usar mais chamarizes em uma transação garante uma maior privacidade.
Porém, existe um problema prático que deve ser considerado – quando a
maioria esmagadora das transações utilizam o tamanho de anel mínimo,
tamanhos maiores e customizados destacam-se como atípicos, o que é
prejudicial para a privacidade.

Esse problema foi resolvido na atualização da rede realizada no final de


2018; ao invés de especificar um tamanho mínimo de anel, as regras da rede
passaram a requerer um tamanho de anel fixo. No momento em que este
texto foi escrito, todas transações devem utilizar assinaturas em anel com
exatamente onze membros. Esse número poderá aumentar no futuro, a
medida que os estudos estatísticos sobre modelos contra ameaças e melhores
práticas de privacidade forem evoluindo.

3.2.4 Kovri e análise de tráfego


Todo dispositivo conectado à internet recebe um endereço IP para ser
identificado e para ajudar a encaminhar o tráfego para o usuário correto.
Esse endereço IP, todavia, pode facilmente ser associado à localização e à
identidade de um usuário.

A habilidade de associar transações e atividade Monero com endereços IP


representa inúmeras desvantagens importantes. Algumas das medidas
criptográficas para proteger os usuários do Monero descritas na seção
anterior podem ser parcialmente contornadas se os endereços IP que se
conectam a um nó forem analisados com o objetivo de se identificar usuários
Monero.

Vale considerar os cenários indesejados que podem surgir quando a atividade


na rede Monero é associada com localização física e identidades.

Dado que transmitir para a rede Monero revela um endereço IP, um nó


recebendo uma transação pode ser capaz de identificar a localização física
do remetente. Embora outras características de privacidade do Monero
dificultem a associação de transações usando somente informações da
blockchain, nós que monitoram transações podem inferir que múltiplas
transações originadas do mesmo endereço IP estejam associadas entre si.

Além dessas preocupações com privacidade, endereços IP expostos podem


levar à uma potencial censura. Um nó mal-intencionado pode optar por não
retransmitir transações de certas pessoas ou grupos. Pior ainda, as
informações geográficas reveladas por endereços IP podem levar pessoas
mal-intencionadas a “darem uma passada” na casa de usuários de
criptomoedas.

A associação entre endereços IP e atividade Monero não é uma ameaça


somente para os usuários transmitindo transações. Atualmente, o tráfego da
rede através de nós é visível para provedores de internet e outras entidades, o
que poderia colocar donos de nós em risco caso seus governos ou provedores
de internet decidissem responder negativamente ao movimento das
criptomoedas.

Mineradores de criptomoedas também podem estar sujeitos a um tratamento


injusto caso seus endereços IP sejam associados com sua atividade na rede
Monero. Entidades mal-intencionadas podem querer atacar determinados
mineradores, censurando seus blocos por conta de alguma discordância
ideológica ou para restringir a mineração às empresas privadas e entidades
governamentais.

Claramente, todas as partes envolvidas no ecossistema do Monero


beneficiam-se da separação entre sua atividade na rede e seus endereços IP
(e assim sua localização e identidade). Atualmente, existem muitas formas
de atingir este tipo de privacidade caso você esteja em uma situação em que
precise ocultar o uso do Monero em uma conexão monitorada.

Uma opção é usar uma rede privada virtual (VPN, na sigla em inglês) para
enviar seu tráfego através de uma conexão criptografada em que nem seu
provedor de internet e nem o governo podem monitorar. Essa rede VPN
funciona estabelecendo um túnel seguro entre você e os servidores VPN, de
forma que seu tráfego seja misturado com dados de outros usuários e
retransmitido a partir de um endereço IP diferente. Note que o provedor da
VPN pode registrar o tráfego se desejar, então informe-se bem antes de
contratá-lo e use sempre uma empresa confiável.

Outra opção é usar a rede “Tor” (The Onion Router, em inglês) para
direcionar seu tráfego através de uma rede privada de nós de retransmissão.
O Tor foi originalmente desenvolvido pelo Laboratório de Pesquisa Naval
dos Estados Unidos (United States Naval Research Laboratory, em inglês), e
é usado por jornalistas, agências de inteligência e todos aqueles que
precisam adotar medidas extras para evitar o monitoramento e a censura. Tor
é uma rede privada gratuita, descentralizada e de código aberto projetada
para que nenhum participante possa identificar a origem de nenhuma
transmissão em particular. O Tor pode ser acessado através de navegadores
dedicados e usuários com elevada necessidade de privacidade podem usar
ainda uma distribuição Linux, como a Whonix, que direciona todo o tráfego
através do Tor automaticamente.

A comunidade Monero também tem apoiado o desenvolvimento do Kovri,


uma abordagem de privacidade baseada nas especificações descentralizadas
do Projeto de Internet Invisível (Invisible Internet Project ou I2P, em inglês).
Kovri está sendo projetado para usar encriptação e técnicas sofisticadas de
redirecionamento para criar uma rede privada e distribuída através da
internet, e também disponível para outras aplicações.

Até que o Kovri ou uma característica similar esteja diretamente integrada


ao Monero, qualquer usuário com receios sobre análise de tráfego de internet
são incentivados a usar o Tor ou um provedor confiável de VPN para manter
sua conexão e endereço IP ocultos.
3.3 Comentários finais
O Monero utiliza muitas técnicas especiais de privacidade para proteger
vários elementos da rede e todas as partes, em todas as transações. A
RingCT oculta a quantidade enviada em cada transação. As assinaturas em
anel protegem o remetente ao ocultar a origem dos fundos, enquanto que os
endereços sigilosos garantem que o endereço do destinatário não seja
armazenado na blockchain. O Kovri é uma tecnologia de redirecionamento
que virá para quebrar o elo entre sua atividade Monero e sua localização
física e identidade.

Todas essas características juntas garantem que os usuários do Monero


permaneçam anônimos e que seus fundos não sejam rastreáveis. Ao eliminar
criptograficamente todos os elos usados para analisar transações na
blockchain, o Monero conquista a fungibilidade, que é uma característica
necessária à uma moeda viável. Agora que concluiu a leitura deste capítulo,
você aprendeu como o Monero protege as pessoas descritas nos exemplos de
“aplicação na vida real” do Capítulo 1.
Capítulo 4
A Rede Monero
Neste capítulo, você aprenderá os principais conceitos por trás da tecnologia
blockchain e como os mineradores Monero mantém o registro seguro.
Começaremos explicando a estrutura dos blocos, a forma como eles são
associados em uma cadeia à prova de alteração e como os mineradores
utilizam prova de trabalho para formar um consenso e concordar sobre a
versão do registro. No tópico sobre mineradores, discutiremos a origem de
novos moneroj e como essas novas moedas entram no ecossistema. Próximo
ao final do capítulo, teremos um primeiro contato com alguns conceitos
criptográficos (hashes e nonces) para realmente entender o processo de
mineração.

4.1 Anatomia simplificada de um bloco


O capítulo anterior discutiu como transações são construídas. Em resumo,
sua carteira cria uma mensagem com instruções para transferir uma de suas
saídas para um novo destinatário. As informações sensíveis da mensagem
(remetente, destinatário e valor) são ocultadas criptograficamente antes da
sua carteira autorizar a mensagem, assinando-a digitalmente com sua chave
privada.

Neste capítulo, você aprenderá como a mensagem da transação é processada


para realizar a transação de fato. Quando sua carteira transmite essa
mensagem, a rede armazena temporariamente a solicitação em uma lista de
transações pendentes, conhecida como memory pool. Os mineradores do
Monero recolhem então essas transações não-confirmadas da memory pool e
agrupam-as em blocos. Um bloco simplificado é mostrado abaixo:
Figura 4.1 – Cada bloco de transações sequencialmente enumerado
deve incluir tanto um nonce quanto uma referência ao hash do bloco
anterior.

Cada bloco contém um conjunto de transações, uma associação criptográfica


com o bloco anterior (chamado hash) e um local para os mineradores
incluírem um número especial que completa o bloco (chamado nonce).

Se quiser aprender como hashes e nonces funcionam, próximo ao final deste


capítulo você encontrará uma introdução intuitiva com exemplos (se estiver
curioso sobre a criptografia e quiser ler agora, fique a vontade para pular
para a última seção do Capítulo 4). Existem basicamente dois conceitos que
você precisa conhecer para entender como essas técnicas funcionam para
manter a blockchain segura:

1. O hash é um mecanismo de segurança que prova que cada bloco está


diretamente associado à uma versão inalterada do bloco anterior. Se um
adversário tentar alterar qualquer ponto do registro, mesmo a menor
tentativa de modificação será descaradamente óbvia, pois os hashes
emitirão uma espécie de sinal de alerta em cada bloco subsequente.

2. O nonce é um sequência alfanumérica especial que completa o bloco e


marca-o como pronto para entrar na blockchain. É computacionalmente
muito difícil encontrar um nonce que satisfaça os requisitos necessários
para finalizar e lacrar um bloco. Os mineradores gastam a maior parte
do seu tempo e energia procurando por nonces válidos. É impossível
planejar com antecedência o cálculo de um nonce, assim a procura
precisa recomeçar do zero para cada bloco novo. Os nonces não têm
nenhum significado matemático; são apenas uma sequência única de
caracteres aleatórios.

4.2 Os nós são a base da rede


4.2.1 Nós retransmitem dados da rede aos pares
Até agora, referências feitas à “rede Monero” não descreveram os detalhes
da sua composição. Como suas transações são realmente propagadas a
mineradores e demais usuários através dessa “rede” nebulosa? Milhares de
nós Monero espalhados por todo o planeta estão conectados uns aos outros,
compartilhando rapidamente notícias sobre transações e blocos.

Esses nós formam uma rede ponto-a-ponto, permitindo aos usuários Monero
uma forma de comunicação resiliente e eficiente. Executar um nó não requer
nenhum conhecimento ou equipamento especial – se você baixar e instalar o
software do Monero agora, você poderá ter seu nó rodando antes mesmo de
terminar este capítulo!
Figura 4.2 – O Monero utiliza uma rede ponto-a-ponto distribuída,
formada por uma rede de dispositivos voluntários compartilhando
novos dados uns com os outros. Os nós mantém uma cópia completa da
blockchain e formam a base da rede. Dado que executar um nó requer
uma quantidade significativa de espaço em disco, alguns dispositivos
(especialmente carteiras para dispositivos móveis) conectam-se a um nó
remoto para requisitar informação e transmitir transações.

Não existem “nós especiais” ou “super nós” na rede ponto-a-ponto do


Monero; todos os nós (incluindo o seu) participam igualmente no
compartilhamento de recursos e volume de trabalho. Os nós são hospedados
em computadores de todos os tipos e tamanhos – notebooks, desktops,
servidores e até máquinas virtuais.

4.2.2 Nós armazenam a blockchain


Quando um nó é inicializado, primeiro ele deve baixar a blockchain inteira e
verificar as associações criptográficas, como os hashes e nonces. Essa
sincronização inicial pode levar algumas horas, conforme o nó constrói sua
cópia local da blockchain, confirmando a validade de cada transação e de
cada bloco. Ao invés de baixar a blockchain usando uma única conexão com
um servidor central, cada nó recebe transmissões de vários pares de nós. Os
nós não precisam identificar ou confiar em seus pares, uma vez que a
validade dos dados é confirmada criptograficamente.

Qualquer software de carteira Monero (por exemplo, a Monero GUI, um


aplicativo no celular, etc.) precisa ter acesso a uma cópia da blockchain para
desempenhar as tarefas de recuperar o histórico de transações, calcular
saldos em conta e criar transações. Uma carteira não pode criar transações
antes de se comunicar com um nó sincronizado, já que o software precisa
encontrar e registrar todas as saídas não gastas pertinentes. Porém, seu
endereço pode receber moneroj estando sua carteira conectada ou não a um
nó sincronizado (a transação simplesmente não aparecerá no seu saldo até
que a carteira baixe e verifique aquele bloco).

4.2.3 “Nós locais” versus “nós remotos”


O processo de armazenar e verificar localmente a blockchain inteira, de
forma que sua carteira possa interagir com sua própria cópia do registro, é
chamado de executar um nó local. Quando você utiliza este tipo de
configuração, sua carteira só irá interagir com sua cópia pessoal da
blockchain. Executar um nó local requer uma quantidade considerável de
espaço em disco (aprox. 70 GB no momento em que escrevo), o que não é
viável em todos os dispositivos, como celulares, por exemplo.

Felizmente, carteiras de software podem ser configuradas para usar um nó


remoto ao invés do seu próprio nó local. Isso significa que sua carteira se
conectará ao nó de outra pessoa e simplesmente requisitará informações
sobre suas saídas. A maioria das carteira Monero para dispositivos móveis
utilizam nós remotos por padrão, com o objetivo de manter o app leve. As
carteiras Monero GUI e CLI podem ser configuradas para usar tanto um nó
local quanto um nó remoto.

Não existe nenhum risco de segurança ao usar um nó remoto; sua semente e


suas chaves nunca serão reveladas, então o operador do nó remoto não será
capaz de controlar seus fundos ou descriptografar qualquer informação que
esteja protegida pelas características de privacidade do Monero, como
RingCT (ocultando o valor da transação) ou endereços sigilosos (ofuscando
o endereço do destinatário).

Existem pequenas concessões em privacidade que surgem ao se usar nós


remotos, já que o operador do nó saberá os horários e os endereços IP usados
pelo seu dispositivo para transmitir transações ou realizar atualizações.

4.3 Mineradores criam novos blocos


4.3.1 Mineradores adicionam novos blocos à cadeia mais longa
Os mineradores recolhem transações pendentes da memory pool, verificam
sua autenticidade conferindo se as provas criptográficas e assinaturas são
válidas, e verificam se a imagem-chave já não foi usada anteriormente (veja
a seção “3.2.3 Assinaturas em anel” para relembrar porquê isso é
importante).
Para preparar um bloco, o minerador cria uma lista de transações a serem
incluídas, juntamente com o hash do bloco anterior para fornecer uma
associação criptográfica. Por fim, o minerador trabalha para encontrar um
nonce que possa ser usado para completar o bloco.

A cada instante, existem milhares de mineradores trabalhando


separadamente (ou em grupos, conhecido como pools de mineração) para
encontrar um nonce que complete o bloco atual de transações. Assim que um
minerador ou pool encontra um nonce para finalizar seu bloco, ele anuncia
sua versão para o restante da rede. Ao receber esse bloco completado, os
outros mineradores e nós adicionam-o a sua cópia da blockchain,
aumentando a altura da cadeira em um bloco.

4.3.2 Uma tarefa difícil garante estabilidade e imparcialidade


Pela natureza globalizada do ecossistema Monero e por atrasos imprevisíveis
nas transmissões ponto-a-ponto por conta da latência da rede, se dois
mineradores completarem duas versões diferentes e independentes de um
mesmo bloco na mesma altura, eles podem, ocasionalmente, causar
separações momentâneas na blockchain. Suponha que um minerador na
América do Sul seja o primeiro a completar um bloco, mas um outro
minerador na Europa finaliza sua própria cópia antes de receber a
transmissão vinda da América do Sul. Neste exemplo, o hemisfério sul pode
estar temporariamente usando uma cópia diferente da blockchain do que o
hemisfério norte. Por um breve momento, existem dois registros
concorrentes da blockchain do Monero que possivelmente possuem
pequenas diferenças entre si (dependendo de quais transações pendentes
cada minerador selecionou na memory pool). Alguém pode pensar que isso
seria um acontecimento catastrófico!
Figura 4.3 – Mineradores competem para aumentar a cadeia com um
novo bloco. (Acima) A blockchain está na altura “3”, então cada
minerador trabalha em sua própria versão do bloco “4”. (Abaixo) O
bloco “4” foi completado primeiro pelo minerador do meio, então sua
versão é adicionada à blockchain compartilhada, e todos os mineradores
passam a procurar um nonce para o bloco “5”.

Pelo contrário, essa situação é facilmente resolvida ao elegantemente impor


uma regra simples: todos os mineradores concordam em minerar o próximo
bloco na cadeia mais longa. Esta é uma peça fundamental do protocolo de
consenso descentralizado do Monero e permite que a rede Monero
rapidamente se una em uma única cadeia após uma separação acidental. Ao
invés de tentar resolver a discrepância entre os blocos imediatamente, os
mineradores simplesmente continuam trabalhando para completar o próximo
bloco na versão deles.

Dentro dos próximos minutos, um dos mineradores resolverá um bloco


subsequente e o adicionará à sua cadeia. Assim que isso aconteçe, sua versão
da cadeia torna-se a mais longa, fazendo com que os demais mineradores e
nós rapidamente adotem aquela cópia e descartem o bloco órfão alternativo.
Qualquer transação que só tenha sido incluída no bloco órfão permanecerá
na memory pool da cadeia principal e será minerada em um bloco
subsequente. Ao simplesmente seguir a cadeia mais longa, criada com o
maior esforço, a rede resolve todas essas separações e retorna ao consenso
sobre um único registro universal.

4.3.3 Os “táxis” do Monero utilizam um desafio difícil para


garantir a imparcialidade
Validar um conjunto de transações e listá-las em um bloco não é
computacionalmente difícil. A tarefa que consome mais tempo do minerador
é encontrar um nonce que permita que o bloco seja completado. Este é um
desafio projetado para ser extremamente difícil e capaz de ser solucionado
somente ao usar força bruta para testar todas as possibilidades; não existem
formas de encurtar o processo ou restringir matematicamente a busca por um
nonce válido. Os mineradores simplesmente escolhem um número aleatório
e testam se ele completa o bloco, um processo puramente de tentativa e erro.
A existência desse obstáculo arbitrário pode parecer peculiar em um
primeiro momento! Os mineradores desempenham um papel crucial e
computacionalmente fácil para a rede (validar transações) mas são obrigados
a realizar uma tarefa inútil e difícil (encontrar um nonce) para submeter seus
resultados.

Para entender o motivo por trás disso, imagine uma Rede de Táxis do
Monero com poucos veículos mas muitos motoristas que podem utilizar
esses carros temporariamente se eles submeterem um trajeto aprovado. Ao
longo do dia, passageiros interessados ligam e solicitam corridas por toda a
cidade. Todas as solicitações dos passageiros que ainda não foram pegas são
listadas em tempo-real em uma “pool” de corridas pendentes.
Figura 4.4 – No primeiro estágio de preparação para montar um plano
de corridas, cada motorista olha para pool de corridas pendentes e faz
um rascunho do trajeto completo.

Ao invés de uma autoridade central de táxis designar cada corrida que chega
à determinado carro ou motorista, cada taxista olha para a pool e monta sua
própria lista com 5 a 10 corridas que ele seria capaz de completar nos
próximos 30 minutos. Essa etapa de planejar o trajeto é fácil e rápida para os
taxistas mais experientes! Assim que um motorista monta a lista de viagens
que consegue incluir no próximo “bloco” de corridas, ele completa uma
última tarefa descrita abaixo, e depois submete seu trajeto para a Rede de
Táxis do Monero.

Se o taxista propôs um trajeto válido usando corridas pendentes reais, seu


plano está aprovado! Assim, as corridas incluídas no plano desse taxista são
removidas da pool de corridas pendentes, ele escolhe um carro e os
passageiros logo são transportados para seus destinos. O motorista recebe de
cada passageiro o valor da corrida realizada e a Rede de Táxis do Monero
paga um bônus em dinheiro ao taxista por ele ter sido o primeiro a submeter
um plano completo.

Até agora, esse processo parece bastante intuitivo! Viagens não realizadas
são listadas na pool; quando um taxista submete com sucesso um bloco de
corridas, os passageiros são transportados até seu destino e removidos da
pool de corridas pendentes.
Figura 4.5 – Após os taxistas terem completado a tarefa (relativamente)
fácil de planejar um trajeto, eles devem resolver um desafio difícil –
nessa analogia, encontrar uma forma de reorganizar as letras dos
endereços para formar uma frase.

Porém, a Rede de Táxis do Monero possui uma regra bem peculiar: para que
um motorista submeta seu plano com um bloco de corridas à rede Monero,
eles devem realizar antes uma tarefa difícil e ao mesmo tempo inútil.
Imagine que o motorista precise pegar as letras de todos os endereços de
destino dos passageiros e usar algumas delas para formar cinco frases em seu
idioma local (com mais de 50 palavras no total) que digam qualquer coisa,
mas que precisam estar gramaticalmente corretas. Um taxista submetendo
um trajeto que tenha planejado precisa incluir tanto a lista de corridas quanto
uma frase sem sentido (“nonce”) que contenha as letras dos destinos, ou seu
trajeto será automaticamente rejeitado. Existem várias frases sem sentido
válidas que podem ser formadas usando a maioria das letras (por exemplo,
{a,e,e,g,i,m,n,r,r,s,t,o,o} pode ser reorganizado para formar “Rims enrage
too!” e “Monero is great!”), e as frases resultantes não têm qualquer
utilidade senão permitir o envio do conjunto de corridas à Rede de Táxis do
Monero.

Uma propriedade desse tipo de tarefa, que terá paralelos com a criptomoeda
Monero, é que é muito difícil encontrar um nonce, mas ao mesmo tempo
muito fácil verificá-lo. Neste exemplo dos táxis, é bastante difícil
reorganizar manualmente uma dúzia de endereços em 50 palavras que
formem uma frase válida. No entanto, é bastante trivial para qualquer um
revisar o resultado do nonce e verificar que ele completa o bloco de corridas.
Quando um taxista submete seu nonce no formato mostrado abaixo, você
rapidamente consegue ver que “Apple jam is very bad” é uma sentença
válida e que as letras dos destinos dos passageiros foram utilizadas de
maneira correta. Essa verificação é praticamente instantânea comparada ao
tempo que os taxistas levam para reorganizar as letras e formar várias frases.
Figura 4.6 – Encontrar uma frase nonce ao reorganizar os endereços é
complicado e requer tempo. Porém, a validade das frases enviadas é
fácil de ser verificada ao rapidamente conferir se elas usam somente
letras dos endereços das corridas incluídas no trajeto.

Um taxista experiente seria capaz de planejar um trajeto a partir da lista de


corridas em menos de 60 segundos, ainda assim, ele provavelmente levaria
uns bons minutos para reorganizar as letras manualmente para encontrar
frases nonces. Na verdade, grande parte do seu esforço para preparar um
bloco de corridas será gasto tentando encontrar esse nonce desnecessário.

Imagine esse processo pela perspectiva do taxista, começando logo depois


que o último bloco foi aprovado. Você rapidamente planeja um trajeto que
inclui várias viagens da lista de corridas pendentes. Em seguida, começa a
trabalhar desenfreadamente para reorganizar as letras dos endereços de
destino para formar alguma frase nonce. Durante alguns minutos, você e os
demais taxistas estão trabalhando na mesma lista de corridas pendentes, cada
um tentando elaborar um nonce longo suficiente, ou seja, com mais de 50
palavras. De repente, outro taxista submete uma lista de corridas juntamente
com um nonce completo. Todas as viagens em que você estava trabalhando
desaparecem da pool! Você precisa jogar todo seu trabalho feito naquele
bloco fora (já que os passageiros já estão em trânsito) e trocar para um novo
conjunto de corridas pendentes. O processo de encontrar um nonce válido
para aquele conjunto de corridas começa novamente do zero, baseado no
conjunto de letras dos novos endereços de destino.

Por que a Rede de Táxis do Monero impõe uma tarefa tão difícil e inútil a
seus taxistas? Na verdade, essa é uma forma infalível de garantir que seus
clientes sejam servidos de forma justa e imparcial! Imagine que alguns
taxistas hajam de forma antiética, talvez ignorando corridas que venham de
algumas regiões da cidade ou só selecionando corridas de passageiros que
estão indo às empresas que tenham pago suborno a eles. Sem a
obrigatoriedade do nonce, esse pequeno grupo de taxistas mal-intencionados
poderia dominar o processo de seleção de corridas da empresa toda ao
constantemente submeter seus trajetos (injustos e excludentes) assim que um
carro fica disponível. Desta forma, eles poderiam sistematicamente tratar
alguns grupos de clientes de forma inferior, o que é absolutamente antiético
de acordo com os princípios da Rede de Táxis do Monero, que se dedica a
servir todos os passageiros com igualdade e imparcialidade.

A competição entre os muitos taxistas para completar a tarefa do nonce é


crucial para o objetivo do Monero de garantir que os carros e as corridas
sejam oferecidos de forma justa. Considerando que todos os taxistas
conseguem reorganizar as letras aproximadamente na mesma velocidade, a
frequência com que cada taxista conseguirá ser o primeiro a encontrar uma
solução e submeter seu bloco de corridas será um tanto quanto aleatória. É
pouco provável que qualquer taxista consiga ser o primeiro a submeter
muitos blocos de corridas em sequência (ou seja, ser o primeiro a encontrar
frases nonce por muitos blocos consecutivos) já que cada taxista está
individualmente competindo contra um grupo grande de outros taxistas.

A maioria dos motoristas serão pessoas honestas, submetendo blocos com


planos de corridas justos para manter a cidade rodando sem problemas. Se
existir um grupo de taxistas mal-intencionados, mesmo em pequeno número,
e eles submeterem planos injustos, a tarefa do nonce impedirá que tal grupo
controle o sistema inteiro. Estatisticamente, eles ocasionalmente serão os
primeiros a encontrar um nonce e assim poderão submeter seus planos com
trajetos excludentes para aquele bloco. Porém, o restante dos taxistas, cuja
maioria é honesta, imediatamente começará a trabalhar em seus bloco justos
para propor o próximo conjunto de corridas! Devido à natureza aleatória de
quem tem a sorte de ser o primeiro a encontrar um nonce, o próximo
conjunto de corridas provavelmente será desempenhado por um taxista
honesto cujo plano acrescentará as corridas excluídas anteriormente. Esse
sistema de impor um trabalho sem utilidade para aleatorizar quais trajetos
dos taxistas são aceitos permite que a Rede de Táxis do Monero certifique-se
que a minoria de taxistas mal-intencionados não consiga impedir um usuário
ou grupo de usuários a solicitar corridas.

Por esse motivo, a Rede de Táxis do Monero não conta com uma autoridade
central que seja responsável por controlar a atribuição e a realização de
corridas. Em vez disso, essa tarefa é distribuída aos taxistas individuais,
empregando a competição do nonce sem utilidade para selecioar
aleatoriamente qual proposta de trajeto é aceita. Isso garante que,
estatisticamente, os carros sejam frequentemente atribuídos aos taxistas
honestos, e por consequência, que a Rede de Táxis do Monero tenha uma
excelente reputação por prover um serviço justo à todos os clientes.

Você provavelmente deva estar de se perguntando como essa longa metáfora


dos táxis está relacionada com a criptomoeda que é amplamente falada neste
livro! Ou talvez já tenha descoberto que a rede descentralizada de Táxis do
Monero é uma óbvia analogia à rede da criptomoeda Monero, que precisa
prover um serviço global e justo sem nenhuma autoridade central.

Cada corrida corresponde a uma transação Monero, pendente na memory


pool até que ela seja selecionada para um lugar no carro/bloco. Os taxistas
representam os mineradores. Ambos desempenhando um trabalho simples e
importante (taxistas planejam trajetos; mineradores coletam e validam
transações), e são igualmente forçados a competir contra outros
taxistas/mineradores em uma tarefa de nonce simples e ao mesmo tempo
inútil. Essa barreira torna aleatório quem terá sucesso primeiro – assim,
distribuindo estatisticamente a maior parte dos carros/blocos para os
taxistas/mineradores honestos. Qualquer taxista que seja o primeiro a
submeter seu trajeto é recompensado com um bônus da Empresa de Táxis
Monero e recebe os valores das corridas pagos pelos passageiros que foram
transportados. Da mesma forma, os mineradores são recompensados com
uma comissão (chamada recompensa do bloco ou coinbase) por
completarem os blocos e também coletam as taxas das transações que foram
incluídas no bloco em questão.

4.3.4 Os mineradores são pagos pelo seu serviço


Toda vez que um minerador minera um bloco com sucesso (ou seja, é o
primeiro a encontrar um nonce que completa o próximo bloco da cadeia
mais longa) ele é pago de duas formas diferentes.

1. Primeiro, o minerador recebe uma recompensa por ter contribuído com


um bloco completo de transações validadas. Essa recompensa do bloco
é análoga ao bônus em dinheiro que os taxistas recebem por terem
submetido trajetos completos. Logo que tenham recebido e confirmado
o bloco solucionado, todos mineradores adicionam essas moedas recém
cunhadas ao endereço do primeiro minerador que encontrou um nonce
válido.

2. Em segundo lugar, o minerador coleta as taxas que foram incluídas com


as transações. Os usuários do Monero podem aumentar as chances de
um minerador incluir suas transações mais rapidamente se optarem por
usar uma taxa maior.

Uma percepção errônea e comum que se tem é pensar que os mineradores


estão “encontrando” ou “criando” moedas. Na verdade, os mineradores estão
simplesmente validando transações e eles são pagos por seu trabalho usando
moedas novas. Essa introdução de novos moneroj é chamada de emissão de
moedas.

Quando o Monero foi lançado, a taxa de emissão de moedas era de mais de


30 XMR a cada 2 minutos. Essa recompensa irá decrescer suavemente até
atingir 0,6 XMR por bloco (2 minutos) em 2022. O decrescimento contínuo
do Monero foi projetado para oferecer um ambiente econômico mais estável
para os mineradores, quando comparado aos eventos dramáticos de halving
das outras criptomoedas, quando a recompensa do bloco é abruptamente
reduzida à metade. Após 2022, a emissão em cauda do Monero permanecerá
constante, garantindo que a mineração de um bloco sempre venha
acompanhada de uma recompensa de 0,6 XMR.

Muitas criptomoedas possuem um limite fixo na emissão de moedas, ou seja,


um limite máximo na oferta. Uma vez que o limite na oferta é atingido,
novas moedas não serão mais dadas aos mineradores, que serão forçados a
subsistir a partir das taxas. Por exemplo, no Bitcoin, essa mudança de
paradigma nos incentivos financeiros acontecerá por volta de 2140, quando a
oferta atingir 21 milhões de Bitcoins e parar de crescer além desse número.
Essa abordagem muitas vezes é tida como benéfica para manter a moeda
“deflacionária”, entretanto, esses argumentos são frequentemente usados
misturando-se o conceito de uma oferta monetária inflacionária com um uso
distorcido da palavra “inflação” para descrever a perda indesejada do poder
de compra de uma moeda.

O crescimento na oferta de Monero a partir da emissão em cauda de 0,6


XMR será menor que 1% ao ano. Embora os desenvolvedores tenham criado
a emissão em cauda para incentivar os mineradores a longo prazo, uma
consequência interessante é que ela é fácil de ser comparada com sistemas
financeiros baseados em ativos e garantias. A taxa de crescimento na oferta
de Monero devido à emissão em cauda é comparável ao crescimento anual
na oferta de ouro, que na era da civilização moderna é, historicamente,
considerado a forma mais pura e estável de dinheiro. Uma vez que os
mineradores sempre serão capazes de coletar taxas, os pagamentos
garantidos através das recompensas do bloco (coinbase) provém elevada
estabilidade financeira para eles no longo prazo. Esse contrato social garante
que os mineradores se mantenham incentivados a usar seus equipamentos
para proteger a rede Monero.
Figura 4.7 – Um minerador recebe dois tipos de pagamento toda vez
que mineram um bloco: 1) as taxas incluídas em cada transação, e 2) a
recompensa do bloco na forma de moneroj recém cunhados.

4.4 Sistemas prova de trabalho


Nos distanciaremos agora da analogia dos táxis e passaremos a discutir os
sistemas empregados para garantir a imparcialidade no Monero. Esse
processo de atrelar funções importantes da rede com a procura por um nonce
sem utilidade é chamado de prova de trabalho (Proof of Work ou PoW, em
inglês). Muitas criptomoedas foram construídas baseadas no consenso de
prova de trabalho, e por isso, existem diferenças entre as várias
implementações e suas características. Porém, essas criptomoedas
compartilham o mesmo conceito: impor descentralização ao requerer que a
validação seja submetida juntamente com um nonce. Ocasionalmente, nos
referimos ao nonce como sendo a “prova de trabalho” em si, no sentido de
referir-se à porção de dados que foi difícil de encontrar e fácil de verificar,
como os anagramas feitos pelos taxistas.

Os mineradores usam a notação “hashes por segundo”, abreviado para H/s,


para medir quão rápido eles conseguem trabalhar na mineração dos blocos.
Qualquer minerador pode medir sua própria taxa de hash (hashrate, em
inglês), que varia dependendo do equipamento que se esteja utilizando para
minerar. A “taxa de hash da rede” refere-se à soma do hashrate de todos os
mineradores que estão trabalhando na preparação dos blocos.

4.4.1 Benefícios
4.4.1.1 Resistência à censura

Nos sistemas prova de trabalho descritos acima, a competição para encontrar


o nonce aleatoriza qual versão dos mineradores é aceita como o último bloco
da cadeia mais longa. Como mencionado na analogia dos táxis, a estrutura
da prova de trabalho efetivamente previne a censura. Alguns mineradores
mal-intencionados da rede Monero podem tentar oferecer um tratamento
preferencial ou ignorar certas transações da memory pool, porém, um
minerador Monero honesto invariavelmente as incluirá no próximo bloco.
4.4.1.2 Prevenção ao ataque de gasto duplo

Existe outro desafio para as blockchains que não foi mencionado na analogia
dos táxis, mas que é resolvido pelos sistemas prova de trabalho.
Especificamente, um minerador mal-intencionado pode tentar gastar duas
vezes uma mesma saída. Tal fato refere-se a um ataque onde o minerador
cria blocos alternativos para desfazer suas transações antigas, “roubando de
volta” o dinheiro que havia gasto. Esse tipo de ataque precisaria ser
executado da seguinte forma:

O minerador mal-intencionado “Martin” transmite uma transação


enviando alguns de seus moneroj para a vítima “Valerie”.
Quando a transação “Martin >> Valerie” é minerada na blockchain,
Valerie acredita que foi paga.
Martin pega os itens que estava comprando de Valerie…
… em seguinda, Martin minera uma versão diferente do bloco que
originalmente continha a transação Martin >> Valerie.
Nessa versão alternativa de Martin, a transação para Valerie não existe!
Na verdade, sua segunda versão contém uma transação que envia
aqueles moneroj para uma de suas carteiras (Martin >> Martin), ao
invés da carteira de Valerie.
Se Martin puder rapidamente minerar blocos suficientes para fazer da
sua versão a cadeia mais longa, a rede irá aceitar sua realidade
alternativa. Na prática, a inviabilidade desta etapa previne que ataques
de gasto duplo aconteçam.
Dado que a imagem-chave da saída de Martin aparece na cadeia (agora
associada com a transação para si mesmo), a rede não irá mais aceitar a
transação “Martin >> Valerie” como válida pois a imagem-chave
associada com aquela saída já foi gasta.

A essa altura, Martin ficou com os itens que comprou de Valerie e também
roubou de volta os moneroj que ele inicialmente tinha usado para pagá-la.

Felizmente, sistemas prova de trabalho impedem que um adversário consiga


realizar esse tipo de ataque de gasto duplo ao limitar a velocidade com que
blocos podem ser gerados. Lembre-se que os mineradores sempre seguirão a
blockchain mais longa, assim, o minerador mal-intencionado teria que
alterar o bloco contendo a transação antiga e depois reminerar cada bloco
subsequente rápido o suficiente para ultrapassar o comprimento da cadeia
principal. Uma vez que o minerador mal-intencionado estará trabalhando
sozinho para gerar os blocos alterados, contra o hashrate total do restante da
rede que está mantendo a versão original da blockchain, ele não será capaz
de alcançá-los. Esse tipo de ataque só poderia ser bem sucedido se o
minerador mal-intencionado tiver tanto poder computacional quanto todo o
restante da rede combinada. Por essa razão, o termo ataque de 51% muitas
vezes é usado para representar que algum tipo de atividade mal-intencionada
precisaria controlar mais da metade do hashrate.

Figura 4.8 – O minerador desonesto, na parte de baixo, tenta executar


um ataque de gasto duplo criando uma versão diferente de um bloco já
minerado. Todos os mineradores honestos trabalhando juntos produzem
blocos mais rapidamente que o minerador mal-intencionado, e assim a
cadeia do malfeitor com a transação alternativa é descartada.

Uma criptomoeda com mais mineradores e maior taxa total de hash será
mais difícil de atacar dessa forma, já que o minerador mal-intencionado
precisaria ter mais poder computacional do que o restante da rede global.
Aumentar o hashrate total ao incluir mais mineradores ajuda a proteger a
rede contra ataques.

4.4.2 A “dificuldade” ajusta o tempo entre blocos


A rede Monero tem por objetivo adicionar um novo bloco à cadeia a cada
dois minutos, aproximadamente. A cada bloco minerado, algumas transações
são movidas da memory pool de transações pendentes e vão para a
blockchain como confirmadas. Se o tempo médio do bloco for muito longo,
as transações demorarão muito para serem confirmadas. Se o tempo médio
do bloco for muito curto, a rede sairá de sincronia com mais frequência.

A rede influencia quão rápido os blocos são minerados ajustando a


dificuldade do desafio do nonce. Com mais mineradores juntado-se à rede ao
longo do tempo, o maior poder coletivo de adivinhar (ou hashrate) resulta
em blocos sendo completados mais frequentemente (conceitualmente: se
você duplicar o número de pessoas procurando por algo, o grupo
provavelmente encontrará o que procura na metade do tempo).
Estatisticamente, isso faria com que os mineradores encontrassem blocos
mais rápido do que o tempo de bloco pretendido, de 2 minutos. Para
compensar esse efeito, a dificuldade do desafio é aumentada, fazendo com
que se demore mais para encontrar um nonce que cumpra os requisitos
estipulados. Da mesma forma, a dificuldade pode ser ajustada “para baixo”
se o poder de mineração coletivo diminuir, ou seja, quando a frequência com
que os blocos são completados é reduzida.

Na analogia sobre a rede de táxis da seção anterior, a dificuldade da tarefa de


reorganização das letras poderia ser arbitrariamente ajustada, exigindo mais
ou menos palavras para formar as frases nonce. Se 20% dos taxistas
(mineradores) não trabalhassem um dia, os blocos com planos de trajetos
demorariam mais que o normal para serem submetidos (completos com o
nonce), e alguns carros ficariam ociosos por falta de motoristas. Para corrigir
isso, os taxistas poderiam concordar em reduzir o requisito do nonce de 50
para 40 palavras. Essa redução colocaria os taxistas de volta em sincronia
com a quantidade de carros disponíveis.

A dificuldade aumenta proporcionalmente ao hashrate total da rede para


manter o fluxo de blocos constante.

4.4.3 O algoritmo CryptoNight


O Monero utiliza uma variação do algoritmo CryptoNight e ele é bastante
diferente dos sistemas utilizados pela maioria das outras criptomoedas. Uma
das características que definem o Monero é o uso de uma função de prova de
trabalho difícil de ser otimizada em equipamentos especializados de
mineração.

Na maioria dos contextos, “otimização” é uma coisa boa. Talvez você esteja
surpreso que o algoritmo de prova de trabalho do Monero propositalmente
combata o aumento da velocidade de mineração. Isso acontece porque a
habilidade de criar equipamentos de mineração mais potentes pode levar a
uma perigosa centralização de mineradores. Esses riscos são perfeitamente
observados na história da mineração do Bitcoin.

4.4.3.1 Contexto: A história da mineração do Bitcoin


Quando as criptomoedas entraram em cena com o aparecimento do Bitcoin
em 2009, a mineração era feita exclusivamente usando-se o processador
(CPU) dos computadores. Uma vez que a dificuldade de mineração da rede
se ajusta ao hashrate total disponível, minerar com CPU era adequadamente
lucrativo naquela época. Usando processadores para minerar Bitcoin, os
mineradores tinham poder de mineração na ordem de 1.000.000 H/s,
também escrito como 1MH/s.

Em pouco tempo, placas de vídeo (chamadas GPU) foram reaproveitadas


para minerar criptomoedas. As GPUs são capazes de minerar muito mais
rápido, na ordem de 100 MH/s. Dado que a dificuldade da rede se ajustou
com base nos mineradores que usavam GPU, quem minerava com
processador não conseguia mais competir (por exemplo, a recompensa pela
mineração não era suficiente para pagar pelo equipamento nem pelos custos
com eletricidade).

Em seguida, circuitos integrados de aplicação específica (Application


Specific Integrated Circuits ou ASICs, em inglês) foram desenvolvidos com
o único propósito de minerar Bitcoin. Esses dispositivos especiais são
bastante caros e mineram a taxas milhares de vezes mais rápidas que GPUs –
mais de 1.000.000 MH/s. Hoje, a dificuldade da rede Bitcoin aumentou para
acomodar os ASICs, expulsando, por consequência, os mineradores que
usavam processadores e GPUs.

O Bitcoin foi inicialmente lançado com a visão de que qualquer pessoa no


mundo que tivesse um computador pudesse começar a minerar para proteger
a rede e receber, assim, alguns bitcoins como recompensa. Infelizmente, a
criação e proliferação dos ASICs efetivamente acabou com esse sonho. Se
você deseja começar a minerar Bitcoin agora, terá que comprar um ASIC
pagando centenas ou até milhares de Euros.

O domínio dos ASICs forçou a maioria esmagadora dos mineradores de


Bitcoin a abandonar o negócio. No início da sua existência, a rede era
protegida por um grande número de nerds espalhados pelo globo, todos
participando com seus computadores pessoais e placas de vídeo.
Infelizmente, essa era do Bitcoin com verdadeira e legítima descentralização
se foi. Hoje a rede é dominada por grandes corporações com enormes
fazendas de mineração ASIC, que efetivamente tornaram-se a base da rede.
4.4.3.2 ASICs possibilitam uma centralização perigosa

Já que muitas das principais criptomoedas são dominadas por mineradores


usando ASICs, é válido levantar algumas considerações sobre o tópico e
seus riscos. A centralização acontece de duas formas: os ASICs só são
produzidos por um pequeno número de empresas (centralização da
fabricação) e posteriormente a mineração tende a ser limitada a algumas
grandes fazendas (centralização da mineração).

A centralização da fabricação dos ASICs e da mineração por parte de poucas


corporações pertimite que hackers, criminosos e governos exerçam enorme e
desproporcional influência sobre a rede e sua operação. Esse fenômeno faz
com que muitos dos benefícios da descentralização comecem a desaparecer.
Por exemplo:

O acesso universal à mineração prosperava nos tempos de mineração com


processadores e GPUs, quando usava-se, em sua maioria, equipamentos de
uso geral e sem restrições. Hoje em dia, porém, a mineração requer
equipamentos especializados que correm grande risco de regulação e
controle. É possível que alguns governos imponham proibições ou exijam
licenças para fabricar e possuir ASICs.

A resistência a censura é enfraquecida se a maior parte do poder de


mineração do Monero for controlada por grandes fazendas de mineração que
podem sofrer pressão para confirmar ou censurar determinadas transações.
Seria muito difícil exercer esse tipo de influencia sobre um conjunto global
de mineradores amadores, e muito mais fácil de impor esse tipo de situação a
corporações centralizadas de mineração.

A resiliência da rede pode ser catastroficamente comprometida se um


fabricante mal-intencionado (ou que esteja seguindo ordens de um governo)
incluir um interruptor secreto nos ASICs para controlar ou até desligar os
equipamentos de mineração remotamente. Isso cria um ponto único de falha
cuja ativação acabaria instantaneamente com a maior parte do hashrate da
rede. Tal acontecimento subitamente colocaria a rede em um estado de
vulnerabilidade com muito menos hashrate para proteger a moeda. Esse
risco é ainda maior se um pequeno grupo de fabricantes ASICs controlar a
maior parcela da produção.
O controle dos ASICs sobre o Bitcoin está completo. Embora ainda existam
pequenos mineradores amadores usando ASICs em pools, são as grandes
fazendas de mineração que dominam o hashrate da rede. O que é
preocupante, é que a maioria dos ASICs para Bitcoin são projetados,
produzidos e enviados por um único fabricante – em forte contraste com os
dias iniciais do Bitcoin, onde os mineradores utilizavam processadores e
GPUs de todas as marcas, modelos e tipos para minerar. A predominância
dos ASICs seria muito menos arriscada se houvesse um mercado
diversificado e competitivo em torno dos ASICs.

4.4.3.3 O Monero resiste ativamente aos ASICs

Devido a seus princípios de igualdade, a comunidade Monero não aprova os


ASICs e a inevitável centralização do poder de mineração que os
acompanha. Enquanto o algoritmo de hash “intensivo para processadores”
(SHA-256) utilizado no Bitcoin é passível de ser otimizado em ASICs, o
Monero previne o desenvolvimento de ASICs usando um algoritmo
“intensivo para a memória” que é mais difícil de acelerar (CryptoNight).

Consequentemente, é possível minerar Monero com processador e placa de


vídeo, mesmo em 2018. Existem atualmente bilhões de dispositivos
(qualquer processador x86 moderno e várias GPUs) capazes de minerar
Monero, tornando o processo acessível a qualquer pessoa que tenha uma
conexão com a internet. Na verdade, pode-se minerar Monero usando até
mesmo um navegador web a partir de qualquer celular ou computador!

No início de Março de 2018 a comunidade Monero ficou surpresa ao


descobrir que ASICs para o algoritmo CryptoNight haviam sido
secretamente produzidos e usados para minerar Monero! Esses dispositivos
eram capazes de minerar Monero 25 vezes mais rápido que as placas de
vídeo mais potentes, e uma análise sobre o hashrate feita posteriormente
sugeria que os ASICs correspondiam a aproximadamente metade do
hashrate da rede Monero entre o final de 2017 e início de 2018.

Dado que o algoritmo CryptoNight foi projetado usando uma função


intensiva para a memória especificamente para “encurtar a distância entre os
mineradores CPU (maioria) e GPU/FPGA/ASIC (minoria)”, a existência
desses ASICs foi uma descoberta inesperada. Embora os autores do
CryptoNote observem que “É apropriado que alguns usuários tenham certa
vantagem sobre os demais”, eles propõe que “o investimento deles deva
crescer linearmente com o poder de mineração”. Naturalmente, um
computador mais novo ou uma placa de vídeo mais moderna irá minerar
com mais eficiência do que um equipamento antigo, porém, os ASICs criam
uma distribuição de hashrate extremamente desproporcional.

A comunidade Monero reagiu rapidamente, tomando medidas de forma


proativa para mitigar a mineração ASIC antes mesmo que a existência destes
dispositivos tivesse sido completamente confirmada. A atualização rotineira
do Monero realizada no segundo trimestre de 2018 incluiu uma pequena
alteração no algoritmo CryptoNight projetada para afetar os mineradores
ASICs de forma diferente dos que usavam processador ou GPU. Essa
pequena alteração não mudou a dificuldade ou o comportamento do
algoritmo, assim os mineradores CPU e GPU foram capazes de se adaptar
facilmente à nova variante quando eles atualizaram para a nova versão da
rede.

Os ASICs, em contrapartida, são fundamentalmente incapazes de se adaptar


a novas variantes (sejam elas pequenas ou grandes). Pode-se pensar nos
ASICs como trabalhadores que são treinados para executar uma única tarefa
com extrema velocidade, mas que não são capazes de aprender qualquer
outra coisa. O algoritmo a ser executado é fisicamente gravado nos circuitos
dos ASICs, e por isso eles não podem ser reprogramados nem
reaproveitados.

Quando a pequena alteração no CryptoNote foi implementada no bloco


1546000, os ASICs instantaneamente tornaram-se incompatíveis e
aproximadamente metade do hashrate total da rede desapareceu. Já que os
ASICs eram incapazes de se ajustar para processar blocos usando o
algoritmo modificado, qualquer bloco que eles produziam eram agora
imediatamente rejeitados pela rede Monero como inválidos.

Por enquanto, parece que a rede Monero tem mitigado a ameaça inesperada
dos ASICs com sucesso. Para continuar desencorajando os ASICs, agora o
Monero faz pequenas alterações no algoritmo de mineração a cada
atualização da rede. O projeto também está explorando algoritmos
completamente novos para proteger a rede de ASICs a longo prazo. Uma vez
que o Monero realiza atualizações de rotina (também chamados hard forks) a
cada 6 meses, tal medida deve desincentivar as tentativas de se produzir
ASICs para o Monero, já que cada reformulação, além de ser demorada e
cara, tornaria-se obsoleta imediatamente.

4.4.4 Breve nota sobre provas de trabalho alternativas


Além da prova de trabalho, existem sistemas alternativos para manter a
justiça e a igualdade; alguns exemplos incluem prova de participação, prova
de espaço, prova de largura de banda e até sistemas híbridos usando mais de
um tipo. Cada sistema tem suas próprias vantagens e desvantagens. Prova de
trabalho é o sistema de consenso distribuído mais utilizado atualmente e
também o que mais foi testado “em campo”. Esse é o único mecanismo
utilizado no Monero atualmente.

4.5 Conceitos criptográficos para provas de


trabalho
Ao longo desse capítulo, focamos na funcionalidade dos hashes e dos
nonces, descrevendo-os principalmente através de analogias. Se você deseja
aprender como eles realmente funcionam, o restante do capítulo apresenta os
verdadeiros princípios criptográficos.

4.5.1 Hashes (conceito geral)


Funções hash são uma ferramenta criptográfica que pode receber qualquer
informação de entrada e produzir uma impressão digital única como saída.
Esses algoritmos foram projetados de forma que qualquer alteração na
informação de entrada, mesmo a menor das alterações, produzirá uma saída
completamente diferente. O termo hash pode ser usado para referir-se tanto à
função em si quanto à saída resultante de uma entrada em particular.

Adicionar, remover ou mesmo alterar um único caractere produzirá um hash


totalmente diferente. Considere a mensagem “Envie 50 euros a Jen, por
favor.” Nós podemos executar essa mensagem através de um desses
algoritmos para produzir seu hash: 4ba085ea2f7a9e36. A tabela abaixo
mostra como a saída do hash muda drasticamente com qualquer modificação
na entrada:

Entrada Saída Comentário


Envie 50 euros a Jen, por 4ba085ea2f7a9e36 Mensagem original
favor.
Envie 500 euros a Jen, por e3691dd17764af6e Adicionando um “0” a
favor. mais
Envie 60 euros a Jen, por af75592fc4f27e1d Trocando o “5” por “6”
favor.
Envie 50 euros a Jon, por 4e52ccf6f35cd535 Trocando o destinatário
favor. para “Jon”
Envie 50 euros a Jen, por 4ba085ea2f7a9e36 Mesma entrada = mesma
favor. saída!

Os exemplos de saída são os primeiros 16 caracteres do hash SHA-256


de cada entrada.
$ echo {entrada} | sha256sum | cut -c1-16

Funções hash são amplamente utilizadas nos mecanismos de segurança de


muitas criptomoedas. E essas funções hash criptográficas foram projetadas
para serem resistentes a colisão, o que significa que é difícil encontrar duas
mensagens de entrada que colidam para produzir a mesma saída. Essa
propriedade é fundamental para a imutabilidade (prova de alteração) da
blockchain, já que qualquer tentativa de mudar informações em um bloco
anterior irá resultar em uma saída hash completamente diferente para aquele
bloco e também para os subsequentes.

Essa noção de expandir um banco de dados que só aceita adições, onde cada
grupo de registros é criptograficamente protegido por hashes associados aos
blocos anteriores, é o conceito principal por trás da revolução das
blockchains.

4.5.2 Nonces (conceito geral)


O termo nonce refere-se a um desafio (no sentido de “quebra-cabeça” ou
“enigma”) que não possui um significado físico ou matemático inerente. Por
exemplo, considere os seguintes exercícios de “preencher as lacunas” que
uma professora passaria a seus alunos:

1. A palavra em Esperando “m _ _ _ _” inspirou o nome “Monero”.

Resposta aceita: “moeda”

2. 1 quilograma é igual a “_ _ _ _” gramas.

Resposta aceita: 1000

3. Número primo de 3 dígitos “3 _ _” que não repete nenhum algarismo.

Nonces aceitos: qualquer um dentre {307, 317, 347, 349, 359, etc}

4. Número primo de 5 dígitos “7 _ _ _ _” que não repete nenhum


algarismo.

Nonces aceitos: qualquer um dentre {71263, 72169, 73609, 74869, etc}

Tanto o desafio A quanto o B têm um significado, e cada um possui uma


única resposta correta (A: “moeda”, B: “1000”) que o aluno precisará
lembrar no futuro. Assim, essas respostas não são consideradas “nonces”.
Os desafios C e D, em contrapartida, são tarefas “exaustivas”, difíceis de
resolver e que não contribuem em nada com qualquer problema real.
Existem várias soluções que satisfazem os requerimentos do nonce; por
exemplo, a resposta “359” da questão C é igualmente válida a resposta
“307”.

Um aluno que gaste uma hora testando vários números para finalmente
chegar à reposta “359” para o desafio C terá que recomeçar sua procura por
um nonce válido do zero quando lhe for apresentada a uma variação do
desafio que diga, por exemplo, “Número primo de 3 dígitos”6 _ _” que não
repete nenhum algarismo.”

Se você tivesse somente um lápis e papel (ou até mesmo uma calculadora),
conseguiria resolver o desafio C ou o D? Provavelmente o desafio C, já que
você certamente encontraria uma resposta válida com 3 dígitos mais
rapidamente do que uma com 5 dígitos. Note que é possível ajustar a
dificuldade do problema de forma arbitrária, simplesmente alterando quantos
dígitos são necessários.

4.6 Resumo sobre o conceito de prova de


trabalho
As criptomoedas utilizam o hash de cada bloco para garantir que seu
conteúdo não foi alterado, já que a mudança de um único caractere seria
imediatamente óbvia devido ao hash completamente diferente (que se
propaga através dos blocos seguintes). O hash de um bloco engloba todo seu
conteúdo: transações, cabeçalhos, o hash do bloco anterior e o campo do
nonce.

Para executar o trabalho de completar um bloco, os mineradores devem


testar valores aleatórios de nonce até que o hash do bloco inteiro produza
uma saída que esteja abaixo de um certo limiar, este determinado com base
na dificuldade atual da rede. Uma vez que é impossível prever como
mudanças na entrada de uma função hash afetarão sua saída, os mineradores
precisam usar “força bruta”, num processo de tentativa e erro, até que
encontrem um valor de nonce que produza um hash de saída que satisfaça a
dificuldade atual da rede.
A rede aumenta ou diminui esse limiar para influenciar a dificuldade de
mineração, mantendo assim o tempo de bloco em 2 minutos,
independentemente das mudanças no hashrate total.
Capítulo 5
Uma imersão profunda no Monero e
em criptografia
Muito antes do surgimento dos computadores, matemática e criptografia
sempre estiveram no centro dos sistemas de comunicação e de troca de
informações. Embora cifras simples existam desde os tempos de César, a
criptografia moderna nasceu durante as Guerras Mundiais para criptografar
mensagens importantes e confidenciais. Inicialmente, governos e militares
financiaram pesquisas secretas sobre criptografia para identificar protocolos
que pudessem proteger segredos de estado.

Agora, a criptografia não está mais limitada a espiões e militares; ela forma a
base da comunicação e segurança na era da internet e tem sido amplamente
estudada por pesquisadores acadêmicos e institucionais espalhados por todo
o planeta.

Hoje em dia, a criptografia é uma ferramenta onipresente que fornece


segurança, gerenciamento, comunicação e diversos tipos de conexões que
melhoram nossa vida no dia-a-dia. Considere, por exemplo, a invenção do
Secure Socket Layer (SSL, tornado obsoleto em favor do TLS), que baseia-
se em assinar conteúdos criptograficamente. Hospitais, bancos, governos e
empresas, todos eles protegem seus dados usando criptografia.

Esse capítulo discutirá como ferramentas criptográficas podem ser utilizadas


em um banco de dados financeiro descentralizado para dar origem às
criptomoedas, em especial, o Monero.

5.1 Fundamentos de matemática


Aqui vai uma breve introdução a vários princípios matemáticos que formam
o cerne da criptografia.

5.1.1 Divisão Euclidiana (A/B)


Dividir qualquer número A por outro B, escrito como A/B ou A÷B retorna
uma resposta que pode ser escrita na forma de um quociente com um resto
ou como um único decimal.

De modo geral:
A/B = q com resto r

Por exemplo:
12/4 = 3 com resto 0, que pode ser escrito como 3,0 na forma
decimal
13/4 = 3 com resto 1, que pode ser escrito como 3,25 na forma
decimal
27/5 = 5 com resto 2, que pode ser escrito como 5,4 na forma
decimal

5.1.2 Números primos


Um número primo é qualquer inteiro (número completo) que seja divisível
apenas por um e por ele mesmo. Por exemplo:

20 não é primo pois ele é divisível por 2, 4, 5 e 10, resultando em números


inteiros, por exemplo: 20 ÷ 4 = 5 ou 20 ÷ 10 = 2.

7 é primo pois dividi-lo por qualquer inteiro não resulta em um número


inteiro, por exemplo: 7 ÷ 3 = 2,333.

Alguns exemplos de números primos incluem o 3, 5, 7, 11, 13, 97, 223, 997,
3413, 4421, 17837, 145601, 428567, 1171967 e números ainda maiores
como
2074722246773485207821695222107608587480996474721117292752992
589912196684750549658310084416732550077 ou os primos gêmeos
2.996.863.034.895 × 2^1.290.000 ± 1, que têm mais de 350.000 dígitos
cada!

5.1.3 Aritmética modular


A aritmética modular descreve números inteiros que “voltam para trás”
quando atingem um certo valor. O relógio de ponteiros é um bom exemplo.
Se você for dormir 5 horas após as 11:00 da noite, não verá o relógio de
ponteiros marcar 16:00! Em vez disso, à meia-noite, os números voltam para
zero (ou seja, 5 horas após 11:00 da noite é 04:00 da manhã do dia seguinte).

Dados dois número positivos, A (dividendo) e B (divisor),

A módulo B = resto r da divisão A/B.

No contexto dos relógios, ir dormir 5 horas após 11:00 da noite pode ser
representado como:
(11:00 da noite + 5 horas) mod 12 = ...
= 16:00 mod 12
= 04:00 (da manhã)

5.1.4 Representação dos inteiros


Números inteiros podem ser representados usando diversas codificações
diferentes, muitas das quais são frequentemente encontradas em ciência da
computação.

A maioria das pessoas está bastante familiarizada com o sistema “decimal”


de base-10, que utiliza 10 caracteres para representar números: 0, 1, 2, 3, 4,
5, 6, 7, 8, 9.

A codificação “hex” adiciona 6 caracteres extras, formando o conjunto de


base-16: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f.

O número inteiro 11719682 na base-10 pode ser expressado como B2D402


na base-16. Perceba que um conjunto de caracteres maior requer menos
dígitos para representar o mesmo número.

Computadores “pensam” na base-2, utilizando somente os caracteres “0” e


“1”. Este sistema é chamado de binário e o número 11719682 (base-10) seria
representado como 101100101101010000000010 na forma binária.

O Monero apresenta o endereço final e as chaves na base-58, que utiliza


numerais arábicos e a maior parte do conjunto de caracteres latinos (tanto na
forma maiúscula quanto minúscula). Ele é similar a outro esquema chamado
Base64, porém foi modificado para evitar o uso de números e letras que
parecem iguais quando impressas. O Monero utiliza esse formato puramente
para ajudar os usuários, que muitas vezes precisam ler ou transcrever longos
endereços.

O alfabeto na base-58 é:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuv
wxyz

Nota: O zero (0) juntamente com as letras I (i maiúsculo), O (o maiúsculo) e


l (L minúsculo) não fazem parte do alfabeto Base58 por conta de sua
semelhança um com o outro.

5.1.5 Curvas elípticas


5.1.5.1 Introdução geral

Curvas elípticas são definidas como um conjunto de pontos bi-dimensionais


(x, y) que satisfazem uma equação:
y^2=x^3+ax+b.

Por exemplo, com coeficientes fixos a = 2 e b = 3, essa equação fica:


y^2=x^3+2x+3,

que é satisfeita por muitos pares de pontos, como:


x = 3 e y = 6
x = 3 e y = -6
x = -1 e y = 0.

2.1.5.2 Ed25519 Edwards Invertida

O Monero utiliza uma curva elíptica Edwards Invertida particular para


realizar operações criptográficas, a Ed25519, que é birracionalmente
equivalente à curva de Montgomery Curve25519.

A curva Ed25519 pode ser expressa algebricamente como:


- x^2 + y^2 = 1 − (121665/121666) x^2 y^2.

Considerando a equação genérica da nossa curva elíptica, a Edwards


Invertida é um caso especial que usa os parâmetros:
a = -1 e b = 121665/121666.

Recentemente, ficou claro que o algoritmo PRNG (sigla para gerador de


números pseudoaleatórios ou Pseudo-Random Number Generator, em
inglês) endossado pelo NIST (Instituto Nacional de Padrões e Tecnologia ou
National Institute of Standards and Technology, em inglês) é falho e
possivelmente contém um backdoor. Dado que os algoritmos do padrão
NIST4 tiveram problemas recentemente, a curva Edwards Invertida foi
selecionada para tratar essas questões levantadas pela comunidade de
criptografia.

Visto sob uma perspectiva mais ampla, as curvas selecionadas pelo NIST
também são implicitamente apoiadas pela NSA (Agência de Segurança
Nacional ou National Security Agency, em inglês). Esse tipo de apoio é visto
com suspeita pelas comunidades de criptografia e criptomoedas por conta de
incidentes passados onde a NSA usou sua autoridade sobre o NIST para
enfraquecer os algoritmos sugeridos pela última.

A curva Edwards Invertida Ed25519 não está sujeita a nenhuma patente e a


equipe por trás dela desenvolveu e adaptou algoritmos básicos de
criptografia pensando na eficiência. Neste momento, acredita-se que essa
curva é segura.

5.1.5.3 Operações elípticas

Adição de pontos de uma curva elíptica e multiplicação escalar são


operações fundamentais em esquemas de criptografia usando curvas
elípticas. É importante termos um conhecimento básico sobre esses
conceitos antes de imergirmos nos mecanismos de cálculo do Monero.

A adição de pontos em uma curva elíptica funciona de forma diferente da


adição convencional que encontramos na aritmética usada em nosso
cotidiano. Para adicionar dois pontos em uma curva elíptica, precisamos
encontrar a linha entre esses dois pontos e depois encontrar o ponto no qual a
curva intercepta com essa linha. O ponto é então refletido sobre o eixo x
para chegar-se ao ponto final desejado.

Para se adicionar um ponto a ele próprio, operação conhecida como


duplicação de pontos, precisamos encontrar a linha tangente ao ponto inicial
para se chegar ao ponto que essa tangente intercepta com a curva. Este ponto
é então refletido sobre o eixo x para chegar-se ao ponto final desejado.

A multiplicação escalar utiliza tanto um ponto na curva quanto um inteiro.


Para multiplicar um ponto, P, por um inteiro, S, o ponto é adicionado a ele
próprio S vezes. Muitos esquemas criptográficos, como aqueles empregados
no Monero, utilizam pontos base comuns da curva elíptica como pontos
geradores para gerar chaves públicas a partir de chaves privadas.

Quando o ponto gerador da curva é adicionado a ele próprio várias vezes, o


ponto resultante não pode ser usado para determinar quantas vezes a
operação aconteceu. Esse problema é frequentemente referenciado como
problema do logaritmo discreto em curvas elípticas. Esse tipo de
multiplicação escalar é considerada uma função de uma só via, já que é
muito difícil reverter a operação.

5.2 Fundamentos de criptografia


Monero é a criptomoeda líder em segurança e não-rastreabilidade graças às
suas características únicas voltadas para privacidade, as quais exploraremos
mais atentamente ao longo deste capítulo. Este é um dos capítulos mais
técnicos do livro devido à natureza matemática da criptografia. Técnicas
mais complexas são desenvolvidas a partir de princípios simples conhecidos
como primitivas criptográficas.

Uma primitiva criptográfica é um algoritmo que serve como alicerce para


protocolos criptográficos. O Monero emprega uma grande variedade de
primitivas criptográficas para diversos usos, alguns dos quais abordamos
conceitualmente nos Capítulos 3 e 4. A abordagem intencional do Monero
no que se refere à privacidade e à prova de trabalho (resistente a ASICs)
requer ferramentas criptográficas mais sofisticadas do que aquelas utilizadas
por muitas das outras criptomoedas.
5.2.1 Criptografia simétrica e assimétrica
Algoritmos para criptografar dados podem ser classificados como simétricos
ou assimétricos dependendo do tipo de chaves que são utilizadas.

A encriptação simétrica requer que os participantes compartilhem um


segredo, por exemplo, você criptografa uma mensagem com a senha
“hunter2” e o remetente usa a senha “hunter2” para decriptá-la. Para se
comunicar dessa forma, ambas as partes precisam concordar em um segredo
(simétrico) compartilhado previamente. Essa questão prática limita a
utilidade da encriptação simétrica a poucas aplicações.

A encriptação assimétrica permite que duas partes interajam em segurança


sem a necessidade de compartilhar um segredo em particular. Esse tipo de
criptografia está intimamente ligada à estrutura de segurança da internet, de
aplicativos de mensagens ponta-a-ponta e das criptomoedas.

O Bitcoin utiliza encriptação assimétrica com duas chaves:

chave privada – para assinar transações e descriptografar dados


chave pública – para verificar assinaturas e criptografar dados

O Monero utiliza uma estrutura criptográfica mais complexa que requer


quatro chaves:

chave pública de visualização – usada para verificar a validade de


endereços
chave privada de visualização – usada para ver dados como saldo, taxas
e valor das transações (a chave de visualização não consegue criar nem
assinar transações)
chave pública de gasto – outra chave pública para verificar transações
chave privada de gasto – usada para assinar transações, por exemplo, ao
enviar moneroj

Seu endereço público Monero é uma representação direta do par de chaves


públicas, enquanto o Bitcoin (e seus clones) utiliza um hash da sua única
chave pública. Chaves EdDSA (tanto privadas quanto públicas) têm 256 bits
de comprimento ou 64 caracteres hexadecimais. Nem todo inteiro de 256-bit
é um escalar EdDSA válido (chave privada); ele deve ser menor que a
“ordem da curva” descrito pela equação da seção sobre a função Ed25519.

5.2.2 Hashing
O Capítulo 4 discutiu o conceito de hash e como ele é usado para uma
variedade de coisas, desde confirmar a veracidade de dados até distribuir
recompensas em um sistema prova de trabalho. Exemplos de hashes são
mostrados na seção de criptografia próxima ao final do Capítulo 4.

Selecionar um bom algoritmo de hash é crucial para gerar endereços e


chaves de forma segura. Se duas entradas diferentes produzem o mesmo
hash de saída, tal fenômeno é conhecido como colisão. Hashes são
comumente utilizados como um identificador nos sistemas blockchain,
apoiando-se em sua propriedade de singularidade. Além disso, uma colisão
durante a geração da semente faria com que mais de uma pessoa acabasse
possuindo as mesmas chaves e endereços; obviamente isso seria
extremamente problemático!

O Monero utiliza o sistema prova de trabalho CryptoNight, que emprega um


algoritmo especial de hash chamado CryptoNote, projetado com base no
hash Keccak. O algoritmo Keccak ganhou a competição do NIST para se
tornar o SHA3 e foi projetado por engenheiros que não estão ligados à NSA.

5.2.3 Gerador de números pseudoaleatórios do Monero (PRNG)


Quando usuários e computadores estão criando novas chaves, é crucial que
eles encontrem novas chaves que ninguém poderá adivinhar. Na verdade,
isso é um tarefa bastante difícil, já que tanto equipamentos quanto softwares
geralmente são projetados para favorecer a reprodutibilidade. Se o
computador gera dados aleatórios de forma previsível, a saída pode até ser
bastante aleatória mas ao mesmo tempo relativamente fácil de adivinhar.

Por exemplo, considere um PRNG que simplesmente misture os dígitos do


horário atual para criar uma chave de 4 dígitos. Assim, as “10:34” ele
poderia gerar a saída “0413” ou “1403” ou “0134”, e assim por diante. Se
você quisesse manter essa chave secreta, este seria um método horrível de se
usar por algumas razões:

Um adversário que saiba que você criou suas chaves quando você retornou
do almoço, por volta das 12:45, saberia que os dígitos “1” e “2” aparecem na
sua chave e isso restringiria consideravelmente as opções possíveis.

No formato HH:MM, não existe uma hora do dia que tenha três “9”. Na
verdade, não existe nenhuma hora do dia que contenha três dígitos de
qualquer um dos números {6, 7, 8, 9} já que 17:89 h, 18:78 h, etc. são
horários impossíveis. Essa regra exclui muitas senhas de 4 dígitos, deixando
o adversário com uma “lista” muito menor de opções para adivinhar.

O gerador de números aleatório acima baseado no relógio é péssimo, pois


usar a hora do dia como semente inicial é previsível. A semente inicial
deveria ser muito mais difícil de ser adivinhada por um adversário. Bons
geradores de números aleatórios introduzem bastante entropia para tornar
suas saídas imprevisíveis. Simplesmente misturar 4 dígitos não introduz
muita entropia, outra razão pela qual nosso PRNG acima seria inseguro.

Quando um usuário está gerando uma carteira, seu sistema operacional


provém a semente inicial ou primeira fonte de entropia. A partir disso, o
Monero aplica repetidamente a função hash Keccak para levar a uma saída
imprevisível e não reprodutível. Cada rodada de hash produz uma saída, que
é então usada como entrada para o próximo hash.

5.3 Gerando chaves e endereços Monero


5.3.1 Escolhendo uma semente
No Capítulo 2, conversamos sobre o coração da sua carteira: sua semente.
Esse segredo gerado por sua carteira é usado para derivar todas as suas
chaves, e acessar e gastar seus fundos. Naquela ocasião, simplesmente
consideramos a semente mnemônica de 25 palavras.

“Por trás da cortina”, uma semente é um inteiro de 256 bits único a partir do
qual chaves e endereços são derivados, por exemplo:
1126991085054359437260510514509403775521776267789095646916738451
34467691053980

Geralmente, eles são representados como um número na base-16 contendo


64 dígitos, por exemplo:
f9296f587419f1cdede67de160fca14d1069ecaa4c52f012af031eeA09ee039c

(para chaves no estilo mnemônico, essa representação da semente é, na


verdade, a chave privada de gasto por si só!)

Escrever as chaves em qualquer um dos formatos acima seria bastante difícil


e a maioria das pessoas estariam sujeitas a cometer ao menos um erro.
Converter a semente para uma frase mnemônica é outro passo incluído
somente para melhor a usabilidade e a interpretação por humanos. A frase
mnemônica basicamente converte o número de 256 bits acima em um
“número” na base-1626 contendo 24 dígitos (24 palavras). Essa
representação da longa sequência de caracteres da semente é muito mais
fácil de ser lida:
lamb hexagon aces acquire twang bluntly argue when unafraid
awning academy nail threaten sailor palace selfish cadets click
sickness juggled border thumbs remedy ridges border

Quando sua carteira apresenta a semente de 24 palavras, ela também


adiciona uma 25ª palavra que funciona como um verificador, permitindo a
detecção posterior de erros de digitação ou equívocos. O método mnemônico
do Monero codifica numa razão mínima de 4:3. Em outras palavras, quatro
bytes criam três palavras, mais uma palavra verificadora; oito bytes criam
seis palavras, mais uma palavra verificadora; e assim por diante.

A chave privada de visualização é derivada calculando o hash da semente


usando Keccak-256, produzindo um segundo inteiro de 256 bits que é então
enviado para uma função chamada sc_reduce32 para garantir que ele seja
compatível com a curva elíptica. As sementes criadas por esse método
sempre serão escalares válidos já que primeiramente eles foram enviados
para a função sc_reduce32.

5.3.2 Derivação das chaves


5.3.2.1 Todas as chaves

A semente Monero descrita acima é, na verdade, sua chave secreta de gasto,


a partir da qual todas as outras chaves são derivadas. A chave secreta de
visualização é o hash reduzido da sua chave secreta de gasto, convertida para
um escalar válido na curva Ed25519.

Essas duas chaves privadas são multiplicadas pelo ponto gerador para
produzir duas chaves públicas da sua carteira (chave pública de gasto e
chave pública de visualização). Refere-se a esse método de derivação das
chaves como método determinístico.

5.3.2.2 Carteira somente leitura

Você pode conceder acesso somente leitura a uma conta Monero


configurando uma carteira com sua chave secreta de visualização, mas NÃO
com sua chave secreta de gasto. Essas carteiras somente leitura podem ver
todas as transações de entrada, mas não conseguem gastar moneroj nem ver
transações de saída.

Existem muitas situações em que é útil verificar transações de entrada sem


ter acesso ao envio. Por exemplo, indivíduos com carteiras frias podem
utilizar a chave de visualização para verificar que fundos foram recebidos, e
ainda assim manter sua chave secreta de gasto guardada em segurança. Da
mesma forma, desenvolvedores podem construir sistemas capazes de
detectar e tomar ações com base em pagamentos recebidos sem precisar ter a
habilidade de mover os fundos.

Essa característica é especialmente valiosa para instituições de caridade que


podem compartilhar suas chaves de visualização para garantir transparência
e prestação de contas em relação às doações. Se você enviar uma doação a
um endereço público, poderá usar a chave de visualização para certificar-se
que a instituição de caridade recebeu seus fundos.

Por exemplo, considere o endereço de doação do Fundo Geral do Monero:


44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaB
YBb98uNbr2VBBEt7f2wfn3RVGQBEP3A.
Uma vez que os endereços sigilosos previnem que o endereço público seja
gravado ou pesquisado na blockchain, a comunidade também disponibiliza a
chave de visualização
(f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c38950
1) para que as pessoas possam revisar as atividades relacionadas às doações.

E dado que qualquer um com a chave de visualização consegue ver a


quantidade total de moneroj que uma carteira recebeu, uma instituição de
caridade transparente que tenha recebido 100 XMR não poderá desviar 90
XMR e alegar que recebeu somente 10 XMR. Essa funcionalidade é
especialmente valiosa para casos de financiamento coletivo onde uma certo
valor em doações precisa ser atingido.

A impossibilidade de ver transações de saída em uma carteira somente


leitura é uma característica, e não um bug! Se transações de saída fossem
públicas, elas revelariam qual saída já foi gasta. Isso seria muito
problemático, já que as assinaturas em anel dependem do estado de
ambiguidade “gasto ou não gasto”. Suponha que uma instituição de caridade
revele quando uma saída é gasta; todas as aparições dessa saída em
assinaturas em anel, futuras ou passadas, poderiam ser identificadas como
chamarizes. Assim, é necessário que transações de saída não sejam expostas
para manter a integridade da privacidade geral da rede.

A característica de carteiras somente leitura do Monero poderá ainda ser útil


como uma proteção contra regulamentações que tentem bani-lo em certas
jurisdições. Uma vez que usuários individuais do Monero podem optar por
compartilhar suas chaves privadas de visualização, eles poderiam também
escolher fornecê-las a auditores para verificarem seus fundos. Tal
possibilidade seria uma maneira sensata de satisfazer auditores e como
resultado, afastar as preocupações de que o Monero são poderia funcionar
dentro dos paradigmas das estruturas financeiras atuais.

5.3.3 Geração de endereços


Um endereço padrão da carteira Monero é composto por duas chaves
públicas (a chave pública de gasto + chave pública de visualização)
derivadas na última seção. Ele também contém uma verificação e um byte da
rede que identifica tanto o tipo da rede quanto o tipo do endereço. ####
5.3.3.1 Byte da rede

O byte da rede é utilizado para diferenciar entre várias criptomoedas e redes.


Moedas CryptoNote especificam os valores apropriados no arquivo
src/CryptoNote_config.h, por exemplo:
uint64_t const CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 18;

A rede principal do Monero utiliza o “18” para indicar um endereço primário


(por isso o endereço primário do Monero começa com um “4”, que é sua
representação ASCII). Os desenvolvedores do Monero utilizam também as
redes testnet e stagenet, que possuem bytes próprios e únicos:

Nome Valor do código Valor ASCII


Endereço primário da rede principal 18 4
Subendereço da rede principal 42 8
Endereço primário da rede testnet 53 9
Subendereço da rede testnet 63 B
Endereço primário da rede stagenet 26 5
Subendereço da rede stagenet 36 7

5.3.3.2 Chaves públicas concatenadas

As chaves públicas de gasto e de visualização são concatenadas e anexadas


ao byte da rede para produzir o endereço cru (tudo com exceção da soma de
verificação). Embora este ainda seja um formato cru, ele contém todas as
informações das chaves: chaves para criar transações e metadados da rede
para garantir que as transações sejam anunciadas para a rede correta.

5.3.3.3 Soma de verificação

Já que transações Monero são irreversíveis, é crucial que os pagamentos


sejam enviados ao endereço certo! Para ajudar a evitar erros e pequenos
equívocos, o endereço inclui uma soma de verificação. Assim, se o
remetente cometer um erro de digitação ou não inserir o endereço completo,
a soma de verificação não irá corresponder, indicando que o texto inserido
não é um endereço válido.

Essa soma de verificação é gerada usando o hash Keccak das informações do


endereço coletadas na seção anterior. A saída do hash é reduzida aos
primeiros 4 bytes e utilizada como verificador.

5.3.3.4 Colocando tudo junto: finalização do endereço

Por fim, o byte da rede, as chaves e a soma de verificação são concatenados


de acordo com a especificação Monero:

Tamanho
Índice Descrição
em bytes
0 1 identifica o tipo da rede e o tipo do endereço – “18” para
a mainnet e “53” para a testnet (na base-58, “4” e “9”
respectivamente)
1 32 chave pública de gasto
33 32 chave pública de visualização
64 4 soma de verificação (hash criado com a função Keccak
dos 65 bytes anteriores, reduzido aos 4 primeiros bytes)

Finalmente, essa saída com 69 bytes é codificada para o formato base-58 do


Monero. A conversão aumenta o comprimento para uma sequência com 95
caracteres que é fácil de ler e escrever. E isso é tudo! Os endereços primários
do Monero simplesmente contém:

[byte da rede + chave pública de gasto + chave pública de visualização +


soma de verificação]

Exemplo de um endereço padrão:


4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9sgho
pxXgQSh1RTd54JdvvCRsXiF41xvfeW5

O pseudocódigo abaixo descreve o processo de geração de um endereço


público, usando Hs() para representar a função hash Keccak e “||” para
representar a concatenação de sequências de caracteres.
Soma de verificação = Hs(Varint(Prefixo) || chave pública de
gasto || chave pública de visualização)
SequênciaDeCaracteresSerializada = Base58(Prefixo || chave
pública de gasto || chave pública de visualização || soma de
verificação)

O Capítulo 7 inclui códigos reais em Python para você gerar chaves e


endereços sozinho!

5.3.4 Subendereços
A privacidade nas transações Monero é atingida por três construções
principais: assinaturas em anel, endereços sigilosos (de uso único) e RingCT.
Juntas, elas mitigam o risco das transações serem associadas ao analisar-se
dados da blockchain. Entretanto, deve-se considerar os riscos de associações
“fora da blockchain” (em outras palavras, informações coletadas de outras
fontes que não seja a blockchain em si).

Por exemplo, imagine que seu endereço primário tenha recebido pagamentos
de várias pessoas diferentes. Graças à tecnologia de endereços sigilosos do
Monero, seu endereço público nunca é explicitamente armazenado nas
transações, então ninguém pode associar essas transações ao analisar a
blockchain (incluindo quem lhe enviou). Porém, essa privacidade
criptográfica é inteiramente contornada se dois dos seus pagadores
comunicarem-se um com o outro e descobrirem que eles têm enviado
moneroj para o mesmo endereço!

Você pode evitar esse risco gerando múltiplos subendereços e


compartilhando um único com cada pessoa que lhe for enviar moneroj. Os
subendereços são derivados a partir das mesmas chaves que seu endereço
primário, então fundos recebidos por qualquer subendereço são transmitidos
para o saldo da mesma carteira. Entretanto, é impossível associar os vários
subendereços criptograficamente, ou seja, várias pessoas enviando moneroj
para a mesma carteira não conseguem reconhecer que eles pertencem a
mesma pessoa ao comparar suas listas de endereços.

5.3.4.1 Criando um subendereço


Lembre-se que cada carteira têm dois pares de chaves. A chave privada de
visualização (pV0) e a chave privada de gasto (pS0) são mantidas em
segredo, enquanto que a chave pública de visualização (PV0) e a chave
pública de gasto (PS0) são codificadas em cada endereço. Conforme
discutido, as chaves públicas são geradas multiplicando-se as chaves
privadas pelo ponto gerador (G) na curva elíptica, por exemplo (PV0, PS0) =
(pV0, pS0)G.

Sua carteira pode criar um grande número de subendereços, cada um com


um índice “i” diferente (geralmente partindo-se de i = 1). Cada subendereço
terá seu próprio conjunto de chaves para cada índice, com chaves privadas
(pVi, pSi) e públicas (PVi, PSi) únicas.

A fórmula para criar uma chave pública de gasto para o iº subendereço é:


PSi = Hs(pV0||i)G+PS0

O processo tem início concatenando-se o índice “i” com a chave privada de


visualização do endereço primário (pV0) e passando o resuldado através da
função hash_to_scalar (nota: na prática, a carteira cliente de referência
também concatena a sequência de caracteres SubAddr aos dados, como um
“sal” para o hash). O escalar resultante é multiplicado pelo ponto gerador da
curva e adicionado à chave de gasto do endereço primário através da adição
de ponto em curvas elípticas.

A chave pública de gasto desse subendereço é multiplicado pela chave


privada de visualização do endereço primário para retornar a chave pública
de visualização do subendereço:
PVi = pV0*PSi

As chaves públicas do subendereço são codificadas no endereço público


seguindo a mesma convenção dos endereços primários:
Subendereço_i = base58(byte da rede || PSi || PVi || soma de
verificação)

Porém, o byte da rede mainnet para subendereços é 0x42, por isso todos eles
começam com o dígito “8”.
5.3.4.2 Enviando para um subendereço

É crucial que esse primeiro identificador da rede seja diferente, já que


transações para subendereços precisam ser construídas de forma
ligeiramente diferente do normal.

Quando estão construindo uma transação, normalmente as carteiras geram


32 bytes aleatórios para servir como chave privada. Quando estão enviando
para um endereço primário, essa chave aleatória é multiplicada pelo ponto
gerador na curva elíptica através da multiplicação escalar em curvas elípticas
para retornar a chave pública da transação. Entretanto, quando estão
enviando para um subendereço, a chave privada da transação é, em vez
disso, multiplicada pela chave pública de gasto do subendereço do
destinatário.

5.3.4.3 Recebendo em um subendereço

Devido à natureza ofuscada da blockchain do Monero, as carteiras precisam


escanear toda transação para determinar se ela pertence ou não ao dono da
carteira. Para determinar se uma saída X (com chave pública da transação R)
foi enviada ao endereço primário, a carteira verifica alguns cálculos
baseados na sua chave pública de visualização e chave pública de gasto. Se a
igualdade X==Hs(pV0*R)G+PSi for verdadeira, então aquela saída pode ser
desbloqueada e gasta!

Entretanto, o processo é ligeiramente diferente para verificar quais saídas


pertencem aos subendereços. O cálculo é praticamente igual, exceto que o
termo hash_to_scalar é subtraído da saída e comparado com as chaves
públicas de gasto do subendereço. A carteira sabe que encontrou uma saída
que lhe pertence se a igualdade PSi==X-Hs(pV0*R)G for verdadeira.

5.3.5 Outros métodos para derivação de chaves


Para aumentar a confusão, atualmente existem pelo menos 3 métodos
diferentes de derivação das chaves privadas utilizados no Monero (isso
também é verdade para o Bitcoin). Estes métodos variam em poucas
questões “chaves”:
Original (estilo não determinístico): As chaves privadas de gasto e de
visualização para criar uma conta são escolhidas aleatoriamente e de
forma independente. Não existe uma forma melhor de fazer backup de
uma conta não determinística senão manter cópias de cada arquivo.
Devido a melhores alternativas, esse método complicado não é mais
recomendado.

Mnemônico (estilo determinístico ou “Electrum”): Neste estilo, todas


as chaves são derivadas a partir de uma única chave privada de gasto,
também chamada de semente. A chave privada de visualização é
derivada calculando-se o hash Keccak-256 da chave privada de gasto
para produzir um escalar EdDSA válido. Essas contas são fáceis de
fazer backup já que você só precisa escrever e armazenar a semente
(que geralmente é expressa na forma de uma frase mnemônica na base-
1626).

Estilo MyMonero: A família de carteiras MyMonero utiliza um


método similar à convenção Electrum, porém, a frase da semente
contém 13 palavras ao invés das 25 habituais. As 13 palavras são
convertidas em um inteiro de 128 bits que é usado para deviração tanto
das chaves de gasto quanto das chaves de visualização. O inteiro da
semente é executado através do hash Keccak-256 e convertido para
formar a chave privada de gasto. Essa chave privada de gasto é
novamente executada através do hash Keccak-256 e convertida para
formar a chave privada de visualização.

Você deve ter notado uma diferença importante entre os estilos das sementes
MyMonero e Electrum. O estilo MyMonero cria a chave privada de
visualização calculando o hash de um inteiro aleatório, enquanto que o estilo
Electrum calcula o hash da chave privada de gasto. Isso significa que as
sementes de 13 e 25 palavras não são compatíveis entre si – não é possível
criar uma conta no estilo Electrum que coincida com uma conta no estilo
My-Monero (ou vice-versa) porque o par de chaves de visualização sempre
serão diferentes.

5.4 As tecnologias de privacidade


5.4.1 Endereço sigiloso
O Capítulo 3 descreveu conceitualmente como endereços de uso único,
também conhecidos como endereços sigilosos, permitem que transações
sejam transmitidas à rede sem revelar o endereço real do destinatário. Essa
seção irá aprofundar na explicação criptográfica por trás dessa chave pública
de uso único.

5.4.1.1 Enviando

O protocolo CryptoNote calcula o endereço de uso único de destino de


acordo com a fórmula X=Hs(r*PV|i)G+PS. Vamos entender o significado
desses símbolos e como Maria poderia gerar um endereço de uso único
quando fosse enviar dinheiro a George.

A variável r é a chave privada da transação, que é um escalar


pseudoaleatório de 256 bits. Maria (o remetente) é a única pessoa que saberá
essa chave; até mesmo George (que é o destinatário) nunca saberá o número
aleatório que a carteira de Maria escolheu para r.

Maria então multiplica a chave pública de visualização de George, PV, por r


e depois anexa o índice da saída, i. Essa quantia (r*PV|i) é executada através
da função hash_to_scalar, Hs(). Essa função calcula o hash da entrada
usando o algoritmo Keccak-256, depois pega o hash resultante e calcula seu
módulo com o número primo 2^255 +
27742317777372353535851937790883648493.

O termo Hs(r*PV|i), calculado no parágrafo acima, é multiplicado pelo


ponto base Ed25519, G. Por fim, Maria adiciona essa quantia à chave
privada de gasto de George, PS, para produzir a saída final, X, que é o
endereço sigiloso.

Esse processo complicado permite que Maria esconda na blockchain a


transação para George, utilizando um endereço de uso único gerado
aleatoriamente que ninguém conseguirá associar a ele.

5.4.1.2 Recebendo
Tendo em conta quão bem Maria escondeu os moneroj que ela estava
enviando a George (escondido por uma chave privada da transação que nem
mesmo o George sabe), você deve estar se perguntando como ele poderá
achá-los!

Conforme descrito no Capítulo 3, George precisa escanear a blockchain para


identificar quais saídas pertençam a ele. Esse processo é bastante similar ao
método que Maria utilizou para gerar o endereço.

George pega a chave pública da transação, R, da blockchain e a multiplica


por sua chave privada de visualização, pV. Seguindo passos semelhantes aos
de Maria, George anexa o índice da saída, i, e depois aplica a função
hash_to_scalar ao termo (pV*R|i). Ele então multiplica o resultado por G e
adiciona sua própria chave pública de gasto, PS. Se esse valor corresponder
com a saída, então ela pertence a ele.

Em outras palavras, a carteira de George escaneia todas as transações na


blockchain para identificar saídas em que X=Hs(pV*R|i)G+PS.

5.4.2 Transações confidenciais em anel


Transações confidenciais em anel (RingCT) ocultam a quantidade de
moneroj enviados em uma transação. A RingCT foi implementada em
Janeiro de 2017 e tornou-se obrigatória em todas as transações a partir de
Setembro de 2017.

Somente transações que cunham novos moneroj na forma de recompensas


coinbase têm valores visíveis, não ocultados pela RingCT. Esta é uma
característica de auditoria que permite que qualquer participante da rede
conte e verifique exatamente quantos moneroj já foram gerados. Após a
emissão pública de moedas, essas transações são convertidas para saídas
RingCT antes de serem usadas novamente.

Todas as transações que não são coinbase fazem uso da RingCT para
criptografar o valor da transação. O valor de cada transação é criptografado
de duas formas diferentes, e ambas formas são incluídas na mensagem.
Primeiro, o valor é criptografado por uma chave derivada de informações
públicas presentes no endereço do destinatário. Essa versão é armazenada no
campo edchInfo e só pode ser descriptografada e lida pelo destinatário,
usando o segredo compartilhado da transação.

Em segundo lugar, o valor é integrado em um comprometimento de


Pedersen, permitindo que outros usuários do Monero verifiquem a validade
da transação por si mesmos. Ninguém consegue extrair o valor da transação
de um comprometimento de Pedersen, porém qualquer um pode inspecionar
o resultado e verificar matematicamente que as saídas são iguais às entradas.
Isso previne que transações tentem falsificar moneroj.

Existem dois aspectos principais para a verificação da RingCT:

1. O remetente prova, de forma verificável, que todas as saídas possuem


um valor positivo, usando para isso uma prova de intervalo. A prova de
intervalo demonstra que o número ocultado pode ser gerado como a
soma de potências de 2 positivas, sem revelar quais são essas potências.
Sem as provas de intervalo, um usuário trapaceiro com 5 XMR poderia
criar uma transação com um par de saídas contendo +13 XMR e -8
XMR.

2. O remetente também demonstra que as entradas são iguais às saídas, o


que não é trivial de se fazer dado que as assinaturas em anel contém
chamarizes para prevenir que a parte verificadora descubra a verdadeira
origem das entradas e dos fundos! Comprometimentos homomórficos
de Pedersen permitem que o remetente prove que uma das entradas
possíveis têm uma diferença menor que zero com as saídas, sem revelar
o valor no processo.

Para uma analogia mais simples, considere as seguintes equações de


exemplo. Assim como os valores ocultos nas transações, você pode verificar
se cada uma das equações são válidas ou não, sem precisar saber o valor de
A.
A = nossa saída, ninguém sabe o valor

5A + 1A + 4A = 10A VERDADEIRO! Verificado, mesmo sem conhecer o


valor de A

6A + 4A + 2A = 14A FALSO! Não verificado, rejeitado!

5.4.3 Assinaturas em anel


O Monero utiliza a tecnologia de assinatura em anel para proteger a
privacidade de todos remetentes de transações. Uma assinatura em anel é um
tipo de assinatura criptográfica que permite que um participante ativo assine
uma mensagem em nome de um grupo. A chave privada do signatário ativo
é misturada com informações das chaves públicas dos demais membros para
produzir uma única assinatura. Qualquer pessoa pode validar a mensagem
assinada usando as chaves públicas para verificar que um dos membros do
anel inicializou a assinatura, porém, é impossível determinar qual membro
contribuiu com a chave privada.

No contexto do Monero, a mensagem é uma transação autorizada pela


assinatura em anel. A saída que realmente está sendo gasta é a do verdadeiro
signatário e as chaves públicas das demais saídas (de transações passadas)
são misturadas na forma de signatários chamarizes. O verdadeiro signatário
e os signatários chamarizes são igualmente válidos matematicamente; a
assinatura em anel resultante não pode ser examinada criptograficamente
para determinar qual membro efetivamente inicializou a assinatura.
Consequentemente, nenhuma pessoa externa (incluindo o destinatário) pode
determinar qual das saídas referenciadas em uma transação foram realmente
gastas.

Cada assinatura em anel produz uma única imagem-chave que é derivada da


saída que está sendo gasta. Este é um processo criptograficamente seguro:
cada saída corresponde a uma única imagem-chave e produzir a imagem-
chave não revela o verdadeiro signatário no anel.

Quando o dono de uma saída a gasta em uma nova transação, a rede


armazena a imagem-chave que foi produzida pela assinatura em anel. Dado
que a rede não consegue identificar quais saídas estão gastas, ela mantém,
em contrapartida, a relação de quais imagens-chave estão gastas! Se o dono
tentasse, de forma fraudulenta, gastar a saída novamente, a mesma imagem-
chave seria produzida e assim a rede saberia que precisa rejeitar a transação.
Vamos aprofundar na matemática necessária para gerar uma assinatura em
anel. Ao longo deste exemplo, considere que HS seja uma função hash que
retorna escalares (no campo apropriado) e que HP seja uma função hash que
retorne pontos (no grupo apropriado da curva). Estamos propositalmente
evitando definir esses domínios e codomínios para não complicar tanto.
Considere que G seja um ponto fixo conhecido por todos.

Você irá assinar a mensagem da transação M com uma assinatura em anel.


Atualmente, o Monero requer onze membros no anel para cada assinatura,
porém, vamos considerar um exemplo simplificado com três membros no
anel. Você tem o par de chaves (pública e privada) para a saída que está
gastando e seleciona duas outras saídas (e suas chaves públicas) para
servirem como chamarizes. Naturalmente, a indexação dos membros do anel
deveria ser aleatória, já que a anonimidade criptográfica seria contornada se
o verdadeiro signatário sempre estivesse na posição número 1. Para o
exemplo simplificado com três membros no anel, suponha que sua carteira
tenha selecionado aleatoriamente a posição 2 para colocar a verdadeira
origem dos fundos.

Você extrai da blockchain as chaves públicas das saídas chamarizes (P1 e


P3), e você tem a chave privada (p2) e a chave pública (P2 = p2G) da saída
que está gastando. Você começa escolhendo um número aleatório u, que será
descartado posteriormente. Primeiro você forma o seguinte compromisso,
começando pelo índice imediatamente após ao que você selecionou para sua
chave:
c3 = Hs(M,uG,uHp(P2))

Para formar os comprometimentos restantes, você também escolhe os


números aleatórios s3 e s1 que serão usados posteriormente:
c1 = Hs(M,s3G + c3P3 , s3Hp(P3) + c3p2Hp(p2))

Note aqui que você está incluindo várias informações: a chave pública P3
que você pegou na blockchain, o número aleatório s3 que você inventou, o
compromisso anterior c3 e o valor p2Hp(P2) formado a partir da sua própria
chave. Você continua:
c2 = Hs(M, s1G + c1P1, s1Hp(P1) + c1p2Hp(P2))
Mas ainda não acabou! Para esconder onde sua verdadeira chave está, você
inteligentemente define que s2 = u – c2 p2. A assinatura que você envia para
a blockchain e para o mundo contém várias quantidades: (c1, s1, s2, s2, J),
onde J = p2Hp(P2) é a imagem-chave utilizada em cada compromisso. Nós a
renomeamos aqui para evidenciar o fato de que o público não sabe quais
informações foram usadas para gerá-la.

Aqui está o porquê isso é inteligente: ao definir s2 = u – c2 p2, você pode


reorganizar os termos de forma que u = s2 + c2 p2. Isso significa que o
público vê o primeiro comprometimento c3 que você fez como sendo:
c3 = Hs(M, s2G + c2P2, s2Hp(P2) + c2p2Hp(P2))

Isso se parece exatamente igual aos demais compromissos! Embora você


nunca transmita u, ele é usado de forma inteligente para fazer com que todos
compromissos pareçam idênticos aos olhos de observadores. Este é o poder
da assinatura em anel. Ninguém consegue determinar qual compromisso
esconde sua chave verdadeira, mas todo mundo consegue verificar
matematicamente que:

o remetente conhecia uma das chaves privadas representadas pelas


chaves públicas
o imagem-chave foi calculada corretamente

Observe que a imagem-chave J = p2Hp(P2) foi exclusivamente calculada a


partir do par de chaves da verdadeira saída, sem qualquer número aleatório
ou chaves públicas de chamarizes. Assim, qualquer tentativa fraudulenta de
gastar a saída uma segunda vez irá gerar uma imagem-chave idêntica. Uma
vez que a rede armazena quais imagens-chave já foram usadas, qualquer
tentativa de reutilizar saídas é facilmente detectada e rejeitada.

Note que o exemplo acima de uma assinatura em anel no estilo LSAG foi
mostrado com propósito educativo e não deve ser utilizado como referência
para nenhuma implementação em produção.

5.4.4 Recursos adicionais


Se você deseja se aventurar ainda mais nos cálculos por trás dessas
tecnologias, confira o livro “Zero to Monero”, de Alonso, K.M. e Koe. O
livro é um guia altamente técnico e matemático que também está disponível
na forma de um PDF gratuito financiado pela comunidade.

5.5 A blockchain do Monero


Agora, você já está familiarizado com a importância e a utilidade das
blockchains como registros públicos distribuídos. Esses blocos são
estruturados e ordenados em um banco de dados imutável que só aceita
adições, protegidos por ferramentas criptográficas que previnem quaisquer
manipulações ou fraudes. A blockchain do Monero é única e discutiremos
suas tecnologias e especificações nesta seção.

5.5.1 Lightning Memory Mapped Database


O Monero utiliza o sistema Lightning Memory Mapped Database (LMDB)
para armazenar sua blockchain. LMDB é uma biblioteca de software que
fornece um banco de dados transacional embutido e de alta performance na
forma de um banco de dados chave-valor. Isso significa que ele é altamente
eficiente e fácil de procurar.

O LMDB é escrito em C++ com conexões via API para várias linguagens de
programação e foi desenvolvido pela Symas Corporation. Aqui estão
algumas características do LMDB:

Armazenamento de pares chave/dados arbitrários como arrays de bytes


Capacidade de pesquisa baseada em intervalos
Suporte para uma única chave com múltiplos itens de dados
Métodos avançados para anexar registros ao final do banco de dados,
resultando em considerável aumento de performance quando
comparado a bancos de dados similares

5.5.2 A estrutura de um bloco


O padrão CryptoNote define especificações para armazenar e delimitar
dados dentro de blocos e na blockchain. A estrutura do bloco contém três
componentes principais:

O cabeçalho do bloco
A transação base
Uma lista de identificadores de transações (hashes das transações
mineradas no bloco)

5.5.2.1 O cabeçalho do bloco

Cada bloco começa com um cabeçalho que contém metadados importantes.


O campo “major_version” define as regras de análise do cabeçalho para que
ele seja interpretado corretamente. O campo “minor_version” define os
detalhes da interpretação que não estão relacionados com a análise principal
do cabeçalho.

Mesmo se a versão secundária for desconhecida, sempre será seguro analisar


o cabeçalho de um bloco para uma versão principal em particular. Analisar o
cabeçalho do bloco com uma versão principal desconhecida é arriscado, já
que o conteúdo do cabeçalho do bloco pode ser mal interpretado.

Campo Tipo Conteúdo


major_version varint Versão principal do cabeçalho do bloco
minor_version varint Versão secundária do cabeçalho do bloco
timestamp varint Data de criação do bloco (horário UNIX)
prev_id hash Identificador do bloco anterior
nonce 4 Qualquer valor que é utilizado no algoritmo de
bytes consenso da rede

5.5.2.2 Transação base

Todo bloco válido contém uma única transação base que direciona a
recompensa coinbase para o minerador. Essa transação base deve seguir as
regras de emissão de moeda e incluir o campo da altura do bloco.

5.5.2.3 Lista de identificadores de transações


Campo Tipo Conteúdo
version varint Versão do formato da transação
unlock_time varint Horário UNIX
input_num varint Número de entradas. Sempre 1 para transações base
input_type byte Sempre 0xff para transações base
height varint Altura do bloco que contém a transação
output_num varint Número de saídas
outputs array Lista de saídas em forma de array

A transação base é seguida por uma lista de identificadores de transações.


Esses identificadores são calculados pegando o hash Keccak do corpo da
transação. A lista começa com a quantidade de identificadores e é seguida
pelos identificadores em si (se o bloco não estiver vazio).

5.5.2.4 Cálculo do identificador do bloco

O identificador de um bloco é produzido calculando-se o hash Keccak-256


dos seguintes dados:

tamanho do block_header
block_header
hash da Merkle root
número de transações (varint)

O hash da Merkle root “anexa” as transações referenciadas no corpo do


bloco ao cabeçalho do bloco: uma vez que o hash da Merkle root é fixado, as
transações não podem ser modificadas. Essa característica de segurança
mantém as blockchains seguras contra manipulação ou qualquer tipo de
modificação retroativa.

5.5.3 A economia da mineração


Recompensas do bloco e taxas foram mencionadas de forma conceitual nos
Capítulos 2 e 4. Agora, você irá realmente aprender sobre a complexidade do
tamanho de bloco, das recompensas e sua relação com a taxas.
5.5.3.1 Recompensa coinbase da mineração

Conforme discutido no Capítulo 4, todos moneroj são originados na forma


de recompensas pagas aos mineradores por completarem blocos com
sucesso. O tamanho desse pagamento coinbase depende a oferta atual (A) e
o número inicial de unidades atômicas (S = 264 – 1). Uma unidade atômica é
a menor divisão de Monero reconhecida atualmente pela rede (1x10^-12
XMR):
Recompensa base = 2 * ((S – A) * 2-20 * 10-12)

O Monero possui uma emissão em cauda, que é uma pequena recompensa


fixa que continuará existindo mesmo após a maior parte da oferta ter sido
minerada. A recompensa base mínima do Monero é 0,6 XMR por bloco,
assim os mineradores nunca terão que subsistir somente das taxas.

5.5.3.2 Tamanho de bloco dinâmico

O Monero possui um tamanho de bloco dinâmico, possibilitando ajustes


contínuos conforme a rede cresce, em contraste com muitas criptomoedas
que utilizam um tamanho de bloco estático (fixo). Por exemplo, o tamanho
de bloco inicial do Bitcoin fixo em 1 MB gerou problemas de escalabilidade
ao limitar o número de transações que poderiam ser incluídas em cada bloco
(consequentemente limitando o volume total de transações na rede). Em
2017, esse gargalo resultou em períodos com taxas extremamente altas e
atrasos no processamento das transações. Várias soluções foram propostas e
apresentadas, resultando em um período de debates contenciosos.

Para evitar esses problemas, o Monero utiliza um mecanismo com tamanho


de bloco dinâmico que permite que os mineradores utilizem blocos maiores
para acomodar o aumento de tráfego na rede. Porém, se o tamanho de bloco
fosse mantido sem quaisquer restrições, a rede Monero estaria vulnerável a
ataques de spam, por exemplo, quando várias pequenas transações são
enviadas com o objetivo de exaurir a rede e os recursos de armazenamento,
fazendo com que a blockchain expanda muito rapidamente.

Para impedir o crescimento excessivo do tamanho de bloco, o protocolo de


mineração do Monero inclui uma função de multa que reduz a recompensa
coinbase em blocos acima do tamanho “normal”. Os autores do CryptoNote
original incluíram essa regra de consenso para limitar a taxa de expansão do
tamanho de bloco e evitar uma rápida sobrecarga da blockchain.

Se um bloco é minerado com tamanho (B) maior que a mediana dos últimos
100 blocos, parte da recompensa base é retida, de acordo com a fórmula:
Multa = RecompensaBase * ((B / MN) – 1)2

Os mineradores recebem a recompensa completa para qualquer tamanho de


bloco até 300 kB; para qualquer bloco maior, a função de multa “entra em
vigor”. O tamanho máximo de bloco é 2 * MN, ponto no qual a recompensa
coinbase é retida por completo.

5.5.3.3 Taxas

Quando o volume de transações está baixo e o tamanho de bloco pequeno, os


mineradores são recompensados com a coinbase completa e as taxas são
mínimas.

Entretanto, imagine um cenário diferente: O que acontece se a mediana do


tamanho dos últimos 100 blocos crescer mais que o tamanho de bloco sem
multa (300 kB)? Se isso acontecer, o algoritmo de taxas dinâmicas entra em
cena!

As taxas são calculadas com base no peso em kB das transações. Transações


maiores (“mais pesadas”) implicam em uma taxa maior. O cálculo da taxa
dinâmica é complexo, pois leva em consideração vários fatores do
ecossistema do Monero e a prioridade da transação (o remetente pode
incentivar os mineradores a incluírem mais rapidamente uma transação
urgente se optar por uma taxa maior). As taxas necessárias para ser
competitivo em um bloco próximo são calculadas de acordo com a
expressão:
Taxa por kB = (R/R0) * (M0/M) * F0 * (60/300) * 4

R é a recompensa base
R0 é recompensa base de referência (10 XMR)
M é o limite do tamanho de bloco
M0 é o limite mínimo do tamanho de bloco (300 kB)
F0 é 0,002 XMR
60/300 é o fator de ajuste para levar em conta o aumento no limite do
tamanho de bloco sem multa (ajustado de 60 kB para 300 kB em 2017)
4 é o fator de ajuste para levar em conta o multiplicador da taxa padrão
(o menor nível de taxa utiliza um multiplicador de x1 e uma transação
com prioridade normal utiliza x4)

Assim, as taxas levam em consideração o aumento da mediana do tamanho


de bloco em relação ao tamanho mínimo de bloco. Por exemplo, um
tamanho de bloco de 600 kB (duas vezes o mínimo) reduz as taxas pela
metade.

Idealmente, um aumento na taxa de câmbio e uso do Monero resultaria em


uma redução das taxas absolutas (por exemplo, em termos de XMR). Esse
mecanismo de redução das taxas tem menos efetividade durante aumentos
radicais de preço que sejam desproporcionalmente maiores que o aumento
no volume de transações (e consequentemente, tamanho de bloco).

O algoritmo de taxas dinâmicas foi projetado para funcionar quando a


mediana do tamanho de bloco permanece acima de 300 kB
consistentemente. Embora o sistema tente levar em consideração do aumento
de preço, o uso não é perfeitamente correlacionado ao preço, não sendo deste
modo um indicador perfeito.

5.5.4 Bulletproofs
Bulletproofs são uma nova característica que reduzem drasticamente o
tamanho das transações, que por sua vez reduzem as taxas gerais por
transação! As transações do Monero costumavam ser bastante grandes
(geralmente > 12 kB), assim, as Bulletproofs foram uma melhoria muito
aguardada.

As características de privacidade do Monero necessitam de vários “testes”


complexos durante a validação de transações para prevenir abusos e spam.
Isso inclui a verificação dos valores ocultados, das taxas e a confirmação de
que nenhum gasto duplo está ocorrendo.
Muitos desenvolvedores já se depararam com erros de “transbordo”, que
ocorre quando uma operação cria um valor fora do limite que pode ser
representado. Infelizmente, “infinito” é um conceito abstrato para a
computação, que muitas vezes encontram obstáculos ao trabalhar com
número grandes.

Uma vez que a RingCT oculta o valor das transações, cálculos complicados
são necessários para verificar se as entradas correspondem as saídas. As
propriedades algébricas úteis dos comprometimentos são valiosas por
permitirem transações ocultadas cuja validade pode ser confirmada por
qualquer participante.

Contudo, é igualmente importante garantir que os valores sejam positivos e


não causem um erro de transbordo. E é aqui que as provas de intervalo
entram, permitindo que qualquer um verifique que um comprometimento
representa uma quantidade dentro de um intervalo especificado, sem revelar
nada mais sobre seu valor. Cada prova de intervalo costumava ocupar ~7 kB,
assim, elas correspondiam a maior parcela do tamanho da transação. A
maioria das transações possui duas saídas (o endereço de destino e o troco),
necessitando pelo menos ~12 kB.

As Bulletproofs aplicam alguns truques matemáticos inteligentes para


construir a prova de intervalo usando um mecanismo mais eficiente. Isso
reduz o tamanho de uma única prova de intervalo para ~2 kB!

Antes das Bulletproofs, transações com múltiplas saídas requeriam múltiplas


provas de intervalo separadas. Consequentemente, o tamanho da transação
subia linearmente conforme o número de saídas (por exemplo, 1 saída = 7
kB, 2 saídas = 14 kB). Com as Bulletproofs, em contrapartida, o tamanho da
transação sobe em escala logarítmica conforme o número de saídas (por
exemplo, 1 saída = 2 kB, 2 saídas = 2,5 kB).

Ao reduzir o tamanho de cada prova de intervalo e permitir que elas sejam


combinadas de uma maneira mais eficiente, as Bulletproofs diminuem
drasticamente o tamanho das transações e consequentemente as taxas. As
Bulletproofs foram ativadas na atualização de rede do Monero (v0.13.0) em
Outubro de 2018, na forma de uma característica opcional que tornou-se
obrigatória na atualização subsequente.
5.6 Fungibilidade
Como você pode ver, o Monero utiliza diversos protocolos criptográficos
altamente sofisticados para proteger sua rede e aderir aos princípios
fundamentais de privacidade e descentralização. Com a ajuda do Laboratório
de Pesquisa do Monero e várias entidades de auditoria, o Monero continuará
a identificar e validar tecnologias criptográficas de ponta para torná-las o
mais rápido, seguro, privado e eficiente possível.

Uma das principais características do dinheiro é uma propriedade conhecida


como fungibilidade. Fungibilidade significa que uma unidade de valor é
igual a outra unidade de valor com a mesma quantidade. Um grama de ouro
é igual a um grama de ouro. Ou em nosso caso, um Monero é igual um
Monero. Os protocolos de encriptação utilizados pelo Monero tornam-o
fungível e permitem que ele alcance seu objetivo de ser dinheiro digital de
verdade.

Criptomoedas que são transparentes em sua camada principal (base layer)


não utilizam essas camadas de encriptação e, como resultado, não são
fungíveis. Uma moeda que pode ser rastreada até a darknet será manchada e
moedas que foram recém cunhadas ou vendidas em leilões por agências
governamentais poderão vender a um prêmio (mais caras). No caso de
criptomoedas transparentes, uma moeda não é igual a outra moeda com o
mesmo valor. Elas não são fungíveis. E isso é genuinamente problemático
para o objetivo de ser dinheiro digital.

Então, além dos protocolos sofisticados de encriptação do Monero manterem


boa segurança, privacidade e descentralização, eles também garantem a
fungibilidade, um componente essencial do dinheiro.
Capítulo 6
Comunidade e contribuição
O Projeto Monero é uma comunidade aberta e colaborativa, e contribuições
com códigos ou demais aspectos do ecossistema são bem-vindas. Esse
capítulo fornece uma visão geral sobre nossa estrutura descentralizada e
contém também dicas e links para quem quer começar a participar.

6.1 Cultura da comunidade


6.1.1 Princípios de transparência
Embora a criptomoeda Monero praticamente se resuma à privacidade, sua
comunidade é construída sobre os valores fundamentais da transparência e
da colaboração! Usuários, desenvolvedores e pesquisadores comunicam-se
abertamente em canais no IRC. Você também poderá encontrar uma
comunidade ativa de usuários e desenvolvedores Monero em outras
plataformas como Slack, Mattermost e Taiga. Reuniões importantes são
arquivadas no site oficial para acesso de todos.

Essa cultura de cooperação e transparência é uma consequência natural da


origem do Monero como um fork do código do Bytecoin. O desenvolvedor
do Bytecoin operava unilateralmente e de forma sigilosa, projetando e
tomando decisões sem ouvir os comentários e feedbacks da comunidade. Os
erros de desenvolvimento resultantes dessa atitude, especialmente a flagrante
pré-mineração, arruinaram a viabilidade da moeda.

A comunidade Monero surgiu a partir da separação do desenvolvimento do


Bytecoin por parte de uma comunidade descentralizada, colaborativa e
diversa. Isso, sem dúvida, fortaleceu o projeto em diversas frentes e fez com
que a comunidade Monero aprendesse a prosperar através da cooperação.
Enquanto a criptografia fornece elementos técnicos fundamentais para o
Monero, a comunidade é sua verdadeira fonte de poder!
6.1.2 Diversas mentes brilhantes trabalham no Monero
O Projeto Monero é um esforço comunitário massivo, coletivamente criado
por centenas de indivíduos de todas as partes do mundo. No momento em
que escrevo, mais de 500 pessoas contribuíram com código, incluindo 200
só no último ano. Dentre todas as criptomoedas, esse número de
contribuidores é liderado pelo Bitcoin e em seguida, Ethereum. O Monero
adotou um esquema de “não governança” para organizar seu crescimento e
desenvolvimento. O projeto é composto por várias frentes distintas que
trabalham juntas: a equipe core (Monero Core Team), o Laboratório de
Pesquisa Monero, os grupos de trabalho do Monero e a comunidade.

A Equipe de Desenvolvedores Core do Monero gerencia muitas das


atividades fundamentais do projeto. As funções mais importantes incluem:

Atuar como os árbitros confiáveis do Sistema de Financiamento


Coletivo em nome da comunidade.

Gerenciar o código-base do Projeto Monero, que inclui incorporar


códigos, manter backups e garantir a integridade, segurança e o livre
acesso ao código por qualquer pessoa.

Atuar como supervisores do fundo geral de doações, direcionando seus


recursos a iniciativas que favoreçam o Projeto Monero.

Atuar como signatários e distribuidores confiáveis do software Monero


e tecnologias relacionadas.

Trabalhar com a comunidade para discutir uma visão de futuro e o


roteiro do Projeto Monero.

O Laboratório de Pesquisa Monero (LPM) conduz análises e pesquisas


básicas e aplicadas de ponta sobre tecnologias para criptomoedas. O LPM é
composto por muitos acadêmicos e pesquisadores, e seus estudos são
publicados abertamente em https://web.getmonero.org/resources/research-
lab/ .
Os grupos de trabalho do Monero são colaborações formadas para reunir
pessoas em torno de objetivos únicos. Isso permite que pequenas equipes de
indivíduos se conectem para lidar com tarefas específicas. Por exemplo, o
grupo de trabalho de Hardware do Monero (Monero Hardware Workgroup)
está bem encaminhado em sua missão de projetar a primeira carteira de
hardware de código aberto e liderada pela comunidade; o grupo de trabalho
de traduções do Monero (Monero Localization Workgroup) já traduziu
códigos e conteúdos para dezenas de idiomas. Outra instância era o grupo de
Integrações Monero, que desenvolveu gateways de pagamentos de código
aberto. Você pode se unir a um grupo de trabalho para ajudar com traduções,
elaboração de material para reuniões e encontros ou prestar suporte aos
usuários com problemas de software.

No final das contas, é essa comunidade incrível que torna o Monero


possível! Qualquer um é bem-vindo para contribuir código, propor projetos,
financiar propostas, ajudar com divulgação ou escrever livros sobre o
Monero.

6.2 Cultura do código


6.2.1 Crie uma pull request com melhorias
Qualquer um é bem-vindo para contribuir com o código-base do Monero! Se
você tem uma correção ou alteração de código, sinta-se à vontade para
enviar uma pull request diretamente para a ramificação (branch) “master”.
Para modificar o código do Monero, siga este processo para editar sua cópia
e recomendar melhorias no repositório principal:

Realize o fork do repositório no GitHub


Clone o repositório em seu computador
Crie uma ramificação e implemente as mudanças necessárias
Realize o commit dos arquivos com uma mensagem clara e descritiva
Execute o comando git push origin nome-do-branch para
sincronizar as mudanças locais com seu fork no repositório
Crie uma pull request (incluindo documentação e descrições claras)
para submeter suas mudanças de volta ao repositório original
Suas modificações podem ser aprovadas rapidamente se a mudança for
relativamente pequena ou se não afetarem outras partes do código-base.
Contudo, mudanças que sejam particularmente grandes ou complexas
precisam ser extensivamente discutidas com a comunidade.

Quando for submeter uma pull request no GitHub, certifique-se que sua
ramificação está atualizada. Evite deixar commits de merge ou de outros
programadores perdidos na ramificação que irá submeter. Caso exista algum
conflito, talvez seja solicitado a você que realize o rebase (mesmo se o
conflito for fácil de resolver).

6.2.2 Etiqueta quanto aos patches


Idealmente, patches deveriam ser enviados na forma de pull requests,
seguindo o processo descrito acima. Se isso não puder ser feito, patches no
formato “git format-patch” podem ser enviados (por exemplo, poste no
fpaste.org com um tempo de expiração longo e depois compartilhe o link no
canal #monero-dev em irc.freenode.net).

Patches devem ser autocontidos. Uma boa regra geral é criar um patch
separado para cada problema, recurso ou mudança lógica. Siga o estilo de
código da porção que você está modificando e evite fazer alterações
desnecessárias, como mudanças nos espaços em branco ou indentação.
Sempre faça o squash apropriado (por exemplo, se um de seus patches
incluem um bug que é consertado em um patch subsequente, então ambos
patches precisam ser integrados).

6.2.3 Orientações gerais


Mensagens de commit precisam ser sensatas. A linha de assunto precisa
descrever o patch, podendo conter maiores detalhes, documentação, etc. no
corpo da mensagem. Para ajudar as demais pessoas a interpretar e interagir
construtivamente com seu código, é altamente encorajado que ele esteja bem
documentado. Se suas modificações adicionam novas funcionalidades, é
interessante que você inclua resultados de testes juntamente com sua pull
request.
Se você realizou mudanças aleatórias não relacionadas (incluindo aquelas
devidas a um editor cuidadoso demais), você pode selecionar quais
modificações incluir no commit usando git add -p, que percorre cada uma
das mudanças para confirmar quais devem ser incluídas. Isso ajuda a criar
patches limpos e sem mudanças irrelevantes. O comando git diff mostra
as mudanças em sua árvore, e git diff --cached mostrará as mudanças
que estão atualmente preparadas para realizar commit. Partes adicionadas
com git add -p serão “movidas” do resultado de git diff para o de git
diff --cached, então você poderá ver exatamente como seu commit ficará.

Orientações mais específicas no que diz respeito a processos comuns estão


descritas no repositório oficial do Projeto Monero.

6.2.4 Repositórios para o Monero


Diversos repositórios diferentes são hospedados no Projeto Monero e no
GitHub. Na verdade, existem mais de 23 repositórios no ecossistema do
Monero e 340 repositórios no tópico Monero. Muitos deles abrigam
componentes que já discutimos aqui em Mastering Monero, por exemplo:

Monero: o “core” da rede Monero que inclui a carteira Monero CLI,


escrita na linguagem C++
Monero-site: código-fonte do site https://getmonero.org
Monero-GUI: Interface Gráfica do Usuário para o software Monero,
construída com a biblioteca Qt
kastelo: a carteira de hardware da comunidade
kovri: o roteador de anonimato Kovri

Esses projetos são bem documentados para que você possa se familiarizar
com o código e sugerir melhorias! Existem muitos subprojetos com uma
variedade de oportunidades para você contribuir com o Monero. Por favor,
visite um dos repositórios, leia alguns problemas em aberto e pense como
você pode deixar seu legado no código-base do Monero.
$ Esse texto é um comando no terminal. Não execute esse comando
se você não sabe o que está tocando.
Nota: No momento em que escrevo, alguns componentes do ecossistema do
Monero estão mudando seus repositórios do GitHub para o GitLab.

6.2.5 Lista de e-mail de comunicados sobre o Monero (Monero-


announce)
Pode ser que a Equipe Core tenha que fazer um anúncio sobre um recurso
obsoleto do Monero ou simplesmente notificar que uma atualização de rede
foi feita com sucesso. Para isso, existem listas de e-mail que enviam
comunicados importantes sobre o software e a rede Monero. Qualquer
pessoa que esteja interessada em se envolver com a comunidade Monero ou
queira permanecer informada sobre atualizações é convidada a inscrever-se
na lista de e-mail: https://lists.getmonero.org/postorius/lists/monero-
announce.lists.getmonero.org/ .
6.3 Introdução ao desenvolvimento do
Monero
Gerar o código do Monero é um processo complexo, por isso, algumas dicas
e resumos foram incluídas aqui. Sistemas Linux possuem um shell integrado
que ajuda no processo de geração do Monero core, então, se possível,
considere trocar para um sistema operacional Unix. O Monero está escrito
em C++ com padrão de linguagem C++11.

6.3.1 Baixando o código-fonte do Monero


O Monero utiliza Git para controle de versão; esse sistema permite que os
desenvolvedores acompanhem mudanças e modificações em seu código e
coordenem, de forma fácil, o trabalho realizado em arquivos compartilhados.
Para baixar o código do Monero, simplesmente execute:
$ git clone --recursive https://github.com/monero-project/monero

6.3.2 Dependências
Para gerar o software Monero a partir do código-fonte, as dependências da
tabela abaixo precisarão estar inclusas no PATH do seu sistema. Algumas
das bibliotecas também estão presentes nesse repositório (mascadas como
Fornecida (Vendored)). Por padrão, a geração utiliza a biblioteca instalada no
sistema e ignora as fornecidas na fonte. Porém, se uma biblioteca não for
encontrada no sistema, as fornecidas na fonte serão geradas e utilizadas.

. . .
GCC libunbound ldns
CMake libsodium expat
pkg-config libminiupnpc GTest
Boost libunwind Doxygen
OpenSSL liblzma Graphviz
libzmq libreadline pcsclite
6.3.3 Instrução de geração
O Monero utiliza o sistema de geração CMake e um arquivo de geração
padrão makefile que invoca comandos cmake, conforme necessário. Uma vez
que você tenha instalado as dependências, mude para o diretório raiz do
código-fonte e execute o comando make para iniciar a geração. O processo
poderá levar até uma ou duas horas. Quando o código tiver terminado de
gerar, você encontrará os binários do Monero na pasta build.

6.3.4 Solução de problemas de geração


Se você se deparar com erros, normalmente a saída indicará exatamente o
que deu errado. Alguns dos erros mais comuns para se verificar são:

Versão desatualizada da boost (talvez você precise instalar a versão


atual manualmente)
gcc/g++ desatualizada
libzmq3-dev faltando
libreadline-dev faltando
Erros do OpenGL

Você pode (opcionalmente) digitar make debug para compilar uma versão de
depuração. Existem muitas comunidades com informações para lhe ajudar a
solucionar problemas. Pesquisas em sites de busca usando os erros de
geração que você encontrou provavelmente lhe guiarão a uma solução ou a
pessoas que poderão ajudar.

6.3.5 Gerando a Interface Gráfica do Usuário do software


Monero
A interface gráfica do usuário (GUI) do software Monero é construída com
bibliotecas C++ e Qt. Ambas são necessárias para gerar a GUI com sucesso.
Com as dependências instaladas, você pode clonar e gerar a GUI com os
comandos:
$ git clone --recursive https://github.com/monero-
project/monero-gui
$ cd monero-gui
$ ./build.sh
Capítulo 7
Integração do Monero para
desenvolvedores
Esse capítulo cobre os padrões e protocolos que desenvolvedores podem
usar para interagir com o Monero e construir novas ferramentas. Primeiro, os
formatos OpenAlias e Monero URI são apresentados como formas efetivas
de comunicar endereços e outros detalhes importantes. O restante do
capítulo discute chamadas remotas de procedimento com exemplos de
integração usando C++ e Python.

7.1 OpenAlias: endereços convenientes em


texto (para humanos)
É extremamente complicado para qualquer pessoa ler ou memorizar
endereços de criptomoedas, a não ser que ela tenha memória fotográfica.
Endereços na vida real como “Rua Principal, 123” ou um e-mail como
“donate@masteringmonero.com” são muito mais fáceis de interpretar e
lembrar do que um endereço Monero, como por exemplo:
“45ttEikQEZWN1m7VxaVN9rjQkpSdmpGZ82GwUps66neQ1PqbQMno4
wMY8F5jiDt2GoHzCtMwa7PDPJUJYb1GYrMP4CwAwNp”.

Esses endereços de criptomoedas contém muitas informações, mas são


complexos demais para humanos. Na verdade, existe um trilema famoso
conhecido como “triângulo de Zooko” que descreve a dificuldade inerente
de se projetar sistemas de nomes que simultaneamente atendam três
critérios: segurança, descentralização e que “faça algum sentido para
humanos”.

O endereço Monero mostrado acima não faz nenhum sentido para humanos,
porém atende os outros dois critérios com sucesso. Endereços públicos do
Monero contém ao menos 95 caracteres, o que os tornam difíceis de ler e
impossíveis de memorizar. Certamente deve existir uma forma de simplificar
os destinos de pagamento!
A Equipe Core do Monero lançou o padrão OpenAlias para “contornar” o
triângulo de Zooko criando uma forma legível por humanos para comunicar
endereços. O padrão OpenAlias é um registro DNS de texto em um Nome de
Domínio Completamente Qualificado (Fully Qualified Domain Name
(FQDN), em inglês). Cada registro de texto só precisa conter duas
informações: o prefixo e o endereços de destino. Um par chave-valor
recipient_name também pode ser adicionado, mas ele é opcional.

Um registo de texto OpenAlias típico se parece com isso:


oa1:xmr

recipient_address=45ttEikQEZWN1m7VxaVN9rjQkpSdmpGZ82GwUps66neQ1P
qbQMno4wMY8F5jiDt2GoHzCtMwa7PDPJUJYb1GYrMP4CwAwNp

recipient_name=MoneroFFS

A porção “oa1:xmr” indica que o registro é baseado no OpenAlias Versão 1


e que o destino é um endereço Monero. Um nome para o destinatário pode
ser especificado, neste caso “MoneroFFS”.

Nome Tamanho Descrição


oa1: 4 O registro sempre começa com “oa1:”,
indicando que este é um registro OpenAlias
Versão 1. Se o prefixo não estiver presente, nós
ignoramos o registro, já que ele pode ser um
registro SPF ou alguma outra coisa que não nos
interessa.
symbol 3 O código da criptomoeda. Os códigos devem
seguir a norma ISO 4217: por exemplo, para a
criptomoeda Monero, o símbolo é xmr e para o
Bitcoin, o símbolo é btc.
recipient_address 17 + O endereço de destino. O formato é
= endereço; endereço recipient_address = seu_endereço; onde
+1 seu_endereço é seu endereço de criptomoeda.
Para o Monero, ele será uma sequência de 95
caracteres. Pares de chave-valor são separados
por ponto-e-vírgula e, opcionalmente, um
espaço para facilitar a leitura. Essa chave-valor
deve existir. O OpenAlias existe para associar
FQDNs a um “endereço” de qualquer tipo, que
é expresso neste valor.
recipient_name = 14 + Esta entrada não é necessária, embora seja útil
descrição; descrição para o propósito de confirmar o destinatário
+1 correto ou para oferecer ao usuário a opção de
adicionar uma nota ou nome à lista de
endereços.

O padrão OpenAlias é extensível para desenvolvedores, intuitivo para


usuários e interoperável entre sistemas de domínio centralizados e
descentralizados. O padrão pode ser utilizado com qualquer criptomoeda e já
foi implementado pelo Monero, Bitcoin (Electrum) e HyperStake.
Figura 7.1 – O termo legível donate.getmonero.org é revolvido pelo
servidor DNS, que retorna o endereço de destino
44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7Sq
SsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A.

7.2 Monero_URI: informações


convenientes em texto (para
computadores)
O padrão de Identificador Uniforme de Recurso do Monero (Uniform
Resource Identifier (URI), em inglês) descreve um formato para comunicar,
de forma inequívoca, campos de dados importantes para faturas e transações.
Esses URIs são especialmente úteis para fins comerciais, como a geração de
códigos QR para pagamentos, por exemplo.

A sintaxe URI do Monero segue a RFC 3986, e os espaços precisam ser no


formato x-www-urlencoded, na forma %20. O URI abaixo mostra um
exemplo de texto que codifica a requisição de um pagamento de 0,0413
XMR para o endereço 4BKq…feW5 para o “Livro Mastering Monero”.
monero:4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJ
XW9sghopxXgQSh1RTd54JdvvCRsXiF41xvfeW5?
tx_amount=0.0413&tx_description=Livro%20Mastering%20Monero

Parâmetro Tipo Descrição


address Texto O endereço em si
tx_payment_id Texto A ID do pagamento proposta para a transação (se
mencionada)
recipient_name Texto O nome do contato de destino proposto (se
mencionado)
tx_amount Float O valor proposto para a transação em unidades
atômicas
tx_description Texto Descreve a transação que deve ser inicializada

7.3 Monero RPC


Desenvolvedores integrando o Monero podem escolher entre utilizar a API
C++ do Monero (C/C++) ou a interface de chamadas remotas de
procedimento (RPC). Os métodos RPC podem ser acessados por qualquer
linguagem de programação que tenha o recurso de realizar requisições
HTTP, então aproveitaremos essa flexibilidade e incluiremos códigos de
exemplo para algumas das atividades mais comuns.

O daemon do Monero (monerod) é acessível via RPC para atividades


essenciais como verificar saldos ou enviar fundos. A carteira Monero RPC
(monero-wallet-RPC) permite que você gerencie todas as funções da carteira
através de chamadas JSON.

A RPC expressa as quantidades de Monero em “unidades atômicas”, que


referem-se a menor fração que uma moeda Monero é reconhecida pela
implementação atual do monerod. Você pode converter facilmente entre
formatos utilizando a notação:

1 XMR = 1x10^12 unidades atômicas

7.3.1 Inicialização e configuração (configurar e proteger)


Primeiro, execute a carteira Monero RPC especificando a porta e o caminho
do arquivo da sua carteira:
$ ./monero-wallet-rpc --rpc-bind-port 18082 --disable-rpc-login
--log-level 2 --wallet-file arquivo-da-sua-carteira --prompt-
for-password

Se você deseja utilizar um nó remoto, basta adicionar a flag --daemon-


addess seguida pelo endereço, por exemplo:

--daemon-address node.moneroworld.com:18089

Já que a monero-wallet-rpc não vincula seu endereço IP e porta por padrão,


você deve especificar --rpc-bind-ip seuIP para conectar-se remotamente.

Algumas medidas de segurança são recomendadas, já que colocar o sistema


em produção com uma interface RPC aberta é como ir a um safári sem
nenhuma proteção! Certifique-se de configurar um nome de usuário e senha
antes de expor seu nó. Se você seguir esses passos para configurar as
proteções adequadas, sua API estará segura.

A flag --restriced-rpc é extremamente útil para limitar os privilégios RPC


e evitar potenciais abusos. Por exemplo, o modo restrito garante que seu nó
não retornará dados sensíveis e privados via RPC, e previne que usuários
externos ativem a mineração em seus dispositivos.

7.3.2 Formato JSON RPC


JSON-RPC é um protocolo RPC leve e sem estado que utiliza o formato de
dados JSON RFC 4672. A especificação primariamente define diversas
estruturas de dados e as regras para processá-las. O protocolo é agnóstico ao
transporte, o que significa que ele funciona independentemente do
mecanismo de transporte utilizado. Assim, os mesmos conceitos podem ser
aplicados dentro de determinado processo, seja usando soquetes, conexões
HTTP ou qualquer outro meio de comunicação.

Para receber qualquer informação da carteira RPC, você deve enviar uma
mensagem pelo método POST. A API JSON-RPC aceita mensagens no
formato:
{ “jsonrpc” : versão , “method” : método, “params”: parâmetros,
“id”: id }

usando entradas descritas por:

Campo Descrição
version Versão do protocolo JSON-RPC (O Monero suporta a v2.0)
method Declara qual funcionalidade é chamada
params Especifica informações adicionais necessárias para o método
desejado
id Número para acompanhar as respostas (inteiros partindo do 0)

7.3.3 Exemplos de chamadas RPC


A RPC do Monero pode ser acessada diretamente de um terminal, como
mostrado nos exemplos a seguir. O site do Monero contém a documentação
completa descrevendo as especificações e todas as funcionalidades da
carteira RPC e do daemon RPC.

7.3.3.1 Obter saldo

O saldo da carteira pode ser requisitado pelo método getbalance:


$ curl -X POST 127.0.0.1:18082/json_rpc -d
'{“jsonrpc”:”2.0”,”id”:”0”,”method”:”getbalance”}' -H 'Content-
Type: application/json'

que retorna duas saídas: o saldo [total] e o saldo desbloqueado, que inclui
somente transações “profudas” o suficiente na blockchain para serem
consideradas “seguras” (por exemplo, confirmadas como disponíveis após 6
blocos).
{“id”: “0”,“jsonrpc”: “2.0”, “result”: { “balance”:
140000000000, “unlocked_balance”: 84000000000} }

Neste caso, a carteira contém 0,14 XMR e somente 0,084 XMR


desbloqueados.

7.3.3.2 Obter endereço

Para requisitar o endereço da carteira:


$ curl -X POST 127.0.0.1:18082/json_rpc -d
'{“jsonrpc”:”2.0”,”id”:”0”,”method”:”getaddress”}' -H 'Content-
Type: application/json'

que retorna:
{“id”: 0,“jsonrpc”: “2.0”,“result”: {“address”:
“42uMGYwvLuUGJzqdWZvr47CGCBz1qNNExZeegcjLPMbaFkBb3XG
g6Y1bUwaMbovzGWDXtaASxSBYtaiBB4wuDmrAMCygexH”, “addresses”: [{
“address”: “42uMGYwvLuUGJzqdWZvr47CGCBz1qNNExZeegcjLPMbaFkBb3XG
g6Y1bUwaMbovzGWDXtaASxSBYtaiBB4wuDmrAMCygexH”, “address_index”:
0, “label”: “Primary account”,“used”: false
},
{
“address”:
“894PaGJyxRjZU8nP7Dh4FuAyzr2dK3VT9ZZX95MxdAGP3HoHEpA
bNb8Htgp5LKzc1pXQ8zhpokTZtcUTnzeU823oUPUGSpv”,
“address_index”: 1,
“label”: “”,
“used”: false
},
]}}

7.3.3.3 Criar endereço

Para criar um novo endereço para uma conta. E opcionalmente, rotular o


novo endereço.
$ curl -X POST 127.0.0.1:18082/json_rpc -d
'{“jsonrpc”:”2.0”,”id”:”0”,”method”:”create_address”, “params” :
“{“account_index:0,”label”:”Secondary account”}}' -H 'Content-
Type: application/json'

que retorna:
{ “id”: 0, “jsonrpc”: “2.0”, “result”: {“address”:
“86KoCQsZHQvSUnp9fFn92e5QGUiZtH1qZ1nNx1Jv5eJs94ywbLR2k
11CjZTq5o4v8j9bx3CEAturCheJqJR7cYdQKT4xE3w”, “address_index”: 9
}}

7.3.3.4 Criar conta

Para criar uma conta:


$ curl -X POST 127.0.0.1:18082/json_rpc -d
'{“jsonrpc”:”2.0”,”id”:”0”,”method”:”create_account”, “params”:
{“label”:”Secondary account”}}' -H 'Content-Type:
application/json'

que retorna:
{ “id”: “0”, “jsonrpc”: “2.0”, “result”: {“account_index”: 1,
“address”:
“88bV1uo76AaKZaWD389kCf5EfPxKFYEKUQbs9ZRJm23E2X2oYgV9bQ54FiY6hAB
83aDXMUSZF6KWyfeQqzLqaAeeFrk9iic” } }

7.3.3.5 Transferir

Para transferir (enviar) uma quantidade de Monero, especificada em


unidades atômicas.
$ curl -X POST http://127.0.0.1:18082/json_rpc -d '
{“jsonrpc”:”2.0”, ”id”:”0”, ”method”:”transfer”, ”params”:
{“destinations”: [{“amount”:100000000,
”address”:”9wNgSYy2F9qPZu7KBjvsFgZLTKE2TZgEpNFbGka9gA5
zPmAXS35QzzYaLKJRkYTnzgArGNX7TvSqZC87tBLwtaC5RQgJ8rm” },
{“amount”:200000000,
”address”:”9vH5D7Fv47mbpCpdcthcjU34rqiiAYRCh1tYywmhqnE
k9iwCE9yppgNCXAyVHG5qJt2kExa42TuhzQfJbmbpeGLkVbg8xit”
}],”mixin”:4,”get_tx_key”: true}}' -H 'Content-Type:
application/json'

que retorna:
{ “id”: “0”, “jsonrpc”: “2.0”, “result”: { “fee”: 48958481211,
“tx_hash”: “985180f468637bc6d2f72ee054e1e34b8d5097988bb29a2e0cb
763e4464db23c”, “tx_key”:
“8d62e5637f1fcc9a8904057d6bed6c697618507b193e956f77c
31ce662b2ee07”, “amount”: 300000000, “tx_blob”: “”,
“tx_metadata”: “”, “multisig_txset”: “” } }

7.4 A integração do Monero na prática


(Tutoriais em Python e C++)
Escolher uma linguagem de programação para estes exemplos é complicado,
já que qualquer desenvolvedor sabe que não existe uma linguagem de
programação universal e perfeita. Todavia, o Python é bastante apropriado
para o livro Mastering Monero, já que ele é uma linguagem gratuita e de
código-aberto relativamente acessível e compreensível para iniciantes.

Os exemplos a seguir utilizam a versão mais recente, Python 3. A maioria


das distribuições Linux baseadas no Debian já possuem as versões Python 2
e Python 3 pré-instaladas. Antes de começar, atualize seus softwares e
sistema para garantir que os recursos necessários sejam os mais recentes:
$ sudo apt-get update && sudo apt-get -y upgrade

Os códigos para os tutoriais a seguir estão disponíveis gratuitamente em um


repositório público. Você poderá baixar os exercícios através do poderoso
sistema de controle de versão “git” utilizando o comando fornecido abaixo.
Cada tutorial está salvo em uma pasta. Por exemplo, a pasta do “Tutorial 1”
será tutorial-1. Para baixar os recursos pelo sistema de versão Git, basta
executar:
$ git clone https://github.com/monerobook/code

7.4.1 Tutorial 1 – Obter seu saldo


Esse programa irá conectar-se ao daemon via RPC, depois requisitar e
imprimir o saldo da conta. Você deve se lembrar da função getbalance
(também responde à get_balance) da seção que apresentou a RPC.

Começaremos importando duas bibliotecas do Python bastante úteis para


realizar requisições POST: requests e json.
# Mastering Monero Tutorial. This is a comment
import requests
import json

## Import Setup variables


## Url for JSON RPC interface. We assume that your RPC interface
is running on localhost port 18082
url = “http://localhost:18082/json_rpc”

## JSON headers . Required


headers = {'content-type': 'application/json'}

## RPC input . Adding method name , at the moment we don't need


variables.

rpc_fields = {
“method” : “get_balance”
}

Relembre os campos JSON padrão que devem ser incluídos em uma


chamada RPC:
# Adding the JSON RPC version and id. Id is a int variable which
should be incremented each request. First request is 0 , second
is one and ...

rpc_fields.update({“jsonrpc”: “2.0”, “id”: “0”})


Agora que tudo está preparado, só resta uma coisa a fazer! Enviar todas as
variáveis para a interface JSON-RPC utilizando o método POST HTTP:
# execute the rpc request
response =
requests.post(url,data=json.dumps(rpc_input),headers=headers)

# print the response as JSON


print(json.dumps(response.json()))

Salve todo o código acima como tutorial.py (ou qualquer nome que
queira) e execute:
$ python tutorial.py

Seu script deverá imprimir no terminal a saída da chamada getbalance:


{
“id”: “0”,
“jsonrpc”: “2.0”,
“result”: {
“balance”: 0,
“multisig_import_needed”: false,
“unlocked_balance”: 0 }
}

Embora a saída contenha todas as informações que precisamos, a sintaxe


RPC não está formatada para uma fácil leitura por humanos. Olhar para
muitos símbolos {} pode te deixar confuso depois de um tempo!

Para uma saída mais limpa, podemos adicionar algumas linhas de código ao
final do script do tutorial para que ele imprima somente o saldo (ou o saldo
desbloqueado, se preferir):
# Get the balance from response array and convert to a string.
balance = str(response.json().get('result').get('balance'))

print(“Balance is “ + balance )

Agora, executando:
$ python tutorial.py
Deverá retornar simplesmente:
Balance is 426700000

Você pode usar métodos RPC como esse para desenvolver seu próprio
cliente para a carteira Monero!

7.4.2 Tutorial 2 – Como gerar um endereço pseudoaleatório


No Capítulo 5, apresentamos o conceito de geração de endereços
pseudoaleatórios. Para complementar a explicação matemática, segue uma
implementação em Python para você acompanhar.

Primeiro, importe as bibliotecas necessárias e adicione-as à pasta (path).


# Import libraries. Hexlify for hex code, utils for the utility,
etc.
import os, sys
from binascii import hexlify, unhexlify
sys.path.append('../libraries')
import utils
import ed25519
import base58

Para programar a função generate_random_address, vários passos


precisarão ser executados:

1. Criar sua semente gerando um número de 32 bytes (256-bit) de forma


pseudoaleatória. Utilize a biblioteca hexlify para converter sua
semente em uma sequência em codificação hex e armazene-a na
variável seed.

2. Armazenar sua chave secreta de gasto reduzindo a semente para um


escalar válido na curva elíptica Ed25519. Sua chave secreta de gasto é
simplesmente a representação da sua semente. Essa verificação requer a
função sc_reduce32 da biblioteca utils.

3. Calcular sua chave secreta de visualização como sendo o hash reduzido


da chave secreta de gasto. A função hash_to_scalar executa o hash da
entrada, depois a converte para um escalar válido na curva elíptica
Ed25519.

4. Derivar as chaves públicas usando a função


publickey_to_private_key para multiplicar suas chaves privadas pelo
ponto gerador. Sua chave secreta de gasto produz sua chave pública de
gasto e, da mesma forma, sua chave secreta de visualização é usada
para derivar sua chave pública de visualização.

5. Começar a formar seu endereço concatenando o byte da rede (0x12


para os endereços públicos Monero), a chave pública de gasto e a chave
pública de visualização. Essas são as informações essenciais incluídas
em todos endereços Monero.

6. Calcular a soma de verificação que será anexada à sequência de


caracteres acima, pegando os 4 primeiros bytes (8 caracteres hex) de
seu hash Keccak-256.

7. Codifiquar as informações + soma de verificação em Base58 para uma


representação legível por humanos. E isso é tudo! Conforme discutido
no Capítulo 5, endereços Monero consistem de:

[byte da rede + chave pública de gasto + chave pública de visualização +


soma de verificação]
def generate_random_address():
## Generate 32 bytes (256 bits) of pseudo-random data
seed = hexlify(os.urandom(32))

## Reduce random data to make it a valid ed25519 scalar


secret_spend_key = utils.sc_reduce32(seed)

## Use a reduced hash of the secret spend key for the


deterministic secret view key
secret_view_key = utils.hash_to_scalar(secret_spend_key)

## multiply by the generator point to get public keys


from private keys
public_spend_key =
utils.publickey_to_privatekey(secret_spend_key)
public_view_key = utils.publickey_to_privatekey(secret_
view_key)
## the network byte, public spend key, and public view
key are all concatenated together
## 0x12 is the Monero mainnet network byte
network_byte = “12”
## Concatenate the three strings
data = network_byte + public_spend_key + public_view_key
hash = utils.keccak_256(data)
## checksum is the first 4 bytes (8 hex characters) of
the hash of the previous data
checksum = hash[0:8]
address = base58.encode(data + checksum)

## Printing the keys

print(“Secret_spend_key : “ + secret_spend_key)
print(“Secret_view_key : “ + secret_view_key)
print(“Public_spend_key : “ + public_spend_key)
print(“Public_view_key : “ + public_view_key)

## Returning address generated


return address

7.4.3 Tutorial 3 – Gerador de endereços “customizados”


Endereços “customizados” referem-se a endereços de criptomoedas que são
gerados para ter algum prefixo em particular que você escolhe. Se você quer
um endereço com a palavra “gato”, você pode usar esse método para gerar
um endereço público começando com “4gato”. Existem algumas limitações
devido ao formato do endereço Monero: você não pode remover o 4 inicial
(o byte da rede em codificação hex, 0x12) e a codificação Base58 exclui
alguns caracteres (I, l, 0, O).

Nunca confie em um site ou terceiro para gerar endereços customizados para


você. Não há nenhuma forma de saber se essas chaves foram geradas de
maneira segura ou se elas foram copiadas pelo serviço ou por um alguém.

Aqui está um script em Python que você pode verificar por si mesmo e usar
para gerar seus próprios endereços customizados em segurança. A
abordagem é simples: gerar endereços repetidamente até que um dos
resultados coincidam com seu critério. Recomenda-se usar textos curtos já
que o tempo necessário para gerar um endereço qualificado usando força
bruta aumenta drasticamente conforme o tamanho do texto desejado.
A maior parte do código está dentro de um while(1), um loop infinito que
será executado até que um endereço coincidente seja descoberto. Em cada
iteração no loop, o código chama a função generate_random_address do
exemplo anterior para gerar um novo endereço.

Assim que o endereço é criado, o script verifica se os primeiros caracteres


coincidem com o texto desejado pelo usuário. Quando um endereço
pertinente é descoberto, o script imprime tal endereço e finaliza, quebrando
o loop do while.
import sys
sys.path.append('../libraries')
import address

if (len(sys.argv) != 2):
print(“usage: python vanity_address.py
[desired_prefix]”)
exit()

if (sys.argv[1][0] != “4”):
print “Monero addresses must start with the character 4”
exit()

## create random addresses until one of them matches the desired


prefix
## bruteforcing takes a while
while(1):
rand_address = address.generate_random_address()
if (rand_address[0:len(sys.argv[1])] == sys.argv[1]):
print(rand_address)
exit()
else:
print(“searching”)

7.4.4 Tutorial 4 – Como criar um endereço sigiloso


O método para geração de um endereço sigiloso explicado no Capítulo 5 é
um tanto complexo, assim, incluímos uma implementação em Python para
servir de apoio. Programar todo o processo passo-a-passo pode ser muito útil
para interpretar e internalizar o conceito matemático.

O objetivo deste tutorial é gerar um endereço sigiloso usando: uma chave


pública de visualização, uma chave pública de gasto e uma chave privada da
transação aleatória (escalar de 256-bit).

Primeiro, as dependências necessárias são importadas da pasta de


bibliotecas:
import os, sys
# library for hex
from binascii import hexlify, unhexlify
sys.path.append('../libraries')
# utils and ed25519 libraries
import utils
import ed25519

A função generate_stealth_address é definida, encarregando-se das


operações matemáticas necessárias para criar o endereço não associável a
partir das chaves públicas e algumas informações aleatórias.
def generate_stealth_address(publicViewKey, privateTxKey,
publicSpendKey, index):

## multiply r*A
derivation = utils.generate_key_derivation(publicViewKey,
privateTxKey)

## concatenate index to derivation then hash and reduce


## Hs(rA|i)
scalar = utils.derivation_to_scalar(derivation, index)

## multiply by base point


## Hs(rA|i)G
sG = ed25519.scalarmultbase(utils.hex2int(scalar))
## interpret the public spend key as a point on the curve
pubPoint = ed25519.decodepoint(unhexlify(publicSpendKey))

## add the public spend key to the previously calculated point


## Hs(rA|i)G + B
output = ed25519.edwards(pubPoint, sG)
## convert the point to a hex encoded public key
return hexlify(ed25519.encodepoint(output))

O código por ser chamado dessa forma:


print(generate_stealth_address(“be90718b250a06b4bcffca6af948240a
d6d8951b730a9711f78d4c9decefb4bd”,
“12b793b002ed168f36c9dc8d13c0e820546359452f67136f03087eb18208710
e”,
“6b48d1c30a640b0b33d0062188df2edd4e6acac7282b215e86701a644a9f70b
a”, “01”))

Endereços sigilosos são gerados de forma não determinística, dado que


alguns dados aleatórios são misturados também. Por exemplo, uma saída
será parecida com isso:
a2bd788a63555e0847800b56051072db3558ac2f97b58b8021e57c67125b4411

7.5 API C++ do Monero


Embora interagir com o Monero através da interface RPC seja simples e
fácil de implementar, existem também algumas desvantagens. Você pode
gerar endereços e subendereços, e até transferir fundos. Contudo, os métodos
RPC não escalam de forma efetiva e podem gerar gargalos em grandes
aplicações empresariais.

Existe uma alternativa? Sim! O Monero possui uma API C++ que pode lidar
com todas as funcionalidades, incluindo gerenciar carteiras e enviar
transações.

A API C++ é um pouco mais complicada de usar do que a interface RPC,


então talvez você não queira “brincar” com ela em um ambiente de
produção, a não ser que você já esteja bastante familiarizado com integração
do Monero. Quaisquer erros ou problemas ao longo do caminho podem
prejudicar sua segurança e privacidade.

7.5.1 Bibliotecas do Monero


Monero Core é uma coleção de várias bibliotecas simples que são
necessárias ou úteis para atividades relacionadas ao Monero – como Boost,
Ed25519 e o algoritmo CryptoNight.

Elas foram reunidas para simplificar processos comuns para


desenvolvedores; por exemplo, um programador pode simplesmente chamar
base58_decode das bibliotecas do Monero Core ao invés de precisar criar a
função do zero.
Primeiro, você precisa compilar as bibliotecas do Monero Core. Uma vez
que uma biblioteca está compilada, um arquivo de saída é criado com a
extensão .a ou .so.

7.5.2 Primeiros passos com C++


Para integrar o código Monero Core, primeiramente você deve compilar suas
bibliotecas. Basta seguir as instruções abaixo e verificar a tabela de
dependências no Capítulo 6. Familiaridade com C++ (especialmente os
fundamentos do padrão C++11) será muito útil para acompanhar o tutorial.

7.5.3 Tutorial 5 – Recuperando todas as chaves a partir da


chave privada de gasto
Esse tutorial mostra como recuperar todas as chaves Monero a partir da
chave privada de gasto, utilizando a API C++ e o método CMake. Esse guia
é voltado para plataformas baseadas no Linux, já que Apple e Windows
implementaram suas próprias bibliotecas (por exemplo, OpenSSL ou Boost).

Primeiramente, configure todas as bibliotecas e variáveis do ambiente em


um arquivo chamado CMakeLists.txt. Nesse tutorial, compilaremos o
Monero Core na pasta /opt/monero.
cmake_minimum_required(VERSION 3.5)

set(PROJECT_NAME tutorial-5)

project(${PROJECT_NAME})

set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11 -ldl”)

if (NOT MONERO_DIR)
# Path of Monero source code
set(MONERO_DIR ~/monero)
endif()

message(STATUS MONERO_DIR “: ${MONERO_DIR}”)

set(MONERO_SOURCE_DIR ${MONERO_DIR} CACHE PATH “Path to the root


directory for Monero”)

# set location of Monero build tree


set(MONERO_BUILD_DIR
${MONERO_SOURCE_DIR}/build/Linux/master/release/ CACHE PATH
“Path to the build directory for Monero”)

set(MY_CMAKE_DIR “${CMAKE_CURRENT_LIST_DIR}/cmake” CACHE PATH


“The path to the cmake directory of the current project”)
list(APPEND CMAKE_MODULE_PATH “${MY_CMAKE_DIR}”)

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
“${MONERO_BUILD_DIR}” CACHE PATH “Add Monero directory for
library searching”)

# find boost
find_package(Boost COMPONENTS
system
filesystem
thread
date_time
chrono
regex
serialization
program_options
date_time
REQUIRED)

# include boost headers


include_directories(
${Boost_INCLUDE_DIRS}
)

include_directories(
${MONERO_SOURCE_DIR}/src
${MONERO_SOURCE_DIR}/external
${MONERO_SOURCE_DIR}/build
${MONERO_SOURCE_DIR}/external/easylogging++
${MONERO_SOURCE_DIR}/contrib/epee/include
${MONERO_SOURCE_DIR}/version
${MONERO_SOURCE_DIR}/external/db_drivers/liblmdb)
# Specify source files
set(SOURCE_FILES main.cpp)

# Make executable
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE


CXX)

set(LIBRARIES
wallet
blockchain_db
cryptonote_core
cryptonote_protocol
cryptonote_basic
daemonizer
cncrypto
blocks
lmdb
ringct
device
common
mnemonics
epee
easylogging
device
pcsclite
sodium
${Boost_LIBRARIES}
pthread
unbound
crypto
ringct_basic)

if (Xmr_CHECKPOINTS_LIBRARIES)
set(LIBRARIES ${LIBRARIES} checkpoints)
endif()

set(LIBS common; blocks; cryptonote_basic; cryptonote_core;


cryptonote_protocol; daemonizer; mnemonics; epee; lmdb; device;
blockchain_db; ringct; wallet; cncrypto; easylogging; version;
checkpoints; ringct_basic; )

foreach (l ${LIBS})
string(TOUPPER ${l} L)
find_library(Xmr_${L}_LIBRARY
NAMES ${l}
PATHS ${CMAKE_LIBRARY_PATH}
PATH_SUFFIXES “/src/${l}” “/src/ringct” “/src/”
“/external/db_drivers/lib${l}” “/lib” “/src/crypto”
“/contrib/epee/src” “/external/easylogging++/”
NO_DEFAULT_PATH
)

set(Xmr_${L}_LIBRARIES ${Xmr_${L}_LIBRARY})

message(STATUS “ Xmr_${L}_LIBRARIES ${Xmr_${L}_LIBRARY}”)


add_library(${l} STATIC IMPORTED)
set_property(TARGET ${l} PROPERTY IMPORTED_LOCATION
${Xmr_${L}_LIBRARIES})
endforeach()
target_link_libraries(${PROJECT_NAME} ${LIBRARIES})

Agora que as bibliotecas foram adicionadas, é hora de desenvolver nosso


programa especificamente. A derivação de todas as chaves a partir da chave
privada de gasto é uma tarefa comum, necessária para gerar ou restaurar
carteiras.

Código Main.cpp

Para compilar o código, acesse o diretório e execute cmake. Se você estiver


na pasta raiz do código do tutorial, execute:
$ cd tutorial-5 && cmake .

Os resultados deverão ser semelhantes a:


$ cd tutorial-5 && cmake .
-- The C compiler identification is GNU 6.3.0
-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
.....

-- Configuring done
-- Generating done
-- Build files have been written to: /code/tutorial-5

e
$ make
Scanning dependencies of target tutorial-5
[ 50%] Building CXX object CMakeFiles/tutorial-5.dir/main.cpp.o
[100%] Linking CXX executable tutorial-5
[100%] Built target tutorial-5

Se você encontrar algum erro, por favor, primeiro verifique se você possui a
versão CMake correta (>= v3.5.2) e GCC (>= v5). O programa CMake irá
criar um arquivo makefile para você, depois basta executar o comando
abaixo.

Por fim, execute o programa com ./tutorial-5


Private spend key :
<f8f2fba1da00643bbf11ffec355a808d2d8ca4e4de14a10476e116abd8dd7f0
2>
Public spend key :
<fffb624bd31dfafb015b01cbeaef28cbff3b2d77af01c54b77d6e1cef04d5f1
e>
Private view key :
<9227a05c665f684f5b8fef815cedd8a911b426c9fa07554c70daacf87757b30
2>
Public view key :
<d79eaf3acfd1f7a93526d2eec5bec5b76b880177e2610b69716b4f057795030
8>
Monero Address:
4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9sgho
pxXgQSh1RTd54JdvvCRsXiF41xvfeW5
Capítulo 8
Guia da carteira e dicas para resolução
de problemas
Instruções específicas para a Monero GUI
oficial
As instruções a seguir mostram como desempenhar as tarefas descritas
acima utilizando a carteira Monero com interface gráfica do usuário (GUI).
Caso esteja utilizando uma carteira diferente, fique a vontade para pular essa
seção.

1. Escolha o idioma
A Monero GUI oficial pode ser baixada em
https://getmonero.org/downloads. Uma vez que tenha extraído e aberto o
programa, você será apresentado com uma tela para seleção do idioma:

Idiomas

Se seu idioma não estiver listado acima, fique a vontade para enviar uma
tradução para ajudar aos demais usuários! Após selecionar o idioma, a
carteira irá perguntar se você deseja gerar uma nova semente ou restaurar
uma carteira já existente.
2. Especificar uma opção
A Monero GUI oferece três opções para o tipo da carteira: Mainnet, Testnet
e Stagenet.

Escolha Mainnet (opção padrão) para acessar a blockchain normal com


Monero de verdade. A Testnet e a Stagenet são duas blockchains separadas
usadas por desenvolvedores para desenvolver e testar novos códigos. Tanto
as moedas Testnet quanto as Stagenet não possuem valor monetário real e
não podem ser transferidas para a Mainnet (rede principal).

Se essa for sua primeira carteira Monero, pressione “criar nova carteira”. O
software do Monero irá gerar uma nova semente para você e lhe mostrar a
semente mnemônica de 25 palavras.

Nova ou Restaurar

3. Anote sua semente


Lembre-se, a semente não é como uma senha! A rede não será capaz de
restaurar o acesso aos seus fundos se você perder sua semente.

Certifique-se de anotá-la e armazená-la em um local seguro onde ninguém


poderá encontrar!

4. Insira uma senha


Você pode criar uma senha para a carteira para manter seus fundos seguros
caso alguém tenha acesso ao seu computador. A senha da carteira é uma
medida de segurança apenas local, igual ao PIN para desbloquear um celular.
Ela não impacta a criptografia ou como seus moneroj são armazenados na
blockchain, então restaurar sua carteira a partir da semente irá contornar a
senha configurada localmente.

5. Baixe a blockchain do Monero


Na sequência, você terá a opção de executar seu próprio nó ou conectar-se a
um nó remoto.

Executar seu próprio nó requer ao menos 60 GB de espaço em disco para


armazenar a blockchain. Se seus dispositivos tiverem recursos limitados,
você poderá selecionar a opção “conectar-se a um nó remoto” para
configurar uma carteira leve que acessa dados armazenados em outro local.
Para aprender mais sobre os prós e contras de utilizar um nó remoto, acesse
a seção 4.2.3 “Nós locais” versus “nós remotos”.

E então… Bem-vindo à Monero GUI!


8.1.2 Recebendo Monero com a carteira GUI
A aba “Receber” da carteira Monero GUI contém seu endereço de
recebimento nas formas de texto e código QR. O botão “Criar novo
endereço” gera mais “subendereços” que irão diretamente para essa mesma
carteira (semente). Se estiver realizando uma cobrança de determinado valor,
você pode inserir a “Quantidade” e ela será codificada no código QR.
Receber Monero

8.1.3 Enviando Monero com a carteira GUI


Para enviar Monero, basta especificar a quantidade que deseja enviar e o
endereço do destinatário. O campo ID do pagamento pode ser deixado em
branco, a não ser que o destinatário tenha especificado uma ID do
pagamento com antecedência. O campo Descrição é armazenado localmente,
então você poderá usá-lo para deixar uma nota para si mesmo. As descrições
não serão recuperadas caso você restaure sua carteira a partir da semente.
Enviar Monero

Histórico de transações

Histórico de
transações
8.1.4 Prova de pagamento com a carteira GUI
A verificação da prova de pagamento está disponível na GUI através da
opção “Provar/Verificar”. A captura de tela abaixo mostra a ID da transação,
o endereço e a chave da transação do exemplo com Maria e Khan do
Capítulo 2.

Prova de Pagamento

8.2 Instruções específicas para a carteira


Monero CLI
As instruções a seguir mostram como desempenhar as tarefas descritas
acima através da interface de linha de comando (CLI) do Monero. Caso
esteja utilizando uma carteira diferente, fique a vontade para pular essa
seção.

8.2.1 Configurando uma carteira com a CLI


A carteira oficial Monero CLI pode ser baixada em
https://getmonero.org/downloads. O comando para executar a CLI varia
dependendo do seu sistema operacional. No Linux, basta executar
./monero-wallet-cli dentro da pasta do programa. Você pode adicionar
flags extras (documentadas neste capítulo) se deseja conectar-se a um nó
remoto, associar seu endereço IP ou usar outras opções avançadas.
$ wget https://downloads.getmonero.org/cli/linux64

2014-08-12 (490 MB/s) - 'linux64' saved [45719102/45719102]

$ tar jxvf linux64

./monero/
./monero/monero-wallet-rpc
./monero/monero-blockchain-import
./monero/monero-blockchain-ancestry
./monero/monero-blockchain-usage
./monero/monero-wallet-cli
./monero/monero-blockchain-depth
./monero/monero-gen-trusted-multisig
./monero/monerod
./monero/monero-blockchain-export
./monero/monero-blockchain-blackball

$ cd monero && ./monero-wallet-cli

2018-10-24 18:58:11,024 INFO [default] Page size: 4096


This is the command line monero wallet. It needs to connect to a
monero daemon to work correctly.

WARNING: Do not reuse your Monero keys on another fork, UNLESS


this fork has key reuse mitigations built in. Doing so will harm
your privacy.

Monero CODENAME (vX.X.X-release)

Specify wallet file name (e.g., MyWallet). If the wallet doesn't


exist, it will be created.
Wallet file name (or Ctrl-C to quit): (enter the name of your
wallet you want to create) testwallet
No wallet found with that name. Confirm creation of new wallet
named: testwallet
(Y/Yes/N/No): Yes
Generating new wallet...
Enter a new password for the wallet: (enter your secret
password)
Confirm password: (confirm your password)
List of available languages for your wallet's seed:
0 : Deutsch
1 : English
2 : Español
3 : Français
4 : Italiano
5 : Nederlands
6 : Português
7 : русский язык
8 : Japanese
9 : Chinese
10 : Esperanto
11 : Lojban
Enter the number corresponding to the language of your choice:
(from 1 to 10)

Generated new wallet:


4BKjy1uVRTPiz4pHyaXXawb82XpzLiowSDd8rEQJGqvN6AD6kWosLQ6VJXW9sgho
pxXgQSh1RTd54JdvvCRsXiF41xvfeW5

View key:
9227a05c665f684f5b8fef815cedd8a911b426c9fa07554c70daacf87757b302
**************************************************************
Your wallet has been generated!
To start synchronizing with the daemon, use the "refresh"
command.
Use the "help" command to see the list of available commands.
[...]

lamb hexagon aces acquire twang bluntly argue when unafraid


awning academy nail threaten sailor palace selfish cadets click
sickness juggled border thumbs remedy ridges border
**************************************************************
Starting refresh...
Background refresh thread started
[wallet 433bhJ]:

8.2.2 Recebendo Monero


Você poder consultar seu endereço digitando address. Se deseja combinar o
endereço com uma ID do pagamento, você pode digitar
integrated_address para gerar uma ID do pagamento aleatória ou então
especificar uma ID do pagamento como entrada, por exemplo:
[wallet 433bhJ]: integrated_address 12346780abcdef00

8.2.3 Enviando Monero


Utilize o comando transfer para enviar Monero. Para enviar moneroj a um
único endereço, você não precisa especificar o número de misturas (durante
Outubro de 2018, uma atualização da rede passou a requerer o número fixo
de 11 misturas); você precisa inserir o endereço de destino e a quantidade a
se enviar. Para usar a CLI para enviar a transação de 0,06 XMR descrita
acima, o comando seria:
[wallet 433bhJ]: transfer
4758W1dAkifB2G1wQKmPWRvPs9zdsb5ctRFW2ttQbkQxYHRuPRdHZ9ijqJ7oxcns
9SvtpiH8ti8BRjL3LUHaBURpiz4KF 0.06

8.2.4 Prova de pagamento


Por padrão, as chaves da transação não são armazenadas pela CLI, porém
você pode habilitar essa funcionalidade usando: set store-tx-info 1. É
possível localizar uma chave da transação especificando a ID da transação
como o primeiro argumento de get_tx_key, por exemplo:
[wallet 433bhJ]: get_tx_key
4b540773ddf9e819f0df47708f3d3c9f7f62933150b90edc8910
3d36d42ca4b7

Para verificar uma chave da transação, a sintaxe é: check_tx_key


IDDATRANSAÇÃO CHAVEDATRANSAÇÃO ENDEREÇO, assim o comando para
verificar a chave da transação de Maria (feita no Capítulo 2) seria:
[wallet 433bhJ]: check_tx_key
4b540773ddf9e819f0df47708f3d3c9f7f62933150b90edc891
03d36d42ca4b7

Se você estiver procurando por um pagamento que tenha uma ID do


pagamento conhecida, basta especificá-la no comando payments, por
exemplo:
[wallet 433bhJ]: payments 12346780abcdef00
OutProofV1To53Qu2gegZbUevosKCTwrEdqiECgFyUygutXMEdh

8.3 Resolução de problemas comuns


8.3.1 Problema: Transferi moneroj para minha carteira mas
meu saldo ainda está em 0 XMR.
Soluções disponíveis:

1. [Sempre] verifique se você copiou o endereço Monero correto (às vezes


alguns vírus podem tentar editar o endereço Monero copiado);

2. Verifique se a transação realmente chegou na sua carteira / endereço


usando esses passos:

A. Navegue até a página “Configurações” na GUI e pressione “Mostrar


semente e chaves”. Em seguida, copie a chave privada de visualização.

B. Acesse um explorador de blockchain (blockchain explorer, em inglês),


como o xmrchain.net.

C. Insira a ID ou Hash da transação.

D. Insira sua chave privada de visualização e endereço no campo “Decode


outputs”.

E. Clique em “decode outputs”.

F. Se o resultado apresentar “output true”, isso prova que a transação foi


enviada e armazenada na blockchain.

3. Se o passo 2 acima confirmou que a transação ocorreu, seus moneroj


estão no local correto mas sua carteira ainda não encontrou tais saídas.
A Monero GUI utiliza um cache local que leva alguns segundos para
atualizar, especialmente no Windows. Se o problema persistir, tente
pressionar “Reescanear saldo da carteira” nas configurações da Monero
GUI ou entre em contato para perdir ajuda através dos canais da
comunidade (veja o Capítulo 6).
8.3.2 Problema: Minha carteira GUI parece lenta ou trava toda
hora
Antes de mais nada, é importante certificar-se que está executando a última
versão. Você pode verificar o número da sua versão na página Configurações
(na aba Info). Se você não estiver executando a última versão, por favor,
atualize antes.

É normal que a GUI não responda um pouco durante o processo de


sincronização inicial, momento em que o daemon monerod precisa de
bastante recursos da CPU para verificar blocos e transações.

Você pode limitar a utilização da CPU pelo daemon desta forma:

1. Navegue até a página Configurações da GUI.


2. Adicione --max-concurrency 1 no campo “Flags de inicialização do
daemon”.
3. Pare o daemon e feche a GUI.
4. Reinicie a GUI e o daemon.

A reinicialização é necessária para iniciar o daemon com a nova flag --max-


concurrency, que faz com que ele utilize somente um núcleo da CPU.

8.4 Como adicionar uma carteira somente


leitura
Conforme explicado no item 5.3.2.2, uma carteira somente leitura é um tipo
especial de carteira que contém a chave privada de visualização para poder
ver a soma das transações recebidas e enviadas. Ela pode ser útil para
pessoas que queiram oferecer transparência, permitindo que outras pessoas
vejam parcialmente suas transações.

Esse tutorial assume que você já configurou uma carteira fria em papel e que
agora está pronto para criar uma carteira “somente leitura” usando a GUI.
1. Abra o programa Monero GUI.
2. Na tela de início, selecione “Restaurar carteira das chaves ou semente
mnemônica”.
3. Edite os campos “Nome da carteira” e “Diretório da carteira” conforme
sua preferência.
4. Marque a opção “Restaurar das chaves”.
5. Insira o endereço público da carteira em papel que você criou.
6. Insira a chave privada de visualização da carteira em papel que você
criou.
7. Deixe o campo da chave privada de gasto em branco!
8. Insira a altura de restauração ou de criação e clique no botão
“Próximo”.
9. Na próxima tela, insira uma senha forte e clique no botão “Próximo”.
10. Na tela seguinte, selecione se deseja conectar-se a um nó local
(recomendado) ou um nó remoto. Se optar pelo nó local, selecione a
pasta que contém sua cópia da blockchain.
11. Na última tela, confirme se os detalhes da carteira estão corretos e abra
a carteira somente leitura!

Agora você poderá ver e confirmar transações que você enviou para sua
carteira fria em papel! Se você deseja testar o processo que acabou de
aprender para se familiarizar, siga os passos acima utizando as informações
da carteira do Fundo Geral de Doações do Monero:

Endereço Público da Carteira:


44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaB
YBb98uNbr2VBBEt7f2wfn3RVGQBEP3A

Chave Privada de Visualização:


f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501
Glossário
Conta
As contas foram criadas dentro do contexto de subendereços. Uma carteira
tem uma semente. Dessa semente, o endereço primário e chaves privadas de
gasto e visualização são derivadas. Dessas chaves privadas, subendereços
são derivados. Subendereços são agrupados em contas.

Esse endereço primário é o primeiro endereço da primeira conta da carteira.

Cada conta tem seu próprio saldo e pode ter vários subendereços associados
a ela. Dado que contas são apenas grupos de subendereços, não existe um
endereço da conta propriamente dito (a não ser que você considere o
primeiro subendereço da conta como o “endereço da conta”).

Assim, uma carteira pode ter várias contas e cada conta pode ter vários
subendereços. Dado que contas e subendereços são gerados de forma
determinística a partir da semente, você só precisa saber sua semente para
restaurar a estrutura de contas e subendereços quando estiver restaurando
uma carteira (embora qualquer rótulo que você tenha dado às contas ou
subendereços precisarão ser anotados separadamente).

Endereço
Quando você envia Monero para alguém, você só precisa de uma
informação: o endereço Monero da pessoa. Um endereço público Monero é
um conjunto de 95 caracteres começando com um “4”.

Air Gap
Um “espaço de ar” (air gap, em inglês) ou air wall (em referência a
“firewall”) é uma medida de segurança aplicada em redes com um ou mais
computadores, usada para garantir que uma rede segura esteja fisicamente
isolada de redes não seguras, como por exemplo, a Internet pública ou uma
rede local insegura.

O nome vem da técnica de se criar uma rede que é fisicamente separada


(conceitualmente, com um espaço de ar) de todas as outras redes. O espaço
de ar não precisa ser completamente literal, pois algumas redes utilizam
dispositivos criptográficos dedicados que conseguem criar um túnel para
transmitir pacotes por uma rede insegura enquanto evitam a variação da taxa
ou tamanho do pacote. Ainda assim, essas redes podem ser consideradas
como tendo “espaço de ar”, já que não existe a possibilidade de
comunicação entre computadores que estão em lados opostos do “espaço”.

ASIC
Circuitos integrados de aplicação especifica (ASIC, na sigla em inglês) são,
como o nome já diz, um circuito integrado customizado para um uso
específico, ao invés de serem projetados para uso geral. Por exemplo, um
chip projetado para ser usado em um gravador de voz digital ou um
minerador Bitcoin de alta eficiência são considerados ASICs.

Resistência a ASIC
Resistência a ASIC refere-se às medidas tomadas por algumas criptomoedas
para garantir que seu algoritmo de mineração não seja compatível com estes
equipamentos especializados. Veja os Capítulos 4, 5 e 6 para aprender mais
sobre como a comunidade Monero ativamente garante que nosso algoritmo
CryptoNight seja acessível somente para mineradores com CPU e GPU.

Bitmonero
BitMonero, antigo nome do Projeto Monero, veja o Capítulo 1. Algumas
referências antigas ainda existem; por exemplo, os logs e a blockchain são
salvos na pasta ~/.bitmonero por padrão.

Bloco
Um bloco é um contêiner de transações, com um bloco sendo adicionado à
blockchain a cada 2 minutos em média.

Os blocos também contém um tipo especial de transação, a transação


coinbase, que adiciona Monero recém criado à rede. Blocos são criados
através de um processo de mineração e o nó que minera o bloco com
sucesso, o transmite aos demais nós conectados a ele, que subsequentemente
retransmitem o bloco até que toda a rede Monero o tenha recebido.

Blockchain
Uma blockchain é um banco de dados distribuído que cresce constantemente
com o registro de todas as transações que aconteceram em determinada
criptomoeda. Comumente, refere-se a esse banco de dados como registo,
pois os dados contém uma grande lista de transação que já ocorreram. No
Monero, essas transações são agrupadas em blocos a cada 2 minutos (em
média), e todos os mineradores e nós na rede possuem cópias desses blocos.

Bulletproofs
Bulletproofs são um novo sistema matemático para verificar valores
ocultados de transações. As Bulletproofs encolheram o tamanho das
transações em aprox. 80%, reduzindo drasticamente as taxas.

Troco
Monero enviado como parte de uma transação, que retorna para sua conta ao
invés de ir para o destinatário.

Transação base (ou coinbase)


Um tipo especial de transação incluída em cada bloco, e que contém uma
pequena quantidade de Monero enviado ao minerador como uma
recompensa pelo seu trabalho de mineração.
Interface de linha de comando
Uma interface de linha de comando (ou CLI) é uma interface baseada em
texto utilizada para inserir comandos via terminal. Você pode baixar a
carteira Monero CLI oficial (gratuita e de código aberto) em
https://getmonero.org/downloads/.

Consenso
Consenso descreve uma propriedade de redes distribuídas, como o Monero,
onde a maioria dos participantes seguem as regras e rejeitam participantes
mal-intencionados.

Criptomoeda
Uma moeda digital onde técnicas de encriptação são utilizadas para regular a
geração de unidades de moeda e verificar a transferência de fundos,
normalmente operando independentemente de um banco central.

Assinatura criptográfica
Um método criptográfico para provar a posse de informações, bem como
para provar que a informação não foi modificada depois de assinada.

Chamarizes
Durante a construção de uma transação Monero, o termo “chamariz” se
refere a uma saída (que não pertence ao remetente) que é selecionada na
blockchain de forma pseudoaleatória para servir como mistura para a
assinatura em anel. Ver seção 5.4.3.

Denominações
Uma denominação é uma descrição própria de uma quantidade de
determinada moeda. Ela é, normalmente, uma subunidade dessa moeda. Por
exemplo, tradicionalmente, um centavo é 1/100 “avos” de uma unidade
particular de moeda.

Para facilitar o uso, os nomes das denominações Monero adicionam prefixos


do Sistema Internacional após a remoção da sigla “mo” inicial. A menor
unidade de Monero é 1 piconero (0,000000000001 XMR). O plural para a
quantidade de Monero é moneroj.

Nome Base 10 Quantidade


piconero 10⁻¹² 0,000000000001
nanonero 10⁻⁹ 0,000000001
micronero 10⁻⁶ 0,000001
millinero 10⁻³ 0,001
centinero 10⁻² 0,01
decinero 10⁻¹ 0,1
monero 10⁰ 1
decanero 10¹ 10
hectonero 10² 100
kilonero 10³ 1.000
meganero 10⁶ 1.000.000

Dificuldade
A dificuldade é um parâmetro da rede que impacta quanto tempo levará para
os mineradores encontrarem novos blocos, aumentando ou diminuindo o
limitar para o valor do hash que precisa ser satisfeito para completar um
bloco. Se mais mineradores juntam-se à rede, a dificuldade aumenta para
evitar que os blocos sejam descobertos muito rapidamente (e o contrário,
caso a taxa de hash da rede diminua).

Encriptação
Em criptografia, encriptação é o processo de codificar mensagens ou
informações de uma forma que somente partes autorizadas consigam
decodificar e ler o que foi enviado. Encriptação por si só não evita a
interceptação, mas impede o acesso ao conteúdo por parte do interceptador.

Taxas
Toda transação inclui uma taxa que é coletada por qualquer minerador que
inclua a transação em um bloco completado. Usuários que tenham
transações de alta prioridade podem anexar uma taxa relativamente alta para
incentivar os mineradores a confirmar sua transação mais rapidamente.

Fungibilidade
Em economia, fungibilidade é uma propriedade de bens ou produtos cujas
unidades individuais sejam essencialmente intercambiáveis. Criptomoedas
com registros transparentes carecem dessa propriedade, já que cada moeda
tem um histórico único e é armazenado publicamente. O Monero alcança a
fungibilidade combinando tecnologias de privacidade para evitar que
informações sensíveis sejam armazenadas na blockchain, fazendo assim com
que todos moneroj sejam indistinguíveis.

Blocos Fluffy
Um bloco é composto por um cabeçalho e transações. Blocos Fluffy (Fluffy
Blocks) contém somente um cabeçalho, uma lista de índices de transações e
quaisquer transações que o nó recebendo o bloco ainda não tenha. Esse tipo
de bloco economiza largura de banda, porque os nós talvez já tenham
informações sobre a maioria ou todas as transações em um bloco e eles não
precisam recebê-las novamente.

I2P
A rede I2P oferece elevada proteção à privacidade para comunicações na
Internet. Muitas atividades que poderiam prejudicar sua privacidade na
Internet pública podem ser conduzidas anonimamente dentro da I2P.
Endereço integrado
Um endereço integrado é um endereço combinado com uma ID do
pagamento criptografada de 64 bits. Um endereço integrado possui 106
caracteres.

Kovri
Kovri é uma implementação em C++ da rede I2P. O Kovri está atualmente
em desenvolvimento ativo e ainda não foi integrado com o Monero. Quando
o Kovri for integrado em seu nó Monero, suas transações serão ainda mais
seguras do que antes.

Mineração
Processo de computar criptograficamente uma prova matemática para um
bloco, este contendo um número de transações, que são posteriormente
adicionadas à blockchain.

Mineração é o processo distribuído de confirmar transações no registro


público de todas as transações, também conhecido como blockchain. Os nós
Monero utilizam a blockchain para distinguir transações legítimas de
tentativas de gastar novamente moedas que já foram gastas em outro
momento.

O Monero é suportado exclusivamente por Prova de Trabalho. Ele emprega


um algoritmo de mineração que tem o potencial de ser eficientemente
desempenhado por bilhões de dispositivos existentes atualmente (qualquer
CPU x86 moderna e muitas GPUs). O Monero utiliza o algoritmo de Prova
de Trabalho CryptoNight, que foi desenvolvido para ser usado em CPUs e
GPUs comuns.

A característica inteligente de mineração permite que a mineração CPU seja


feita nos computadores dos usuários de forma transparente, seguindo a visão
original de Satoshi Nakamoto de uma verdadeira moeda P2P, e em contraste
com a centralização de fazendas e pools de mineração.
Semente mnemônica
Uma frase de 13 ou 25 palavras utilizada para fazer backup de uma conta
Monero, disponível em vários idiomas. Essa frase de 25 palavras (13 no caso
da MyMonero) possui todas as informações necessárias para visualizar e
gastar fundos de um conta Monero.

Monero
A criptomoeda mais privada.


Um dispositivo na internet executando o software Monero, com uma cópia
completa da blockchain do Monero, ativamente ajudando a rede.

OpenAlias
De maneira simples, OpenAlias é um registro DNS TXT em uma FQDN
(nome de domínio completamente qualificado). A Equipe Core do Monero
lançou um padrão chamado OpenAlias que permite endereços muito mais
legíveis para humanos e que “contorna” o triangulo de Zooko. A OpenAlias
pode ser utilizada por qualquer criptomoeda e já está implementada no
Monero.

ID do pagamento
ID do pagamento é um anexo arbitrário e opcional da transação que consiste
de 32 bytes (64 caracteres hexadecimais) ou 8 bytes (no caso de endereços
integrados).

Normalmente, a ID do pagamento é utilizada para identificar transações


enviadas para comerciantes e corretoras: Devido às características de
privacidade intrínsecas do Monero, onde um único endereço público é
normalmente utilizado para transações recebidas, a ID do pagamento é
especialmente útil para associar pagamentos recebidos com contas de
usuários.

Desde a versão 0.9 Hydrogen Helix, as IDs do pagamento podem ser


criptografadas e embutidas em um endereço de pagamento chamado
“Endereço Integrado” (de fato, ele é a integração entre uma ID do
pagamento e um endereço Monero). As IDs do pagamento desse tipo devem
ter 64 bits e são criptografadas com uma chave aleatória de uso único
conhecida somente pelo remetente e pelo destinatário.

Recomenda-se usar o comando integrated_address da carteira oficial para


gerar um Endereço Integrado automaticamente, e que contenha IDs do
Pagamento Compactas. Se quiser usar a linha de comando, você pode gerar
IDs do pagamento executando:
$ openssl rand -hex 8

$ openssl rand -hex 32

Comprometimento de Pedersen
Comprometimentos de Pedersen são algoritmos criptográficos que permitem
a quem está provando comprometer-se com um certo valor sem revelá-lo ou
sem poder alterá-lo.

Quando você gasta Monero, o valor das entradas que você está gastando e o
valor das saídas que você está enviando são criptografados e opacos a
qualquer um, exceto o destinatário de cada umas das saídas.
Comprometimentos de Pedersen permitem que você envie Monero sem
revelar o valor das transações. Eles também tornam possível que pessoas
verifiquem se as transações na blockchain são válidas e se não estão criando
Monero do nada.

Contanto que o valor das saídas criptografadas criadas (que incluem uma
saída para o destinatário e uma saída na forma de troco para o remetente) e a
taxa não criptografada da transação sejam iguais à soma das entradas que
estão sendo gastas, a transação é legítima e pode se verificar que ela não está
criando Monero do nada.
Comprometimentos de Pedersen significam que as somas podem ser
verificadas como sendo iguais, mas o valor em Monero de cada uma das
somas e o valor em Monero das entradas e saídas individuais são
indeterminadas. Comprometimentos de Pedersen também significam que
mesmo a razão entre uma entrada e outra, ou uma saída e outra são
indeterminadas.

Não fica claro quais entradas estão realmente sendo gastas, já que as
assinaturas em anel listam tanto as entradas reais quanto as entradas
chamarizes. Portanto, você não sabe realmente quais comprometimentos de
Pedersen de entrada precisam ser somados. E isso não é um problema,
porque a assinatura em anel RingCT só precisa provar que para uma
combinação de entradas, as saídas são iguais à soma das entradas. Por
motivos matemáticos, isso é impossível de forjar.

Assinaturas em anel
Em criptografia, uma assinatura em anel é um tipo de assinatura digital que
pode ser realizada por qualquer membro de um grupo de usuários onde cada
um possui chaves. Portanto, a mensagem assinada com uma assinatura em
anel é endossada por alguém em um grupo particular de pessoas. Uma das
propriedades da segurança de uma assinatura em anel é que é
computacionalmente inviável determinar qual chave dos membros do grupo
foi utilizada para produzir a assinatura.

Por exemplo, uma assinatura em anel poderia ser usada para prover uma
assinatura anônima de “um oficial de alto escalão da Casa Branca”, sem
revelar qual oficial assinou a mensagem. Assinaturas em anel são boas para
essa aplicação, porque o anonimato de uma assinatura em anel não pode ser
revocado, e porque o grupo para uma assinatura em anel pode ser
improvisado (não requer uma configuração anterior).

Uma assinatura em anel utiliza as chaves da sua conta e várias chaves


públicas (também conhecidas como saídas), extraídas da blockchain usando
um método de distribuição triangular. Ao longo do tempo, saídas passadas
poderiam ser utilizadas várias vezes para formar possíveis participantes
signatários. Em um anel de signatários possíveis, todos os membros do anel
são iguais e válidos. No Monero, assinaturas em anel são utilizadas para
ofuscar o remetente da transação, referenciando várias entradas possíveis
para a transação (incluindo chamarizes).

Tamanho do anel
Tamanho do anel refere-se ao número total de possíveis signatários em um
assinatura em anel. Se um tamanho de anel de 11 for selecionado em uma
determinada transação, isso significa que existem 10 saídas chamarizes além
da sua saída “real”.

Endereço sigiloso
Endereços sigilosos são uma parte importante da privacidade inerente ao
Monero. Eles permitem e requerem que o remetente crie, em nome do
destinatário, endereços aleatórios de uso único para cada transação. O
destinatário pode publicar somente um endereço, e ainda ter todos seus
pagamentos recebidos indo para endereços únicos na blockchain, os quais
não podem ser associados de volta com o endereço publicado nem com
qualquer endereço de outras transações. Ao usar endereços sigilosos,
somente o remente e o destinatário conseguem determinar para onde um
pagamento foi enviado.

Emissão em cauda
As recompensas dos blocos do Monero nunca chegarão a zero. Elas cairão
gradualmente até atingir a emissão em causa no final de Maio de 2022.
Neste ponto, as recompensas serão fixadas em 0,6 XMR por bloco.

Transações
Um contêiner assinado criptograficamente que detalha a transferência de
Monero para um destinatário (ou destinatários).

Os parâmetros de uma transação contém um ou mais endereços de destino


(junto com a quantidade de fundos correspondentes) e um parâmetro com o
tamanho do anel que especifica o número de saídas vinculadas à transação.
Quanto maior o número de saídas usadas, maior o grau de ofuscação
possível, porém isso tem um preço. Uma vez que a transação fica maior com
mais saídas, a taxa da transação também será maior.

É possível formar uma transação offline, o que oferece benefícios de


privacidade adicionais.

Uma transação pode ser unicamente identificada com o uso de uma ID da


transação opcional, que normalmente é representada por uma sequência de
32 bytes (64 caracteres hexadecimais).

Carteira
Uma conta Monero, ou carteira, armazena as informações necessárias para
enviar e receber moneroj. Além disso, o software da carteira Monero
mantém um histórico privado das suas transações e permite que você assine
mensagens criptograficamente. Ela também inclui o software de mineração
do Monero e uma agenda de endeços.
Mastering Monero
1. Prefácio
1. Sobre o autor
2. Como este livro está organizado
2. Capítulo 1
3. Introdução às criptomoedas e ao Monero
1. 1.1 Pagamento através de bancos
2. 1.2 Introdução às blockchains
1. 1.2.1 O que é uma blockchain?
2. 1.2.2 Benefícios da blockchain
3. 1.2.3 Problemas da blockchain
3. 1.3 Apresentando o Monero
1. 1.3.1 Princípios do Monero
2. 1.3.2 “Aplicações” do Monero na vida real
3. 1.3.3 Monero: comunidade e software descentralizados de
código aberto
4. 1.3.4 História do Monero
5. 1.3.5 Discussão ética
4. Capítulo 2
5. Primeiros passos: receber, guardar e enviar Monero
1. 2.1 O que é uma carteira?
2. 2.2 Selecionando a(s) melhore(s) carteira(s) para suas necessidades
1. 2.2.1 Carteiras de software e para dispositivos móveis
2. 2.2.2 Carteira de hardware
3. 2.2.3 Carteiras em papel
4. 2.2.4 Carteiras web
5. 2.2.5 Carteiras frias
6. 2.2.6 Links para as carteiras Monero
7. 2.2.7 Conectando-se a um nó remoto (opcional)
3. 2.3 Usando Monero
1. 2.3.1 Recebendo Monero
2. 2.3.2 Enviando Monero
3. 2.3.3 Prova de pagamento
4. 2.4 Segurança operacional
1. 2.4.1 Nunca diga quanto Monero você possui
2. 2.4.2 Mantenha sua semente segura
3. 2.4.3 Precauções com transações
4. 2.4.4 Segurança em relação às corretoras
5. 2.5 “Primeiros passos” para negócios
1. 2.5.1 Monero é ideal para comerciantes
2. 2.5.2 Ferramentas intuitivas para aceitar Monero
6. Capítulo 3
7. Como o Monero funciona
1. 3.1 Transação e o Registro
2. 3.2 Panorama das tecnologias de privacidade
1. 3.2.1 Transações confidenciais em anel (RingCT)
2. 3.2.2 Endereços sigilosos (de uso único)
3. 3.2.3 Assinaturas em anel
4. 3.2.4 Kovri e análise de tráfego
3. 3.3 Comentários finais
8. Capítulo 4
9. A Rede Monero
1. 4.1 Anatomia simplificada de um bloco
2. 4.2 Os nós são a base da rede
1. 4.2.1 Nós retransmitem dados da rede aos pares
2. 4.2.2 Nós armazenam a blockchain
3. 4.2.3 “Nós locais” versus “nós remotos”
3. 4.3 Mineradores criam novos blocos
1. 4.3.1 Mineradores adicionam novos blocos à cadeia mais
longa
2. 4.3.2 Uma tarefa difícil garante estabilidade e imparcialidade
3. 4.3.3 Os “táxis” do Monero utilizam um desafio difícil para
garantir a imparcialidade
4. 4.3.4 Os mineradores são pagos pelo seu serviço
4. 4.4 Sistemas prova de trabalho
1. 4.4.1 Benefícios
2. 4.4.2 A “dificuldade” ajusta o tempo entre blocos
3. 4.4.3 O algoritmo CryptoNight
4. 4.4.4 Breve nota sobre provas de trabalho alternativas
5. 4.5 Conceitos criptográficos para provas de trabalho
1. 4.5.1 Hashes (conceito geral)
2. 4.5.2 Nonces (conceito geral)
6. 4.6 Resumo sobre o conceito de prova de trabalho
10. Capítulo 5
11. Uma imersão profunda no Monero e em criptografia
1. 5.1 Fundamentos de matemática
1. 5.1.1 Divisão Euclidiana (A/B)
2. 5.1.2 Números primos
3. 5.1.3 Aritmética modular
4. 5.1.4 Representação dos inteiros
5. 5.1.5 Curvas elípticas
2. 5.2 Fundamentos de criptografia
1. 5.2.1 Criptografia simétrica e assimétrica
2. 5.2.2 Hashing
3. 5.2.3 Gerador de números pseudoaleatórios do Monero
(PRNG)
3. 5.3 Gerando chaves e endereços Monero
1. 5.3.1 Escolhendo uma semente
2. 5.3.2 Derivação das chaves
3. 5.3.3 Geração de endereços
4. 5.3.4 Subendereços
5. 5.3.5 Outros métodos para derivação de chaves
4. 5.4 As tecnologias de privacidade
1. 5.4.1 Endereço sigiloso
2. 5.4.2 Transações confidenciais em anel
3. 5.4.3 Assinaturas em anel
4. 5.4.4 Recursos adicionais
5. 5.5 A blockchain do Monero
1. 5.5.1 Lightning Memory Mapped Database
2. 5.5.2 A estrutura de um bloco
3. 5.5.3 A economia da mineração
4. 5.5.4 Bulletproofs
6. 5.6 Fungibilidade
12. Capítulo 6
13. Comunidade e contribuição
1. 6.1 Cultura da comunidade
1. 6.1.1 Princípios de transparência
2. 6.1.2 Diversas mentes brilhantes trabalham no Monero
2. 6.2 Cultura do código
1. 6.2.1 Crie uma pull request com melhorias
2. 6.2.2 Etiqueta quanto aos patches
3. 6.2.3 Orientações gerais
4. 6.2.4 Repositórios para o Monero
5. 6.2.5 Lista de e-mail de comunicados sobre o Monero
(Monero-announce)
14. 6.3 Introdução ao desenvolvimento do Monero
1. 6.3.1 Baixando o código-fonte do Monero
2. 6.3.2 Dependências
3. 6.3.3 Instrução de geração
4. 6.3.4 Solução de problemas de geração
5. 6.3.5 Gerando a Interface Gráfica do Usuário do software Monero
15. Capítulo 7
16. Integração do Monero para desenvolvedores
1. 7.1 OpenAlias: endereços convenientes em texto (para humanos)
2. 7.2 Monero_URI: informações convenientes em texto (para
computadores)
3. 7.3 Monero RPC
1. 7.3.1 Inicialização e configuração (configurar e proteger)
2. 7.3.2 Formato JSON RPC
3. 7.3.3 Exemplos de chamadas RPC
4. 7.4 A integração do Monero na prática (Tutoriais em Python e
C++)
1. 7.4.1 Tutorial 1 – Obter seu saldo
2. 7.4.2 Tutorial 2 – Como gerar um endereço pseudoaleatório
3. 7.4.3 Tutorial 3 – Gerador de endereços “customizados”
4. 7.4.4 Tutorial 4 – Como criar um endereço sigiloso
5. 7.5 API C++ do Monero
1. 7.5.1 Bibliotecas do Monero
2. 7.5.2 Primeiros passos com C++
3. 7.5.3 Tutorial 5 – Recuperando todas as chaves a partir da
chave privada de gasto
17. Capítulo 8
18. Guia da carteira e dicas para resolução de problemas
1. Instruções específicas para a Monero GUI oficial
1. 1. Escolha o idioma
2. 2. Especificar uma opção
3. 3. Anote sua semente
4. 4. Insira uma senha
5. 5. Baixe a blockchain do Monero
2. E então… Bem-vindo à Monero GUI!
1. 8.1.2 Recebendo Monero com a carteira GUI
2. 8.1.3 Enviando Monero com a carteira GUI
3. Histórico de transações
4. 8.1.4 Prova de pagamento com a carteira GUI
3. 8.2 Instruções específicas para a carteira Monero CLI
1. 8.2.1 Configurando uma carteira com a CLI
2. 8.2.2 Recebendo Monero
3. 8.2.3 Enviando Monero
4. 8.2.4 Prova de pagamento
4. 8.3 Resolução de problemas comuns
1. 8.3.1 Problema: Transferi moneroj para minha carteira mas
meu saldo ainda está em 0 XMR.
2. 8.3.2 Problema: Minha carteira GUI parece lenta ou trava
toda hora
5. 8.4 Como adicionar uma carteira somente leitura
19. Glossário
1. Conta
2. Endereço
3. Air Gap
4. ASIC
5. Resistência a ASIC
6. Bitmonero
7. Bloco
8. Blockchain
9. Bulletproofs
10. Troco
11. Transação base (ou coinbase)
12. Interface de linha de comando
13. Consenso
14. Criptomoeda
15. Assinatura criptográfica
16. Chamarizes
17. Denominações
18. Dificuldade
19. Encriptação
20. Taxas
21. Fungibilidade
22. Blocos Fluffy
23. I2P
24. Endereço integrado
25. Kovri
26. Mineração
27. Semente mnemônica
28. Monero
29. Nó
30. OpenAlias
31. ID do pagamento
32. Comprometimento de Pedersen
33. Assinaturas em anel
34. Tamanho do anel
35. Endereço sigiloso
36. Emissão em cauda
37. Transações
38. Carteira

1. Title Page

Você também pode gostar