# Armazenamento quente e frio

Armazenamento Quente e Frio no contexto de Bitcoin se refere às diferentes maneiras de se guardar os bitcoins, ou mais precisamente as chaves privadas que dão acesso a eles.
Por se basear num esquema de chave pública, os usuários da rede Bitcoin têm a garantia de que seus bitcoins não serão gastos por ninguém que não tiver a chave privada adequada, pois apenas a chave certa pode gerar uma assinatura válida e só transações com assinaturas válidas serão aceitas no blockchain.
O endereço público para que um usuário receba bitcoins, bem como a chave privada, que permite que um usuário gaste os bitcoins desse endereço, são armazedados em uma Carteira (Wallet). Carteiras são simples arquivos que podem ser guardados em qualquer dispositivo (pendrives, desktops, celulares...) ou até em meios físicos, como em uma folha de papel.

## Armazenamento Quente

Também conhecido por hot wallet, se refere ao armazenamento online, ou conectado de alguma maneira à internet, das Carteiras de bitcoins. Por estar disponível online é a maneira mais conveniente de se armazenar bitoins, pois em qualquer lugar com internet você pode usá-las sem esforço.
Empresas que prestam serviços relacionados à bitcoins, como bolsas ou casas de câmbio, utilizam o armazenamento quente para que o serviço de saque/depósito esteja sempre disponível para o cliente.
Uma analogia comum é associar hot wallets à carteira (física) que se usa no dia-a-dia, pois permite fácil acesso ao seu dinheiro.
Apesar de conveniente, Carteiras online não são a maneira mais segura de se manter bitcoins, mesmo nas mãos de grandes empresas, pois estão sujeitas a ataques de hackers. O maior caso conhecido de roubo de bitcoins ocorreu com o Mt. Gox, uma casa de câmbio de bitcoins que chegou a operar 80% das transações mundiais da moeda, mas que acabou se tornando insolvente e declarou falência após a perda de uma quantia que gira em torno de US$ 500 milhões.
Existem algumas maneiras de tornar o uso de hot wallets mais seguro:
Guardar pequenas quantias: Assim como ninguém sai com todo o dinheiro que possui guardado na carteira, não se deve manter grandes quantias em hot wallets.
Encriptar as Carteiras: Proteger a Carteira com senha é uma opção para aumentar a segurança porém, apesar de proteger contra ladrões que por ventura tenham acesso ao dispositivo onde ela está armazenada, não impede que hackers descubram a senha. Portanto é necessário uma senha forte para garantir mais segurança.
Multi-assinaturas: O protocolo Bitcoin permite que certas transações só se tornem válidas se mais de um usuário assiná-las. Isso pode ser usado por um grupo de usuários que possuam reservas na mesma carteira, mas que só seja possível retirar/gastar os bitcoins se X membros assinarem a transação.

## Armazenamento Frio

Ou cold wallets se refere a manter os bitcoins armazenados em meios físicos ou em dispositivos que não precisem estar conectados à internet.
Assim como podemos comparar hot wallets com carteiras da vida real, cold wallets seriam como cofres que aumentam significativamente a segurança, mas tornam o acesso mais difícil e menos conveniente.

### Carteiras de Papel

Também conhecidas por Paper wallets, são uma solução simples e bem segura de guardar bitcoins. Uma Carteira de papel é basicamente a impressão no papel de um endereço público e da chave privada associada a ele. A chave privada sempre vem lacrada e tanto a informação privada quanto a pública estão disponíveis em um código QR e encriptadas numa string na base 58.
Depois de geradas e impressas em um processo rigoroso para garantir que nenhuma informação vaze, as Carteiras de papel podem ser armazenadas onde o usuário quiser e seus bitcoins estarão tão seguros quanto o papel que ele imprimiu.
Porém, por motivos de segurança, não se recomenda reusar o mesmo endereço várias vezes, para superar isso os usuários têm três opções:
Carteiras de uso único: Como o nome já sugere, o usuário só usa o endereço para receber uma única vez e quando for retirar o dinheiro, transfere tudo uma única vez e descarta a Carteira.
Múltiplas chaves: O usuário gera várias Carteiras de papel e as utiliza apenas uma vez cada, não é uma solução muito atrativa pois pode se perder algumas Carteiras e gerenciar múltiplos endereços de uma vez pode causar confusão e um mesmo endereço acabar sendo reusado.
Geradores de chaves: São carteiras que ao invés de possuir um único endereço e uma única chave, possuem a informação necessária para gerar endereços e informação para gerar chaves. Assim, os endereços são gerados sob demanda e não se cria endereços desnecessários. Para gerar a i-ésima chave que corresponda ao i-ésimo endereço, basta passar o mesmo parâmetro para os geradores.

