O que é um conversor de endereço Bitcoin Cash?
Um conversor de endereço Bitcoin Cash traduz uma mesma conta BCH entre suas duas grafias: a forma CashAddr bitcoincash:q… / p…, definida na especificação CashAddr, e a forma legacy Base58Check 1… / 3…, herdada do Bitcoin. Ambas contêm o mesmo hash de 160 bits de uma chave pública (P2PKH) ou de um script (P2SH); só a codificação e o checksum mudam.
Como funciona a codificação CashAddr
- Byte de versão. Um byte cujos bits superiores guardam o tipo (0 = P2PKH, 1 = P2SH) e cujos três bits inferiores codificam o tamanho do hash (0 = 160 bits, 3 = 256 bits).
- Reagrupamento em 5 bits. O byte de versão e o hash são concatenados e recortados em grupos de 5 bits, preenchidos com bits zero, exatamente como o bech32 faz.
- Checksum. Um código BCH de 40 bits é calculado sobre o prefixo expandido (os 5 bits inferiores de cada caractere, seguidos de um zero), o payload e oito grupos zero, usando as constantes geradoras 0x98f2bc8e61, 0x79b76d99e2, 0xf33e5fb3c4, 0xae2eabe2a8 e 0x1e4f43e470. Os oito grupos do checksum são acrescentados ao final.
- Alfabeto. Cada grupo é escrito com o conjunto de 32 caracteres
qpzry9x8gf2tvdw0s3jn54khce6mua7l, por isso a string nunca contém 1, b, i ou o.
Exemplo prático
O primeiro vetor da especificação é 1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu. A decodificação Base58Check resulta na versão 0x00 (P2PKH) e no hash160 76a04053bda0a88bda5177b86a15c3b29f559873. Prefixando o byte de versão CashAddr 0x00, reagrupando em valores de 5 bits e acrescentando o checksum, obtém-se bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a. A variante P2SH do mesmo hash começa com 3 na forma legacy (3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC) e com p em CashAddr (bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq). Cole qualquer um deles acima para ver a conversão ao vivo.
Formatos em resumo
| Forma | Exemplo | Checksum | Distinguível do BTC? |
|---|---|---|---|
| Legacy P2PKH | 1…, 26–35 caracteres | 4 bytes de SHA-256 duplo | não |
| Legacy P2SH | 3…, 34 caracteres | 4 bytes de SHA-256 duplo | não |
| CashAddr P2PKH | bitcoincash:q…, 42 caracteres após o prefixo | polymod de 40 bits | sim |
| CashAddr P2SH | bitcoincash:p…, 42 caracteres | polymod de 40 bits | sim |
| CashAddr P2SH-32 | bitcoincash:p…, 62 caracteres | polymod de 40 bits | sim, sem forma legacy |
| Testnet | bchtest:q… ou m… / n… / 2… | igual | só pelo prefixo |
Por que o aviso de legacy importa
As exchanges ainda mostram endereços legacy para depósitos de BCH, e os usuários ainda colam endereços Bitcoin em formulários de saque de BCH. Como os bytes são idênticos, uma transação BCH para o endereço 1… de um usuário de Bitcoin é válida e confirma na cadeia do Bitcoin Cash, onde a carteira do destinatário nunca olha. As moedas não são destruídas, mas só quem tem aquela chave privada pode resgatá-las com uma carteira BCH, e a maioria dos destinatários não faz ideia de como. Converter todo endereço para CashAddr antes de enviar elimina a ambiguidade: uma carteira que aceita bitcoincash: é uma carteira BCH.
Usos típicos
- Transformar um endereço de depósito legacy de uma exchange antiga na forma CashAddr que as carteiras modernas e o gerador de QR de pagamento esperam.
- Verificar se uma string
q…colada sem o prefixo é de mainnet ou debchtest. - Extrair o hash160 para montar ou verificar um script, ou para comparar duas grafias do mesmo endereço.
Para o Bitcoin em si, use o validador de endereço Bitcoin; para strings bech32 genéricas, o codificador / decodificador bech32.