Endereço

Um formato fácil de compartilhar de um script de travamento

Diagrama mostrando um endereço sendo usado para compartilhar um tipo específico de 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:

Diagrama mostrando um endereço 1 sendo decodificado em 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

Endereço P2PKH de exemplo:
153zuTTUBpXSnmXd9MbFB2R6rihfSyvaMM
34 caracteres
ScriptPubKey P2PKH de exemplo:

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.

Ícone Ferramenta Endereço (Base58)

Endereço (Base58)

Codifique el hash160 de una clave pública o script en una dirección heredada.

1 byte
0 bytes
0 bytes
Tipo de dirección

Codificación Base58 de los datos anteriores

0 caracteres

Esses endereços diferenciam maiúsculas de minúsculas.

P2SH

Base58

Endereço P2SH de exemplo:
3Pg4E5dUK1XGey3D6oytWjXcQNP5oVfFhb
34 caracteres
ScriptPubKey P2SH de exemplo:

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.

Ícone Ferramenta Endereço (Base58)

Endereço (Base58)

Codifique el hash160 de una clave pública o script en una dirección heredada.

1 byte
0 bytes
0 bytes
Tipo de dirección

Codificación Base58 de los datos anteriores

0 caracteres

Esses endereços diferenciam maiúsculas de minúsculas.

P2WPKH

Bech32

Endereço P2WPKH de exemplo:
bc1qqhuajey73c8xc0nwwtm786700hcwuyruw5g3cl
42 caracteres
ScriptPubKey P2WPKH de exemplo:

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.

Ícone Ferramenta Endereço (Bech32)

Endereço (Bech32)

Codifique um script de travamento P2WPKH, P2WSH ou P2TR em um endereço.

ScriptPubKey
Versão
0 bytes
0 bytes Tipo:
Rede

Codificação Bech32 do ScriptPubKey

0 caracteres

    P2WSH

    Bech32

    Endereço P2WSH de exemplo:
    bc1qqay4wd2ts5qwselvmxfuuaeym6dsw6p5ecejd4xqkm44p9qdfk6svgkhkr
    62 caracteres
    ScriptPubKey P2WSH de exemplo:

    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).

    Ícone Ferramenta Endereço (Bech32)

    Endereço (Bech32)

    Codifique um script de travamento P2WPKH, P2WSH ou P2TR em um endereço.

    ScriptPubKey
    Versão
    0 bytes
    0 bytes Tipo:
    Rede

    Codificação Bech32 do ScriptPubKey

    0 caracteres
      • 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

      Endereço P2TR de exemplo:
      bc1pkmctluxnmyq708kkf6x8flf47vsdwmhwdv77xjnnl6h500sf922qwdk7tx
      62 caracteres
      ScriptPubKey P2TR de exemplo:

      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).

      Ícone Ferramenta Endereço (Bech32)

      Endereço (Bech32)

      Codifique um script de travamento P2WPKH, P2WSH ou P2TR em um endereço.

      ScriptPubKey
      Versão
      0 bytes
      0 bytes Tipo:
      Rede

      Codificação Bech32 do ScriptPubKey

      0 caracteres

        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.
        echeveria, (no IRC)

        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:

        1. 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.
        2. 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.
        3. 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ços Base58 ao longo do tempo
        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ços Bech32 ao longo do tempo
        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ços Bech32m ao longo do tempo
        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.
        BIP 350

        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.