Como codificar e decodificar Base58Check
Para codificar:
- Cole o hex em Entrada · Hex: primeiro o byte de versão, depois o payload. Espaços, dois-pontos e prefixos
0xsão aceitos. - Leia o resultado em Saída · Base58Check. A ferramenta calcula o checksum e o anexa antes de codificar.
- Mantenha o Alfabeto em Bitcoin para o Bitcoin e a maioria dos forks.
Para decodificar, clique em Base58Check → Hex no seletor de direção e cole o endereço ou a chave. O decodificador converte a string, recalcula o checksum e devolve o payload (ainda começando com o byte de versão) somente se os 4 bytes do checksum conferirem. Um único caractere digitado errado gera “checksum não confere: a string foi digitada errado ou está corrompida.”
O que o Base58Check acrescenta ao Base58
O Base58 simples não tem detecção de erros: um erro de digitação gera uma string diferente, mas igualmente válida. O Base58Check resolve isso com dois acréscimos:
version (1 byte) | payload | first 4 bytes of SHA-256(SHA-256(version | payload))
O conjunto inteiro é então codificado em Base58, então os bytes zero iniciais viram 1s. O byte de versão escolhe a rede e o tipo de dado e, como fica na frente do número, também determina o primeiro caractere do resultado.
Bytes de versão e prefixos
O mesmo hash de 20 bytes, 62e907b15cbf27d5425399ebf6f0fb50ebb88f18, com bytes de versão diferentes:
| Versão | Significado | Primeiro caractere | Resultado |
|---|---|---|---|
00 | Endereço Bitcoin P2PKH | 1 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
05 | Endereço Bitcoin P2SH | 3 | 3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6 |
6f | Endereço P2PKH de testnet | m ou n | mpXwg4jMtRhuSpVq4xS3HFHmCmWp9NyGKt |
c4 | Endereço P2SH de testnet | 2 | 2N2GDNJ4rEm6NxfMC9ck8VuRdheQzXWaNZv |
A primeira linha é o endereço que recebeu a recompensa do bloco gênese do Bitcoin. As outras linhas só ilustram o byte de versão: envolver um hash de chave pública num byte de versão P2SH não gera um endereço P2SH utilizável, já que o P2SH é o hash de um script.
Chaves privadas WIF
O Wallet Import Format é Base58Check com o byte de versão 80 e uma chave privada de 32 bytes. Um byte 01 no final indica uma chave cuja chave pública é usada na forma comprimida. Com a conhecida chave de exemplo da wiki do Bitcoin:
| Entrada hex | Base58Check |
|---|---|
80 + 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D | 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ |
a mesma + 01 | KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617 |
Chaves WIF não comprimidas começam com 5, as comprimidas com K ou L. Esta chave de exemplo é pública; nunca a use para fundos reais.
Base58Check em Python
O checksum são duas chamadas de SHA-256 da biblioteca padrão. Com um pequeno codificador Base58:
import hashlib
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58encode(data: bytes) -> str:
n = int.from_bytes(data, "big")
out = ""
while n:
n, r = divmod(n, 58)
out = ALPHABET[r] + out
zeros = len(data) - len(data.lstrip(b"\0"))
return "1" * zeros + out
def b58check(payload: bytes) -> str:
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return b58encode(payload + checksum)
b58check(bytes.fromhex("0062e907b15cbf27d5425399ebf6f0fb50ebb88f18"))
# '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
Para verificar uma string no código, decodifique-a com Base58, separe os últimos 4 bytes e compare-os com o hash duplo do resto. Mais sobre manipulação de bytes em Python na página de Python.
Problemas comuns
- Checksum não confere. A string tem um erro de digitação, foi cortada ou é Base58 simples sem checksum (endereços Solana e hashes IPFS são Base58 simples; use o decodificador Base58 para eles).
- “Curto demais para conter o checksum de 4 bytes”. O valor decodificado tem menos de 4 bytes, então não pode ser Base58Check.
- Caractere inesperado
"0","O","I"ou"l". Não está no alfabeto Base58; confira a transcrição. - Primeiro caractere errado depois de codificar. Confira o byte de versão. Sem ele, um hash de 20 bytes geralmente vira uma string que não começa com
1.
Perguntas frequentes
Como o checksum do Base58Check é calculado?
Calcule o SHA-256 do payload (incluindo o byte de versão), calcule o SHA-256 do resultado de novo e pegue os 4 primeiros bytes. Esses 4 bytes são anexados antes da codificação Base58.
Um checksum válido significa que é seguro enviar para o endereço?
Significa que a string não foi digitada errado: um erro de digitação aleatório passa com chance de cerca de 1 em 4,3 bilhões. Isso não diz nada sobre quem controla o endereço nem se ele pertence à rede que você imagina.
O Base58Check decodifica endereços bc1?
Não. Endereços que começam com bc1 são Bech32 ou Bech32m (SegWit e Taproot), que usam outro alfabeto e outro checksum.
Devo colar uma chave privada real aqui?
A conversão roda no seu navegador e a página bloqueia todas as requisições de rede, exceto as do contador de visitas da Cloudflare, mas uma chave WIF controla fundos. Use uma chave de teste, ou uma máquina offline, para qualquer coisa que tenha valor.