### Bitcoins Físicas

Da mesma forma que as Carteiras de papel a segurança das bitcoins está ligada à segurança do objeto físico. Alguns exemplos são:

#### Casascius Coins

Foi uma das primeiras Bitcoins físicas criadas e elas são mais parecidas com moedas do que suas antecessoras. A chave privada, que permite gastar o seu valor, é impressa na moeda e permanece coberta por um lacre até o momento do uso. A moeda só pode ser utilizada uma vez, pois é praticamente impossível acessar a chave sem danificar o lacre, o que prova seu uso ou adulteração e faz com que perca seu valor.
As Casascius Coins estão disponíveis nos valores de 1, 10, 25, 100 e 1000 bitcoins ou seus múltiplos.

#### Alitin Mint

Seguindo a ideia da Casascius a Alitin se parece com uma moeda tradicional. A chave privada de cada moeda vem gravada na lateral de cada moeda e para proteger-la, cada moeda vem inserida e lacrada em um case que esconde a chave. O case também contém uma marca holográfica para garantir que é original e assim como no caso anterior a moeda só pode ser gasta uma vez, moedas com o lacre violado não têm valor.

### Carteira de Hardware

Consiste em um dispositivo eletrônico que armazena a(s) Carteiras do usuário.
Suas grandes vantagens em relação aos outros tipos de Carteiras são:
- A chave privada está protegida pelo microcontrolador e não é possível transferi-la do dispositivo em puro-texto.
- Pode-se fazer backup das informações facilmente.
- Pode ser usada em segurança e de forma interativa. Ao contrário das Carteiras de papel que em algum momento precisam ser importadas para um software.
- A maior parte das vezes o software é aberto, permitindo que o usuário valide a operação do dispositivo e ,caso seja experiente no assunto, corrija algum problema.
O Armazenamento Frio também pode ser feito salvando a Carteira em dispositivos que não tenham acesso à rede, como pendrives, ou mantendo o arquivo encriptado online, mas com a chave para decriptar salva offline.
Para grandes quantias de bitcoins, existe o que se chama de Armazenamento Frio Profundo(Deep Cold Storage), que consiste em utilizar algum método em que seja fácil enviar bitcoins para a Carteira, mas significativamente difícil recuperá-las. Um exemplo simples seria encriptar a Carteira, salvá-la em algum pendrive, colocar o pendrive num cofre ou em qualquer lugar seguro. Como a única informação necessária para se enviar bitcoins para uma Carteira é o endereço público dela, é trivial armazená-lo em um lugar separado para futuros depósitos, mas para gastar os bitcoins um usuário mal intencionado teria que passar por vários níveis de segurança diferentes.
Os métodos de Armazenamento Frio, apesar de mais seguros que os Quentes, também não são infalíveis, pois os dispositivos ou itens ainda podem ser danificados ou destruídos.
Os métodos citados acima também são utilizados por empresas que operam com Armazenamento Quente para manter um fundo de reserva e minimizar perdas, caso as hot wallets sofram ataques. Assim, é comum que pequenas transações intermediadas por essas empresas se deem de forma rápida, pois a quantia utilizada está disponível nas Carteiras Quentes e transações mais volumosas demorem um pouco, pois estão a quantia tem que ser retirada de um Armazenamento Frio.
Para aumentar a confiança dos clientes, as empresas que lidam com câmbio de bitcoins precisam provar que mantêm alguma reserva (veja o tópico Prova de Reserva).

## Dividir a Chave

