Генерация Ripple-адреса

Я пытаюсь воссоздать адрес Ripple с вики-страницы Account Family , и у меня возникают некоторые проблемы.

  • У меня есть частный генератор 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8и общедоступный шестнадцатеричный генератор 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A44217828.
  • Я начинаю генерировать «хеш (33-байтовый общедоступный генератор + 32-битный порядковый номер в обратном порядке + 32-битный подпорядковый номер в обратном порядке».
  • Я пробую 71ED064155FFADFA38782C5E0158CB260000000000000000, который генерирует 9F407F7EC35B9AB44831BF0D47CDDAEF7BC11107CE1D10A65368A12B9338F82E- этот результат больше, чем у генератора, поэтому я увеличиваю подпоследовательность
  • Я пробую 71ED064155FFADFA38782C5E0158CB260000000000000001, что генерирует 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203B- что хорошо.
  • Я добавляю частный генератор 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8к тому, что я только что сгенерировал 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203B, и получаю результатB2416F4D9CC7326B405CCA0AA755BE3B401BD6E7DFA5CC7F2F5AD0BC433DD113
  • Сжатый открытый ключ, соответствующий этому 02FA95E05F5DA5A433F7B1EE4682DAB44AF28FBC04B485993EC2E516C1D3C30D73, но в примере сжатый открытый ключ03fa25b68da6ff6832e4462fdfb9a2aaa58888c0ed17285ffe92e4465e0c6e782a

Где я сделал ошибку?

Считается ли это дубликатом bitcoin.stackexchange.com/questions/18858/… ?

Ответы (2)

Вы можете сослаться на тестовые примеры в моей реализации Go, на которую я ссылался в ответе на аналогичный вопрос .

Для случая, указанного на вики-странице, значения должны быть:

  • секрет: shHM53KPZ87Gwdqarm1bAmPeXg8Tn == 0x71ED064155FFADFA38782C5E0158CB26
  • частный генератор: 0x7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8
  • общедоступный генератор: fht5yrLWh3P8DrJgQuVNDPQVXGTMyPpgRHFKGQzFQ66o3ssesk3o
  • первый закрытый ключ: pwMPbuE25rnajigDPBEh9Pwv8bMV2ebN9gVPTWTh4c3DtB14iGL
  • первый открытый ключ: aBRoQibi2jpDofohooFuzZi9nEzKw9Zdfc4ExVNmuXHaJpSPh8uJ
  • первый адрес Ripple: rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn

Многие из них находятся в кодировке Ripple base58. Я могу предоставить шестнадцатеричный эквивалент, если требуется, но людям, вероятно, будет проще получить указанный выше пакет Go и запустить тестовые примеры самостоятельно. Для любого программиста (независимо от того, знает он Go или нет) должно быть тривиально настроить тестовый код, чтобы показать ему все детали, которые ему нужны.

Редактировать: с указанными вами частными/общедоступными генераторами (0x7CFBA64F… и 0x0388E5BA…) вы должны хешировать, 0x0388e5ba87a000cb807240df8c848eb0b5ffa5c8e5a521bc8e105c0f0a442178280000000000000000что 0x28f3e125edb203022c7d22c486284706058c209dbf4a98c3923705a4e5347c7aхорошо и не требует увеличения подпоследовательности. Это добавляется к модулю частного генератора N, чтобы получить закрытый ключ 0xa5ef877564d096ea445e72fda77c77bb45002261087c69d57cea56b008102d52.

Хорошо, но как был получен закрытый ключ? Это должна быть сумма частного генератора и другого ключа, сгенерированного из секрета + последовательности + подпоследовательности, наполовину обработанной SHA512.
Частный генератор (также ошибочно называемый корневым ключом) — это все, что необходимо для создания закрытого ключа (ключей). На этом этапе секрет не используется. Секрет используется только для изготовления генератора. В настоящее время функция «семейство учетных записей» в основном не используется, и используется только первый (индекс 0) закрытый/открытый ключ. Генератор берет индекс желаемого ключа и выполняет цикл с дополнительным подиндексом, пока не найдет действительный ключ, используя его хеширование, как описано в вики.
В связанном коде Go хеширование находится в publicgenerator.go:hashGenerate() и используется как методами PrivateGenerator.Generate(), так и PublicGenerator.Generate().
Хм, глядя на hashGenerate(), sum = hash.Sum(sum[:0])я не вижу особого смысла. Кроме этого, похоже, что для закрытого ключа установлено значение appended private generatorи idx. subseqТак что закрытый ключ должен быть 71ED064155FFADFA38782C5E0158CB260000000000000000?
Хорошо, понял свою ошибку - я использовал основное семя + последовательность + подпоследовательность, в то время как я должен был использовать общедоступный генератор + последовательность + подпоследовательность...
(Кстати, я сослался на определенные методы в своем коде Go, потому что я знаю, что вы знакомы с Go; другие, читающие это, хотят искать в другом месте :).) hash.Sum()Аргумент - это байтовый срез, к которому он добавляет результирующий хеш, чтобы sum=hash.Sum(sum[:0])используется в цикле для хэша, чтобы перезаписать существующий sumфрагмент и избежать повторного распределения.

Оказывается, я использовал основное семя + последовательность + подпоследовательность, в то время как я должен был использовать общедоступный генератор + последовательность + подпоследовательность. Итак, в моем примере:

  • Я беру 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A442178280000000000000000и полу-SHA512 хеширую, получаю28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7A
  • Добавляю 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8(приватный генератор) и 28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7Aполучаю A5EF877564D096EA445E72FDA77C77BB45002261087C69D57CEA56B008102D52- приватный ключ
  • Соответствующий адрес — rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTnэто именно то, что мне нужно было сгенерировать.