Las direcciones de bitcoin es de esas cosas complejas que todos usamos pero no todos entendemos, simplemente vemos si empiezan con 1 o con 3 o con bc1q, lo único que nos interesa saber es como importar y exportar una direccion y con esto ya tenemos lo necesario para usarlas. ¿Pero alguna vez te has puesto a pensar como funcionan?
Toda dirección de bitcoin parte de una llave privada, y lo que a mi me llamó mucho la atención es que con la misma llave podemos generar cualquier tipo de dirección.
Supongamos que usamos vanity gen para generar una dirección:
Address: 1AddyRpJ5SjfCH8N1WSkTX4FUPb4H2YfFx
Privkey: 5JcWWHgBvyf9LR6W4WmogwXh9JqSNGTsygmLNs1pKvaSnDx9Wjq
Lo que acabamos de obtener es una dirección y una llave privada descomprimida, al pasar esa llave a formato comprimido obtenemos:
KzjjEGbyFF5MnhMHGWQm5HgUBfinxsFe1CWgXVkbtXUcnL9YEgPi
Esta llave comprimida puede ser importada a electrum en los 3 tipos de formato:
p2pkh:KzjjEGbyFF5MnhMHGWQm5HgUBfinxsFe1CWgXVkbtXUcnL9YEgPi
p2wpkh:KzjjEGbyFF5MnhMHGWQm5HgUBfinxsFe1CWgXVkbtXUcnL9YEgPi
p2wpkh-p2sh:KzjjEGbyFF5MnhMHGWQm5HgUBfinxsFe1CWgXVkbtXUcnL9YEgPi
Y es así como con la misma llave privada obtenemos las siguientes 3 direcciónes:
1853H6w9Vii6ymMrFL9YDq2rwencmvzTL7
bc1qfkx8yykk6299gyx4d7adz4sgv5uzjjctzjz5n2
3Cjk952fMgNygHdYeYBxCTgtdTZj18SVsT
Y es aquí donde viene lo interesante... Hay una manera de saber si 2 direcciones comparten la misma llave privada sin conocer esta llave, y eso es a través del Hash160 de la dirección.
python3 -c 'import bech32; hash1 = bech32.decode("bc", "bc1qfkx8yykk6299gyx4d7adz4sgv5uzjjctzjz5n2"); hash2 = bytes(hash1[1]); print(hash2.hex())'
4d8c7212d6d28a5410d56fbad156086538294b0b
python3 -c "import binascii, hashlib, base58; hash160 = binascii.hexlify(base58.b58decode_check(b'1853H6w9Vii6ymMrFL9YDq2rwencmvzTL7')).decode()[2:]; print(hash160)"
4d8c7212d6d28a5410d56fbad156086538294b0b
Sin embargo esto no aplica para las direcciónes P2SH ya que estas llevan un doble proceso de hash160.
Y es por esto que programas como brainflayer utilizan ese Hash160 como vector de ataque en ves de buscar direcciones. Ya que si encontramos la llave privada de ese hash podremos acceder a todas sus direcciones.
Para concluir dejo algunos ejemplos de direcciones con su tipo para que puedan identificarlas a futuro:
Base58 (P2PKH) 1AddyRpJ5SjfCH8N1WSkTX4FUPb4H2YfFx
Base58 (P2SH) 3Cad7LvtLjxWrQzdbLdnoQ9yP8Xr7rU1vH
BECH32 (P2WPKH) bc1qfkx8yykk6299gyx4d7adz4sgv5uzjjctzjz5n2
BECH32 (P2WSH) bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3