BIP47 (1) - Cómo se construye un código de pago

Quizá te hayas cruzado con uno de estos. Es un PayNym, un amigable personaje generado desde el hash de un código de pago reutilizable del BIP47.
Los PayNym son la implementación más funcional y distribuida de estas direcciones reutilizables propuestas por Justus Ranvier en 2015.
Estas direcciones suelen hacer acto de presencia en redes sociales de 3 formas:
    por la foto del robot
    por el código de pago completo "PM8T..."
    o por el PayNym name, por ejemplo+springtruth797, que es un resumen del código de pago y sirve para encontrar a otro usuario dentro del repositorio de PayNym.is
Pero lo importante y lo que no depende de ningún servidor web para funcionar, es el código de pago "PM8T..." con 116 caracteres.
Pero ¿cómo se construye este código?, ¿de qué forma se conecta con el mundo de claves privadas y públicas que ya conocemos de bitcoin?, ¿qué se esconde en ese código extraño?
Pues todas estas preguntas tienen respuesta y Bob — buen amigo de Alice — las ha ido solucionando. Aquí sus hayázgos.

Construyendo un código de pago BIP47

Bob tiene una Frase mnemónica de bitcoin:
reward upper indicate eight swift arch injury crystal super wrestle already dentist
Con la que ha podido generar sus cuentas Segwit m/84'/0'/0', Taproot m/86'/0'/0' etc.
Bob ha querido crear un código de pago reutilizable del BIP47 a mano, paso a paso, y para ello primero ha buscado la clave pública extendida (xpub) de la ruta de derivación m/47'/0'/0':
xpub6CcJ6kZ6c9PaqcHS11GvRBHtGQS6Q5scFxNoBBSHMGZgXgPQdnwA9xZwfquC4rnLVH9ua1sNmL6uBLFHSYH2ZwFvsVHV1ELuM5pSDSA9pfK
Desbalijando el XPUB:
Luego la ha decodificado de base58 a hexadecimal para ver en su interior y localizar la public key y el chain code:
0488b21e03823fe489800000001db1243aaa57c7fbea3072249c1bd4dab9482b4fee4d25e1c69707e8144dc137029d125e1cb89e5a1a108192643ee25370c2e75c192b10aac18de8d5a09b5f48d52a2ebe3a
El bip32 especifica las partes de un xpub con lo que bob ha seguido las instrucciones y ha despiezado la extended public key:
- version Bytes = 0488b21e
- depth = 03
- fingerprint of the parent's key = 823fe489
- child number = 80000000
- chain code = 1db1243aaa57c7fbea3072249c1bd4dab9482b4fee4d25e1c69707e8144dc137
- public key = 029d125e1cb89e5a1a108192643ee25370c2e75c192b10aac18de8d5a09b5f48d5
- checksum = 2a2ebe3a
Que codificado en color queda así:
Construyendo el código de pago reutilizable:
Así Bob localiza con claridad la public key y el chain code que necesita para construir su código de pago como establece el bip47.
Siguiendo la serialización allí indicada completa los campos:
- prefix = 47 (1 Byte) (prefijo del bip47)
- version = 01 (1 Byte) (versión del código de pago)
- bit_field = 00 (1 Byte)
- public key = 029d125e1cb89e5a1a108192643ee25370c2e75c192b10aac18de8d5a09b5f48d5 (33 Bytes) (obtenida del xpub)
- chain code = 1db1243aaa57c7fbea3072249c1bd4dab9482b4fee4d25e1c69707e8144dc137 (32 Bytes) (obtenido del xpub)
- reserved = 00000000000000000000000000 (13 Bytes)
- checksum = f159bdfe (4 Bytes) (primeros 4 bytes de un doble sha256 sobre la información anterior)
Y esto le da un código de pago en hexadecimal:
470100029d125e1cb89e5a1a108192643ee25370c2e75c192b10aac18de8d5a09b5f48d51db1243aaa57c7fbea3072249c1bd4dab9482b4fee4d25e1c69707e8144dc13700000000000000000000000000f159bdfe
Que codificado en colores queda tal que así:
Y que codificado en base58 acaba siendo el código de pago que le dará a todo aquel que le quiera pagar.
Et voila:
PM8TJS2JxQ5ztXUpBBRnpTbcUXbUHy2T1abfrb3KkAAtMEGNbey4oumH7Hc578WgQJhPjBxteQ5GHHToTYHE3A1w6p7tU6KSoFmWBVbFGjKPisZDbP97

Conclusión

Un código de pago del BIP47 tiene en su interior buena parte del xpub en ruta m/47'/0'/0' de la frase mnemónica que lo ha creado.