WEB3DEV

Cover image for Por que o Endereço do Bitcoin Não é Como um Número de Conta
Panegali
Panegali

Posted on

Por que o Endereço do Bitcoin Não é Como um Número de Conta

O endereço do bitcoin é um conjunto de caracteres alfanuméricos que também pode ser codificados em um formato de código QR. Os endereços do bitcoin têm prefixos uniformes 1, 3, bc1 etc., e cada tipo de prefixo tem um significado. Os endereços do bitcoin são usados ​​para receber pagamentos de bitcoin de outros detentores de bitcoin.

O que exatamente são esses caracteres alfanuméricos? Por que esses caracteres usados ​​não são nomes? Bem, a rede Bitcoin é descentralizada, sem nenhuma autoridade central que controle quem possui uma certa quantidade de bitcoin. A segurança do Bitcoin depende da descentralização, cálculos matemáticos e criptografia.

O endereço do bitcoin desempenha um papel vital no processo matemático e na criptografia que nos permite estabelecer provas de propriedade usando criptografia de chaves pública e privada.

Inicialmente, todo usuário de bitcoin possui algumas chaves/pares que são gerados por seus aplicativos de carteira. Esses pares de chaves vêm na forma de uma chave privada e pública, chaves públicas ou, às vezes, scripts são convertidos em endereços de bitcoin para receber bitcoin de outros usuários bitcoin, e as chaves privadas são usadas para criar assinaturas para gastar esses bitcoins.

Vejamos o processo de geração de um endereço da camada base que é a chave privada.

Chave privada

A chave privada é um número aleatório muito grande, um número de 256 bits selecionado aleatoriamente, de uma fonte de entropia ou aleatoriedade. É muito importante usar uma boa fonte de aleatoriedade ao gerar uma chave privada, geralmente um gerador de números pseudo-aleatórios criptograficamente seguro (CPRNG) é usado para gerar chaves privadas porque ele usa uma fonte de aleatoriedade de qualidade.

(Observe que não é aconselhável usar um gerador de números aleatórios de linguagem de programação padrão para gerar chaves privadas, porque é determinístico e segue um determinado algoritmo para gerar os números que parecem aleatórios, mas não são. Se um invasor souber o algoritmo combinado com alguns detalhes, como a hora em que a chave privada é gerada, ele pode ser capaz de regenerar a chave privada. O CPRNG usa os geradores de números aleatórios do hardware do sistema operacional que não são determinísticos e, portanto, mais seguros).

Exemplo de chave privada gerada aleatoriamente.

1384017014564581673784225148274743428035711376255840355808824913

Elas são chamadas de chaves privadas porque é importante ocultá-las o máximo possível, pois qualquer um que se apossar de sua chave privada pode gastar os fundos enviados para as chaves públicas geradas a partir dessas chaves privadas.

Chave pública

As chaves privadas são usadas para criar uma chave pública a partir de uma função unidirecional também conhecida como função assimétrica. São chamadas de unidirecional porque usando a chave privada sempre podemos gerar a chave pública, mas usando a chave pública é inviável gerar a chave privada. A função usa uma multiplicação de curva elíptica.

A chave privada k é uma entrada da função de geração de chave pública.

A curva elíptica para bitcoin é gerada a partir de um padrão definido como secp256k1. y² = x³ +7 sobre um número primo muito grande que é um ponto distribuído aleatoriamente.

Este é um exemplo de secp256k1 sobre números reais.

Um ponto na curva é selecionado como o ponto gerador G.

A função calcula

k(chave privada) *G (ponto gerador) = K (a chave pública resultante),

k*G = K

Por exemplo, k = 7, portanto 7*G = K,

7*G = G + G + G + G + G + G + G.

Isso basicamente significa que k*G é um ponto na curva elíptica com os eixos x e y, sempre que tivermos k (chave privada), isso resultará na mesma chave pública K (x,y).

