Endereço
Um formato fácil de compartilhar de um script de travamento
Um endereço representa um tipo específico de script de travamento a ser colocado sobre alguns bitcoins.
É basicamente uma codificação amigável de um hash de chave pública ou de um hash de script.
Então, quando você dá um endereço a alguém, está pedindo para travar seus bitcoins a um padrão de script específico usando o hash da chave pública ou o hash do script contido dentro do endereço.
Uso
Como os endereços são usados no Bitcoin?
Os endereços são usados quando você quer enviar bitcoins a alguém usando uma carteira de bitcoin.
Quando você faz uma transação usando uma carteira de bitcoin, a carteira decodifica o endereço para determinar o tipo de padrão de script de travamento a colocar na saída, e extrai o hash da chave pública ou o hash do script e o coloca dentro do ScriptPubKey.
Por exemplo, um endereço 1 contém um hash de chave pública e corresponde a um script de travamento P2PKH:
Assim, os endereços em si não aparecem dentro dos dados brutos na blockchain — são apenas uma alternativa amigável a enviarmos uns aos outros scripts de travamento brutos.
Tipos
Quais são os diferentes tipos de endereço de bitcoin?
Diferentes tipos de endereço correspondem a diferentes padrões de scripts de travamento padrão.
Nem todo script de travamento padrão tem o seu próprio endereço. Apenas os scripts de travamento mais usados recebem o seu próprio formato de endereço.
Não use nenhum dos endereços abaixo. Estes são apenas exemplos, e você não tem a chave privada para conseguir destravar quaisquer bitcoins enviados a eles.
P2PKH
Base58
34 caracteres ASM
OP_DUP
OP_HASH160
OP_PUSHBYTES_20
2c71abd5cee90ffe6ec47a5ee0ef339421fcdf37
OP_EQUALVERIFY
OP_CHECKSIG
Hex
76a9142c71abd5cee90ffe6ec47a5ee0ef339421fcdf3788ac Um endereço 1 contém um hash de chave pública e corresponde a um script de travamento P2PKH.
O endereço é uma codificação Base58Check do hash da chave pública. Isso também inclui um prefixo de byte de versão de 00 para forçar o primeiro caractere do endereço a ser um 1, o que ajuda a distingui-lo de um endereço P2SH de aparência semelhante.
Endereço (Base58)
Esses endereços diferenciam maiúsculas de minúsculas.
P2SH
Base58
34 caracteres ASM
OP_HASH160
OP_PUSHBYTES_20
f12445f0135fb5468094545458a78265af93e6a3
OP_EQUAL
Hex
a914f12445f0135fb5468094545458a78265af93e6a387 Um endereço 3 contém um hash de script e corresponde a um script de travamento P2SH.
O endereço é uma codificação Base58Check do hash de script de 20 bytes. Isso também inclui um prefixo de byte de versão de 05 para forçar o primeiro caractere do endereço a ser um 3, o que ajuda a distingui-lo de um endereço P2PKH de aparência semelhante.
Endereço (Base58)
Esses endereços diferenciam maiúsculas de minúsculas.
P2WPKH
Bech32
42 caracteres ASM
OP_0
OP_PUSHBYTES_20
05f9d9649e8e0e6c3e6e72f7e3ebcf7df0ee107c
Hex
001405f9d9649e8e0e6c3e6e72f7e3ebcf7df0ee107c Um endereço bc1q de 42 caracteres contém um hash de chave pública e corresponde a um script de travamento P2WPKH.
O endereço é uma codificação Bech32 do ScriptPubKey completo em hexadecimal (que contém o hash da chave pública). O endereço tem sempre 42 caracteres de comprimento, o que ajuda a distingui-lo de um endereço P2WSH de aparência semelhante.
Endereço (Bech32)
P2WSH
Bech32
62 caracteres ASM
OP_0
OP_PUSHBYTES_32
074957354b8500e867ecd993ce7724de9b076834ce3326d4c0b6eb50940d4db5
Hex
0020074957354b8500e867ecd993ce7724de9b076834ce3326d4c0b6eb50940d4db5 Um endereço bc1q de 62 caracteres contém um hash de script e corresponde a um script de travamento P2WSH.
O endereço é uma codificação Bech32 do ScriptPubKey completo em hexadecimal (que contém o hash de script de 32 bytes). O endereço tem sempre 62 caracteres de comprimento, o que ajuda a distingui-lo de um endereço P2WPKH de aparência semelhante (que tem 42 caracteres de comprimento).
Endereço (Bech32)
- O hash de script de um P2WSH é um
sha256(script)de 32 bytes - O hash de script de um P2SH legado é um
hash160(script)de 20 bytes
P2TR
Bech32m
62 caracteres ASM
OP_1
OP_PUSHBYTES_32
8ca8274f23bc01ab1bbb30596cbc1098cfd92ca04d90bbb67691412bed191a3f
Hex
51208ca8274f23bc01ab1bbb30596cbc1098cfd92ca04d90bbb67691412bed191a3f Um endereço bc1p de 62 caracteres contém uma chave pública ajustada e corresponde a um script de travamento P2TR.
O endereço é uma codificação Bech32 do ScriptPubKey completo em hexadecimal. O endereço tem sempre 62 caracteres de comprimento e começa com bc1p, o que ajuda a distingui-lo de um endereço P2WSH de aparência semelhante (que começa com bc1q).
Endereço (Bech32)
O P2TR usa a codificação Bech32m. Esta é uma pequena variação da codificação Bech32 usada para P2WPKH e P2WSH.
Propósito
Por que usamos endereços no Bitcoin?
Um endereço é uma alternativa mais conveniente ao uso de scripts de travamento brutos.
Poderíamos simplesmente enviar a outras pessoas um script de travamento completo toda vez que quiséssemos que alguém nos "enviasse" bitcoins, mas isso seria trabalhoso, pois os scripts seriam desajeitados e erros teriam mais chance de acontecer.
Por exemplo, se eu quisesse que alguém me enviasse bitcoins, eu poderia dar a essa pessoa este script de travamento completo para usar:
76a91404a621a724b8e064809d8fb22a65c2d37d01a01888ac
Como alternativa, eu poderia simplesmente dar este endereço em vez disso:
1RainRzqJtJxHTngafpCejDLfYq2y4KBc
Ambos alcançam o mesmo resultado, mas o endereço é mais curto, mais óbvio e mais fácil de compartilhar.
Um endereço é uma forma abreviada de escrever scripts de travamento de um jeito legível por humanos.
Benefícios
Quais são as características dos endereços de bitcoin?
Há alguns benefícios em usar um endereço em vez de um script de travamento bruto:
- Detecção de erros. Um endereço tem um checksum embutido, que permite detectar erros caso o endereço tenha sido digitado incorretamente, o que ajuda a evitar que você envie bitcoins a um endereço inválido e perca as moedas para sempre. Esta é a maior vantagem de usar endereços, na minha opinião.
- Mais conveniente. Um endereço é mais curto que um script de travamento bruto e contém caracteres amigáveis (ou seja, Base58, Bech32). Isso os torna mais fáceis de anotar ou compartilhar por telefone. Não é muito mais fácil, mas é uma leve melhoria.
- Facilmente identificável. Os endereços podem ser facilmente identificados por terem conjuntos de caracteres e estruturas padronizados. Isso ajuda a distinguir um endereço de outros tipos de dados do Bitcoin. Além disso, diferentes tipos de endereço correspondem a diferentes tipos de script de travamento, então as carteiras (e os humanos, com alguma prática) conseguem determinar o tipo de trava que será colocada sobre uma saída simplesmente olhando para o endereço.
Então, novamente, um endereço é simplesmente uma alternativa amigável ao uso de scripts de travamento brutos quando queremos enviar ou receber bitcoins.
História
Os endereços sempre fizeram parte do Bitcoin.
Base58 — Endereços
2009 - presente
| Endereço de exemplo | Tipo de script | Período |
|---|---|---|
| 1RainRzqJtJxHTngafpCejDLfYq2y4KBc | P2PKH | 2009 - presente |
| 3GTCwPn2EqSsAb3JDBo4WuwceVqkZjb83y | P2SH | 2012 - presente |
Os primeiros endereços 1 foram projetados por Satoshi para uso com scripts de travamento P2PKH. Satoshi queria ter uma forma de as pessoas enviarem e receberem bitcoins facilmente, então projetou um formato de endereço que é a codificação Base58check de um hash de chave pública. Esses sempre começam com um 1.
Satoshi escolheu codificar um hash de chave pública em vez de uma chave pública bruta para criar endereços mais curtos.
Esse estilo de formato Base58 para endereços teve continuidade com a introdução dos endereços 3 por Gavin Andresen em 2012 para uso com scripts de travamento P2SH. Eles usam exatamente o mesmo Base58, mas contêm um hash de script, junto com um prefixo 05 para mudar o caractere inicial do endereço para um 3.
Esses são os endereços do estilo "antigo", mas ainda podem ser usados hoje.
Endereços Bech32
2016 - presente
| Endereço de exemplo | Tipo de script | Período |
|---|---|---|
| bc1q5twnm8gznrszgxw0t258ejxgz9nwda6fpfl0wh | P2WPKH | 2016 - presente |
| bc1qdj7v4lgweum6g8r8fjh5gedrwtg0pmf32uxnsvtf27adav96gftsudprkk | P2WSH | 2016 - presente |
O novo formato de endereço Bech32 foi introduzido na atualização Segregated Witness de 2016. Ele foi projetado por Pieter Wuille e Gregory Maxwell (Vídeo no YouTube).
O formato de endereço Bech32 aprimora o formato Base58 ao usar um algoritmo de checksum melhorado, e usa um conjunto de 32 caracteres que não diferencia maiúsculas de minúsculas.
Esse formato de endereço foi introduzido para os novos scripts de travamento P2WPKH e P2WSH. Eles funcionam essencialmente da mesma forma que os scripts P2PKH e P2SH originais que substituem, mas usam o campo Testemunha em vez do campo ScriptSig para o destravamento.
O campo Testemunha ocupa menos espaço dentro de um bloco do que o ScriptSig, então transações que gastam esses novos scripts P2WPKH e P2WSH pagam comparativamente menos em taxas de transação.
Esses são os endereços do estilo "moderno" e são preferíveis aos endereços Base58 do estilo antigo.
Endereços Bech32m
2021 - presente
| Endereço de exemplo | Tipo de script | Período |
|---|---|---|
| bc1ppuxgmd6n4j73wdp688p08a8rte97dkn5n70r2ym6kgsw0v3c5ensrytduf | P2TR | 2021 - presente |
Os endereços Bech32m são basicamente iguais aos endereços Bech32.
A única diferença é uma pequena mudança na forma como o checksum é calculado. Isso se deve a uma fraqueza encontrada na codificação Bech32 original:
O Bech32 tem uma fraqueza inesperada: sempre que o caractere final é um 'p', inserir ou remover qualquer quantidade de caracteres 'q' imediatamente antes dele não invalida o checksum. Isso não afeta os usos existentes de endereços [P2WPKH e P2WSH] devido à sua restrição a dois comprimentos específicos, mas pode afetar usos futuros e/ou outras aplicações que usem a codificação Bech32.
Então os endereços Bech32m são visualmente indistinguíveis dos endereços Bech32, mas seus checksums são mais confiáveis.
Essa codificação de endereço é usada para scripts de travamento P2TR, que foram introduzidos na atualização Taproot em 2021.
Resumo
Já disse isso muitas vezes, mas mais uma para garantir: um endereço é apenas uma codificação amigável de um script de travamento.
À primeira vista, você pode pensar que um endereço é apenas uma codificação de uma chave pública, o que é tecnicamente verdade até certo ponto, mas, para ser mais preciso, ele na verdade representa uma instrução sobre o tipo e o conteúdo do script de travamento a ser colocado sobre uma saída.
Isso porque os endereços podem conter uma codificação de qualquer tipo de dado (por exemplo, hash de script, hash de chave pública ou chave pública ajustada), então não estão limitados a travar saídas apenas a chaves públicas.
Se você está construindo transações brutas à mão, não há necessidade de usar endereços, pois eles não são usados internamente no Bitcoin e não aparecem na blockchain. Em vez disso, os endereços são projetados para serem usados externamente pelos usuários ao enviar bitcoins por meio de carteiras de bitcoin.
Mesmo assim, é bom se familiarizar com os diferentes tipos de endereço e os diferentes tipos de script de travamento aos quais eles se referem.