Chaves
Chaves privadas, chaves públicas, endereços
As chaves são usadas para controlar a posse dos bitcoins.
Para "enviar" e "receber" bitcoins, tudo o que você precisa é gerar um par de chave privada e chave pública.
- A chave pública é colocada na trava de uma saída quando você quer "enviar" bitcoins a alguém em uma transação.
- A chave privada é então usada para criar uma assinatura que destrava aquela saída quando você quer "gastá-la" como entrada em uma nova transação.
O par de chave privada e chave pública está matematicamente conectado. Assim como as assinaturas.
Então, quando você fornece uma assinatura junto de uma chave pública, haverá uma conexão matemática entre as duas, e é isso que "destrava" os bitcoins para serem gastos em transações.
Em outras palavras, a assinatura permite que você forneça uma prova de uso único de que é o dono da chave privada da qual a chave pública foi criada. Ninguém consegue produzir uma assinatura que tenha conexão matemática com a chave pública a menos que tenha acesso à chave privada original.
Usar assinaturas significa que você não precisa revelar a chave privada original, o que impede que alguém roube quaisquer outros bitcoins travados à mesma chave pública.
Esse mecanismo é conhecido como criptografia de chave pública. Ele já existia antes de o Bitcoin ser criado, e o Satoshi simplesmente o usou como forma de controlar a posse das moedas.
Por fim, no Bitcoin convertemos essas chaves públicas em endereços, que são simplesmente codificações amigáveis das chaves públicas.
Então, quando você "envia" bitcoins para o endereço de alguém, na verdade está apenas travando bitcoins à chave pública dessa pessoa.
Chave Privada
Chave Privada
Exemplo de chave privada
f34a00a9033e58dd31398ec281c7edb670d4f2d4dbd826238b4510a3d3120336 Uma chave privada é um número de 256 bits gerado aleatoriamente.
O intervalo de chaves privadas válidas vai de 0 a 115792089237316195423570985008687907852837564279074904382605163141518161494336.
As chaves privadas são normalmente exibidas como strings hexadecimais de 32 bytes. Mas, em última análise, ainda é só um número aleatório.
O intervalo válido de chaves privadas é ligeiramente menor que o máximo valor possível de 256 bits. Isso se deve à matemática envolvida em como a chave pública subsequente é calculada.
Há tantas chaves privadas possíveis que gerar uma aleatoriamente já é suficiente para garantir que ninguém mais vá gerar a mesma que você. Parece difícil de acreditar, mas, honestamente, um número de 256 bits é tão grande que é efetivamente impossível que dois indivíduos gerem o mesmo número aleatório dentro desse intervalo.
As chaves privadas também podem ser convertidas para o formato WIF (Wallet Import Format). É como um formato de endereço para chaves privadas, e às vezes é usado ao importá-las para carteiras.
Chave Pública
Chave Pública
Exemplo de chave pública (comprimida)
03359f98bd3d98d7b6478ab0cef926a62c2e589bdbfbea5c0dc43d3e8b3d06ecda Uma chave pública é um conjunto de coordenadas calculado a partir de uma chave privada.
Esse conjunto de coordenadas é calculado usando criptografia de curva elíptica, que é o que cria uma conexão matemática entre a chave privada e a chave pública.
Essa conexão matemática especial é o que nos permite gerar assinaturas a partir da chave privada também, as quais terão igualmente uma conexão matemática com a chave pública. Isso significa que podemos provar que temos a chave privada sem precisar revelá-la.
De qualquer forma, quando você vê uma chave pública, está na verdade olhando para um conjunto de coordenadas x e y em um gráfico muito grande.
Chaves públicas comprimidas. Embora a chave pública seja um conjunto de coordenadas x e y, devido à matemática da criptografia de curva elíptica não precisamos de fato armazenar a coordenada y completa da chave pública. Em vez disso, podemos simplesmente armazenar o valor x de 32 bytes (256 bits), junto de um prefixo de 1 byte para indicar se a coordenada y é par ou ímpar. Isso é conhecido como chave pública comprimida, e é o tipo mais comum de chave pública que você vai ver e usar no Bitcoin.
Endereço
Um endereço é basicamente uma codificação amigável de uma chave pública.
Há algumas vantagens em usar um endereço em vez de uma chave pública bruta:
- Mais curto. Um endereço é mais curto que uma chave pública. Isso o torna mais rápido de escrever à mão, caso você precise.
- Detecção de erros. Um endereço contém um checksum, que ajuda a detectar erros caso você cometa algum engano. Isso ajuda a evitar enviar bitcoins para uma chave pública inválida e perdê-los para sempre.
Agora, existem na verdade tipos diferentes de endereços que você pode usar no Bitcoin. O tipo que você usa depende do tipo de trava que você quer colocar em uma saída:
Endereço Base58 (P2PKH)
Este é um formato de endereço legado. Esse formato era comumente usado até 2016, antes de a atualização Segregated Witness ser introduzida. Você ainda pode usá-lo, mas agora é mais comum usar endereços Bech32 (veja abaixo).
Um endereço base58 corresponde a um script de travamento P2PKH legado.
Para criar um endereço base58, você primeiro precisa encurtar a chave pública passando-a por um HASH160. Isso a reduz de 33 bytes para um hash de chave pública de 20 bytes:
HASH160
Exemplo de hash de chave pública
0777b9e7e78778c1a68b70e9c0760c25ef5f08e2 Você então passa esse hash de chave pública pela codificação Base58Check, que adiciona um checksum ao hash de chave pública e depois converte tudo em caracteres base58.
Há também um prefixo 00 de 1 byte no início, usado para identificar que o endereço contém um hash de chave pública e deve ser usado para criar uma trava P2PKH:
Endereço (Base58)
Exemplo de endereço (Base58)
1gVA4kYG2ELTeHFUon7AbEKPgwxHVwn58 Então, se você "enviar" bitcoins para este endereço usando uma carteira de bitcoin, a carteira vai criar um script de travamento P2PKH usando o hash de chave pública contido no endereço.
O formato de endereço base58 também é usado para P2SH, que contém um hash de script em vez de um hash de chave pública.
Endereço Bech32 (P2WPKH)
Um endereço bech32 corresponde a um script de travamento P2WPKH.
Para criar um endereço bech32, você começa encurtando uma chave pública comprimida de 33 bytes, passando-a por um HASH160 para obter um hash de chave pública de 20 bytes:
HASH160
Exemplo de hash de chave pública
0777b9e7e78778c1a68b70e9c0760c25ef5f08e2 Você só pode usar chaves públicas comprimidas ao criar um endereço bech32.
Antes de converter esse hash de chave pública em um endereço bech32, você precisa construir o ScriptPubKey P2WPKH completo.
Em resumo, é um prefixo 0014 seguido do hash de chave pública de 20 bytes. Por exemplo:
00140777b9e7e78778c1a68b70e9c0760c25ef5f08e2 Você pode então converter esse ScriptPubKey P2WPKH completo em bech32:
Endereço (Bech32)
Exemplo de endereço (Bech32)
bc1qqammnel8sauvrf5twr5uqasvyhh47z8zkta6nm Então, se você "enviar" bitcoins para este endereço usando uma carteira de bitcoin, a carteira vai criar um script de travamento P2WPKH usando o hash de chave pública contido no endereço.
Enquanto um endereço base58 é criado usando apenas o hash de chave pública, um endereço bech32 é criado a partir de um hash de chave pública dentro de um ScriptPubKey completo.
O formato de endereço bech32 também é usado para scripts de travamento P2WSH, que contêm um hash de script em vez de um hash de chave pública.
Resumo
Para enviar e receber bitcoins você precisa ser capaz de gerar um par de chaves: uma chave privada e uma chave pública.
Essas chaves privadas e chaves públicas são apenas números que você pode gerar no seu próprio computador. Elas estão matematicamente conectadas, e é essa conexão matemática que nos permite "enviar" e "receber" bitcoins. Esse tipo especial de matemática é conhecido como criptografia de curva elíptica, e já existia antes do Bitcoin.
No Bitcoin, normalmente convertemos a chave pública em um endereço, o que a torna mais curta e mais amigável ao enviar bitcoins usando carteiras.
Esses endereços contêm o hash de chave pública, e correspondem ao tipo específico de trava que queremos colocar em alguns bitcoins (por exemplo, P2PKH ou P2WPKH). O tipo de endereço, portanto, indica como o hash de chave pública é travado e destravado usando a linguagem Script interna do Bitcoin.
Mas, em última análise, é mais fácil pensar em um endereço como uma codificação amigável de uma chave pública.
Os endereços não são usados internamente no bitcoin. Se você navegar pelos dados brutos na blockchain, vai encontrar apenas chaves públicas e assinaturas.
Se você tem interesse em fazer alguma programação de Bitcoin por conta própria, gerar suas próprias chaves (e endereços) é uma forma divertida de começar. Só esteja preparado para perder bitcoins se fizer algo errado… não me pergunte como eu sei.
Mas, se você tomar cuidado, deve ficar tudo bem.