Apesar das grandes diferenças entre os armazenamentos quente e frio, existe algo em comum entre eles: cada Carteira só possui uma chave associada, isso ocasiona um ponto único de falha. Utilizar multi-assinaturas ameniza o problema, mas ainda assim um hacker que obtenha sua chave pode autorizar transações que você não autorizaria.
Outro problema de se possuir uma única chave é que para evitar perdê-la, muitas vezes a replicamos e apesar de aumentar a disponibilidade para usá-la, aumenta muito os riscos de outra pessoa conseguir acessá-la.
A solução é Dividir a Chave., técnica conhecida em criptografia como compartilhamento secreto.
A ideia basicamente é dividir a chave em N pedaços, de tal forma que de posse de K pedaços quaisquer seja possível reconstruir a chave original, mas de posse de menos do que K pedaços não seja possível obter nenhuma informação do segredo original.
A ideia é simples, mas somente pegar a chave original e dividi-la em N pedaços não vai funcionar, pois cada pedaço vai conter alguma informação da chave original.
Se tivermos N= 2 e K= 2, ou seja vamos separar a chave em duas partes e apenas com as duas estaremos aptos a obtê-la de volta, uma maneira que correta seria, por exemplo: vamos dizer que S, a nossa chave privada, seja um inteiro grande (de 128-bit) e vamos gerar um outro inteiro aleatório R de mesmo tamanho. Com essas duas informações podemos criar duas partes em que uma é simplesmente o inteiro aleatório R e a outra e o inteiro resultante de R⊕S. Essencialmente o S foi encriptada por um bloco de uso único. E agora que temos a parte (R) e a (R⊕S), basta guardá-las separadas, pois de posse de apenas uma das partes não será possível obter nenhuma informação, mas de posse das duas bastaria fazermos (R⊕(R⊕S)) e obteríamos S de novo.
O método descrito acima funciona para qualquer N e K, desde que sejam iguais, pois basta gerar N-1 inteiros aleatórios para serem as N-1 primeiras partes e a última seria um XOR(⊕) de S com todos os inteiros aleatórios, mas para N≠K precisa-se usar um método diferente.
Vamos supor agora que eu ainda queira dividir a minha chave em duas partes e que precise das duas para obtê-la de volta. Seja P um número primo muito grande, mas que não precisa ser secreto, e que tanto o nossa chave S quanto um inteiro aleatório R estejam no intervalo [0,P-1]. Sejam também X1 e X2 as partes da chaves que vamos guardar separadas, tais que: X1=(S+R)mod P e X2=(S+2R)mod P. Com apenas uma dessas duas partes seria impossível obter S de volta pois R foi gerado aleatoriamente num intervalo muito grande (pois P é um primo grande), mas de posse das duas partes, bastaria operar (2X1 -X2)mod P e teríamos S de volta.
É fácil perceber que o método acima funciona para qualquer N pois as partes são obtidas por (S+XR)mod P, onde X é o índice da parte (a 3ª parte seria (S+3R)mod P), mas como a função que aplicamos é linear o K mínimo sempre é dois, pois com quaisquer dois pontos se obtém a reta que passa por eles.
Para que sejam necessários mais pontos para recuperar a chave original, basta utilizar funções de graus maiores. Para K = 3, bastaria obter as partes computando (S+XR1+X²R2)mod P, onde R1 e R2 são números aleatórios distintos, pois a partir de quaisquer 3 pontos é possível se obter a parábola que passa por eles. Por motivos óbvios K≤N.

## Prova de Reserva

Para dar um certo conforto aos seus clientes, principalmente após o ocorrido com o Mt. Gox, as casas de câmbio de bitcoins precisam provar que mantém alguma fração do dinheiro que os seus clientes depositam.
A prova pode ser dividida em duas partes: a primeira é provar quanto se tem na reserva e a segunda e provar a sua demanda de depósitos, com essas duas informações é fácil encontrar a porcentagem de bitcoins que a empresa mantém.
A primeira parte é a mais simples: é só fazer uma transferência para a própria empresa da quantia que se quer assumir como reserva financeira. Para garantir que foi a própria empresa que de fato realizou a transação, basta que ela assine uma "string-desafio" gerada imparcialmente. Se a string for assinada com a mesma chave que gerou a primeira transação, isso prova que a empresa possui aquela quantia na reserva. É importante notar que esse procedimento não garante que essa quantia é tudo que a empresa possui guardada, mas que ela possui pelo menos aquele valor.
Para provar a demanda de depósitos é necessário utilizar uma Árvore de Merkle. Essa Árvore deve ser construída pela própria empresa e deve conter as contas de todos os cliente como folhas da árvore, bem como seus depósitos. A única modificação necessária nessa árvore é a adição de um atributo nos ponteiros de hash, para indicar a soma total dos depósitos da sub-árvore logo abaixo dele.
A partir do momento que a empresa assinar a raiz da árvore, com a mesma chave que usou anteriormente, qualquer cliente pode verificar se a sua conta está mesmo lá. Ao pedir que lhe provem que a sua conta está na árvore que foi divulgada, a empresa deve mostrar ao cliente uma sub árvore que contenha todos os ponteiros de hash da raiz até a sua conta. Assim o cliente pode verificar se o ultimo hash na sub-árvore contém o seu valor de depósito e se os hashs acima dele também são válidos.