Mas tendo a chave pública K (x,y), é impossível gerar a chave privada k, pois é o mesmo que resolver o conhecido problema do logaritmo discreto (https://en.wikipedia.org/wiki/Discrete_logarithm), que é como tentar todas as combinações possíveis de Gs na curva, a curva é uma grade muito grande com pontos por toda a curva, e é difícil saber quantas combinações são feitas para gerar os pontos-chave públicos.

Portanto, o cálculo é unidirecional, o que significa que calcular a chave privada a partir da chave pública é praticamente inviável. A chave pública são dois números de 256 bits que são valores x e y.

Por exemplo

x=55066263022277343669578718895168534326250603453777594175500187360389116729240

y= 32670510020758816978083085130507043184471273380659243275938904335757337482424

Quando os bits são concatenados, o resultado é um número de 512 bits que é a chave pública.

550662630222773436695787188951685343262506034537775941755001873603891167292403267051002075881697808308513050704318447127 3380659243275938904335757337482424

Chave pública descompactada

Existem duas maneiras de representar as chaves públicas, uma é a chave pública não compactada, usando os valores x e y com um prefixo para indicar que é uma chave pública não compactada (prefixo+x+y)

Um prefixo 04 é usado como prefixo de chaves públicas não compactadas e, portanto, resulta em 520 bits.

Por exemplo

04550662630222773436695787188951685343262506034537775941755001873603891167292403267051002075881697808308513050704318447 1273380659243275938904335757337482424

O resultado é a chave pública descompactada.

Chave Pública Comprimida

Usando o valor de x, podemos calcular o valor de y com a função y² = x³ +7. Resolvemos e obtemos dois valores (+,-) y porque estamos calculando a raiz quadrada de (x³ +7) para obter y. O y inicial pode ser o y negativo ou o positivo (mas, na realidade, o y negativo não é negativo, mas y módulo da ordem primária, que resulta em um número positivo).

Podemos omitir y e adicionar apenas o valor de x para economizar espaço, o que é significativo para o tamanho da blockchain do bitcoin, quase 50% de redução no tamanho da chave pública.

Em chaves públicas compactadas, usamos 02 ou 03 como prefixo. Quando 02 é usado, o valor do eixo y é positivo e quando 03 é usado, o eixo y é negativo.

O resultado é um valor de 264 bits em vez do valor inicial de 520 bits com os eixos x e y.

Exemplo: 0255066263022277343669578718895168534326250603453777594175500187360389116729240

Agora você tem a chave pública que pode compartilhar com todos para receber bitcoin (isso significa que alguém pode bloquear uma saída com sua chave pública). Curiosamente você também pode combinar sua chave pública com outra chave pública para receberem bitcoin juntos como uma conta conjunta convencional. No bitcoin, você pode especificar o número de assinaturas das chaves públicas combinadas que serão necessárias para desbloquear o bitcoin: 1, 2 ou N.

Você possui o bitcoin enviado para sua chave pública e pode gastá-lo a qualquer momento assinando com sua chave privada para provar que você possui a saída e a assinatura pode ser verificada por qualquer pessoa na rede bitcoin.

Tipos de ScriptPubKey (Templates).

P2PK

Usar apenas a chave pública para criar uma saída é chamado de pagamento para uma chave pública (P2PK). É uma forma padronizada de criar uma saída de transação. A chave pública é adicionada no campo scriptPubKey da saída da transação, junto com outros parâmetros que nós discutiremos mais tarde. Podemos continuar usando isso ou usar uma abordagem melhor porque essa chave pública não é legível e podemos errar facilmente ao escrevê-la, também por que não reduzir o tamanho da chave pública? E se eu quiser mais de 3 contas de bitcoin unidas?

Temos dois tipos de endereços bitcoin, um de um hash de chave pública e outro de um hash de script de bloqueio.

P2PKH

O hash das chaves públicas é gerado a partir da chave pública por meio do hash duplo da chave pública primeiro com a função de hash sha256, que converte a chave pública em um valor de hash de 256 bits.

Em seguida, o hash de 256 bits será inserido em uma função de hash RIPEMD160 que converte o hash de 256 bits em outro hash de 160 bits. O resultado é o hash da chave pública.

hash de chave pública = ripemd160(sha256(chave-pública))

Exemplo: 6034c213bdf29c1f1c4158c4aba24b3714803055

(observe que este é um formato de hash de chave pública, não necessariamente um hash de chave pública)

O resultado é geralmente chamado de Pay-to-Pubkey Hash (P2PKH).

P2SH

Mencionamos que podemos criar uma conta bitcoin conjunta combinando até três chaves públicas e especificando o número de assinaturas que serão necessárias para desbloquear o bitcoin. Mas o uso de chaves públicas brutas limita-se a apenas três chaves públicas juntas e, além disso, ao criar a conta conjunta, o script de bitcoin oferece a capacidade de adicionar um script complexo com uma condição de gasto condicional. (Observe que esse script está basicamente combinando as chaves públicas, com códigos de operação do bitcoin e talvez caminhos de gastos. Leia sobre como o script pode ser construído aqui https://en.bitcoin.it/wiki/Script).

O hash do script também é gerado a partir do script construído, fazendo primeiro o hash duplo do script, com a função hash sha256, que converte o script em um valor de hash de 256 bits.

Em seguida, o hash de 256 bits será inserido em uma função de hash RIPEMD160 que converte o hash de 256 bits em outro hash de 160 bits. O resultado é o hash da chave pública.

hash de script = ripemd160(sha256(script))

Exemplo: 54c557e07dde5bb6cb791c7a540e0a4796f5e97e

(observe que este é um formato de hash de script, não necessariamente um hash de chave pública)

O resultado geralmente é chamado de pay to script hash (P2SH)

A combinação de P2PK, P2PKH e P2SH possui todos os códigos de operação necessários que são adicionados antes de bloquear o bitcoin para eles.

P2PK

PubKey EQUALVERIFY CHECKSIG

P2PKH

O_P_DUP HASH160 PubkeyHash EQUALVERIFY CHECKSIG

P2SH

HASH160 scriptHash EQUAL

(EQUALVERIFY, CHECKSIG, HASH160 e O_P_DUP são exemplos de códigos de operação usados ​​no bitcoin em um script de bloqueio).

Temos outros formatos de saída que são chamados de saídas de segregated witness (testemunhas segregadas), que omitem os códigos de operação e usam apenas uma versão de script, no início, para especificar como construir o script de desbloqueio e avaliar quando da verificação.

P2WPKH

0 PubKeyHash

0 é a versão do script. pelo qual o hash da chave pública é frequentemente referido como um programa testemunha.

P2WSH

0 SHA256(P2SH)

Aqui 0 também é a versão do script e SHA256(P2SH) é o programa testemunha.

A principal diferença entre P2WPKH e P2WSH é que o programa testemunha P2WPKH é de 160 bits, enquanto o P2WSH é de 256 bits. Isso reduz o tamanho das saídas de transação removendo os códigos de operação de bloqueio e também fornece uma maneira de introduzir novos algoritmos de verificação usando uma nova versão de script.

Isso é o que é frequentemente visto na blockchain do bitcoin em saídas de transações, não em endereços de bitcoin, apenas chaves públicas, hashes de chaves públicas e hashes de scripts.

Seu saldo é a soma do valor de todas as saídas de transação não gastas associadas à sua chave pública, hash de chave pública ou script com uma condição de bloqueio que você pode desbloquear.

Endereços

O endereço do bitcoin é uma forma de codificar este P2PK, P2PKH, etc., em um formato mais fácil de ler, com menos caracteres e às vezes omitindo caracteres semelhantes, distinguindo entre os tipos de SciptPubkeys codificados facilmente com um prefixo que indicará que este é um P2PKH ou que este é um P2SH. Ele também fornece detecção e correção de erros.

ScriptPubKeys são codificados usando a função de codificação base58check para P2PK, P2PKH, P2SH ou a função de codificação bech32 para P2WPKH e P2WSH. Para P2TR (um novo tipo de scriptPubKey para a versão segwit 1) o código resultante é o endereço bitcoin.

O código também pode ser decodificado para obter o valor exato antes de construir uma transação. A codificação é uma maneira fácil de compartilhar as chaves e distinguir o scriptPubkeys, também ajuda na interoperabilidade entre aplicativos de carteira.

Codificação Base58check.

P2PKH

O_P_DUP HASH160 a1f75380c839f1815531221193a50ac1b7f35909 EQUALVERIFY CHECKSIG

Endereço P2PKH codificado em Base58check

14cxpo3MBCYYWCgF74SWTdcmxipnGUsPw3

1 é adicionado pela função de codificação como o identificador de que o endereço é um P2PKH, 4 é um prefixo de um P2PK, enquanto os endereços P2SH têm um prefixo de 3.

Saiba como funciona a codificação base58check (https://en.bitcoin.it/wiki/Base58Check_encoding)

Codificação bech32.

O bech32 é um formato de endereço segwit usado para codificar PWPKH ou P2WSH e P2TR.

P2WPKH

0 751e76e8199196d454941c45d1b3a323f1433bd6

Endereço P2WPKH codificado em bech32

bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4

Saiba como funciona a codificação bech32 (https://www.youtube.com/watch?v=NqiN9VFE4CU)

Conclusão

Os endereços do bitcoin são tecnicamente um conjunto de caracteres que codificam um determinado tipo de saída de transação bitcoin (P2PKH, P2SH, P2WPKH etc) e o prefixo no endereço especifica qual tipo de saída é codificada. Um tipo de saída é usado para receber bitcoin, adicionando-o em uma transação como o script de bloqueio conhecido como scriptPubKey de uma saída desbloqueada. Ele especifica a próxima cadeia de propriedade e a pessoa que pode desbloquear o script de bloqueio reivindica a propriedade da saída. Em transações de bitcoin vemos apenas tipos de saída, não endereços, e para construir o equilíbrio dos usuários, reunimos a soma dos valores de todos os satoshi (menor parte de um bitcoin) nas saídas bloqueadas que o usuário pode desbloquear.

Os endereços do bitcoin codificam os tipos de saída, auxiliam na legibilidade, na interoperabilidade entre os aplicativos de carteira e, às vezes, na detecção e correção de erros.

Os endereços sempre “recebem” bitcoin? Pode-se argumentar que não... Quando o bitcoin é “enviado para um endereço”, na verdade, o que acontece é que uma nova saída (não gasta) é criada em uma transação que só pode ser desbloqueada (gasta), usando um scriptSig que corresponde ao scriptPubKey codificado pelo endereço. Portanto, realmente não há um momento no tempo em que o bitcoin seja “enviado para um endereço”… O endereço nunca é um “local na blockchain” real, por assim dizer.


Referências

https://github.com/bitcoinbook/bitcoinbook/

https://river.com/learn/terms/b/bech32/#:~:text=Bech32%20is%20an%20encoding%20scheme,includes%20an%20error%20detection%20mecanismo .

https://security.stackexchange.com/questions/4889/using-computer-random-number-generators-to-produce-keys-it-is-secure#:~:text=All%20software%20is%20deterministic., not%20even%20be%20pseudo%2Drandom .

https://en.bitcoin.it/wiki/Secp256k1

https://bitcoin.stackexchange.com/questions/71344/what-is-a-discrete-logarithmic-assumption-how-does-it-set-up-trustless-proofs#:~:text=The%20discrete%20logarithm %20problema%20é,de%20muito%20de%20%20criptografia moderna.&text=onde%20b%20%2C%20a%20%2C%20and%20p,precisa%20a%20bruto%20force%20it .

https://bitcoin.stackexchange.com/questions/49158/why-do-you-use-bitcoin-addresses-instead-of-public-keys

https://en.bitcoin.it/


Artigo escrito por Abubakar Sadiq Ismail. Traduzido por Marcelo Panegali.

Oldest comments (0)