Generando dirección Ripple

Estoy tratando de recrear la dirección de Ripple desde la página wiki de Account Family y tengo algunos problemas.

  • Tengo el generador privado de 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8, y el generador público hexadecimal de 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A44217828.
  • Comienzo a generar el "hash de (el generador público de 33 bytes + el número de secuencia de 32 bits en orden big-endian + el número de subsecuencia de 32 bits en orden big-endian".
  • Lo intento 71ED064155FFADFA38782C5E0158CB260000000000000000, lo que genera 9F407F7EC35B9AB44831BF0D47CDDAEF7BC11107CE1D10A65368A12B9338F82E: este resultado es más grande que el generador, así que incremento la subsecuencia
  • Lo intento 71ED064155FFADFA38782C5E0158CB260000000000000001, lo que genera 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203B- lo que es bueno.
  • Agrego un generador privado 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8a lo que acabo de generar 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203By obtengo el resultado.B2416F4D9CC7326B405CCA0AA755BE3B401BD6E7DFA5CC7F2F5AD0BC433DD113
  • La clave pública comprimida correspondiente a eso es 02FA95E05F5DA5A433F7B1EE4682DAB44AF28FBC04B485993EC2E516C1D3C30D73, pero en el ejemplo la clave pública comprimida es03fa25b68da6ff6832e4462fdfb9a2aaa58888c0ed17285ffe92e4465e0c6e782a

¿Dónde cometí un error?

¿Se considera esto un duplicado de bitcoin.stackexchange.com/questions/18858/… ?

Respuestas (2)

Puede hacer referencia a los casos de prueba en mi implementación de Go a la que me vinculé en una respuesta a una pregunta similar .

Para el caso dado en la página wiki, los valores deben ser:

  • secreto: shHM53KPZ87Gwdqarm1bAmPeXg8Tn == 0x71ED064155FFADFA38782C5E0158CB26
  • generador privado: 0x7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8
  • generador público: fht5yrLWh3P8DrJgQuVNDPQVXGTMyPpgRHFKGQzFQ66o3ssesk3o
  • primera clave privada: pwMPbuE25rnajigDPBEh9Pwv8bMV2ebN9gVPTWTh4c3DtB14iGL
  • primera clave pública: aBRoQibi2jpDofohooFuzZi9nEzKw9Zdfc4ExVNmuXHaJpSPh8uJ
  • primera dirección de Ripple: rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn

Muchos de ellos están en la codificación base58 de Ripple. Puedo proporcionar el equivalente hexadecimal si es necesario, pero probablemente sea más fácil para las personas obtener el paquete Go vinculado anteriormente y ejecutar los casos de prueba ellos mismos. Debería ser trivial para cualquier programador (ya sea que conozcan Go o no) ajustar el código de prueba para mostrarles los detalles que necesitan.

Editar: con los generadores privados/públicos que especifique (0x7CFBA64F... y 0x0388E5BA...) debería estar haciendo hash 0x0388e5ba87a000cb807240df8c848eb0b5ffa5c8e5a521bc8e105c0f0a442178280000000000000000en 0x28f3e125edb203022c7d22c486284706058c209dbf4a98c3923705a4e5347c7alo que es bueno y no requiere incrementar la subsecuencia. Eso se agrega al generador privado mod N para dar como resultado una clave privada de 0xa5ef877564d096ea445e72fda77c77bb45002261087c69d57cea56b008102d52.

Bien, pero ¿cómo se derivó la clave privada? Debe ser una suma del generador privado y otra clave generada a partir de secret+sequense+subsequence half-SHA512'd.
El generador privado (también conocido confusamente como la clave raíz) es todo lo que se necesita para generar la(s) clave(s) privada(s). El secreto no se utiliza en este paso. El secreto solo se usa para hacer el generador. Actualmente, la característica de "familia de cuentas" casi no se usa y solo se usa la primera clave privada/pública (índice 0). El generador toma el índice de la clave deseada y realiza un bucle con un subíndice adicional hasta que encuentra una clave válida usando su hashing como se describe en la wiki.
En el código Go vinculado, el hashing está en publicgenerator.go:hashGenerate() y lo usan los métodos PrivateGenerator.Generate() y PublicGenerator.Generate().
Hmm, mirando hashGenerate(), sum = hash.Sum(sum[:0])no tiene mucho sentido para mí. Aparte de eso, parece que la clave privada está configurada como anexa private generatory idx. subseqEntonces, ¿la clave privada debería ser 71ED064155FFADFA38782C5E0158CB260000000000000000?
De acuerdo, entendí mi error: estaba usando la semilla maestra + secuencia + subsecuencia, mientras que debería haber estado usando generador público + secuencia + subsecuencia ...
(Por cierto, hice referencia a métodos específicos dentro de mi código Go porque sé que estás familiarizado con Go; otros que leen esto desean buscar en otra parte :)). El argumento de es un segmento de bytes que agrega el hash hash.Sum()resultante para que sum=hash.Sum(sum[:0])se usa en el bucle para que el hash sobrescriba el sumsegmento existente y evite reasignaciones.

Resulta que estaba usando semilla maestra + secuencia + subsecuencia, mientras que debería haber estado usando generador público + secuencia + subsecuencia. Así que en mi ejemplo:

  • Tomo 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A442178280000000000000000y la mitad de SHA512 hash, obtengo28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7A
  • Agregando 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8(generador privado) y 28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7Aobtengo A5EF877564D096EA445E72FDA77C77BB45002261087C69D57CEA56B008102D52- la clave privada
  • La dirección correspondiente es rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn, que es exactamente lo que necesitaba generar.