Generieren einer Ripple-Adresse

Ich versuche, die Ripple-Adresse von der Wiki-Seite der Kontofamilie neu zu erstellen , und ich habe einige Probleme.

  • Ich habe den privaten Generator von 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8und den öffentlichen Hex-Generator von 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A44217828.
  • Ich beginne mit der Generierung des „Hashes von (dem öffentlichen 33-Byte-Generator + 32-Bit-Sequenznummer in Big-Endian-Reihenfolge + der 32-Bit-Untersequenznummer in Big-Endian-Reihenfolge“.
  • Ich versuche 71ED064155FFADFA38782C5E0158CB260000000000000000, was generiert 9F407F7EC35B9AB44831BF0D47CDDAEF7BC11107CE1D10A65368A12B9338F82E- dieses Ergebnis ist größer als der Generator, also inkrementiere ich die Untersequenz
  • Ich versuche 71ED064155FFADFA38782C5E0158CB260000000000000001, was generiert 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203B- was gut ist.
  • Ich füge einen privaten Generator 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8zu dem hinzu, was ich gerade generiert habe 3545C8FE25A89E83287B79D186018D8600A7D5249673FB6D44A77FB12062203B, und erhalte das ErgebnisB2416F4D9CC7326B405CCA0AA755BE3B401BD6E7DFA5CC7F2F5AD0BC433DD113
  • Der entsprechende komprimierte öffentliche Schlüssel ist 02FA95E05F5DA5A433F7B1EE4682DAB44AF28FBC04B485993EC2E516C1D3C30D73, aber in dem Beispiel ist der komprimierte öffentliche Schlüssel03fa25b68da6ff6832e4462fdfb9a2aaa58888c0ed17285ffe92e4465e0c6e782a

Wo habe ich einen Fehler gemacht?

Wird dies als Duplikat von bitcoin.stackexchange.com/questions/18858/… betrachtet ?

Antworten (2)

Sie können auf die Testfälle in meiner Go-Implementierung verweisen, die ich in einer Antwort auf eine ähnliche Frage verlinkt habe .

Für den auf der Wiki-Seite angegebenen Fall sollten die Werte sein:

  • Geheimnis: shHM53KPZ87Gwdqarm1bAmPeXg8Tn == 0x71ED064155FFADFA38782C5E0158CB26
  • privater Generator: 0x7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8
  • öffentlicher Generator: fht5yrLWh3P8DrJgQuVNDPQVXGTMyPpgRHFKGQzFQ66o3ssesk3o
  • erster privater Schlüssel: pwMPbuE25rnajigDPBEh9Pwv8bMV2ebN9gVPTWTh4c3DtB14iGL
  • erster öffentlicher Schlüssel: aBRoQibi2jpDofohooFuzZi9nEzKw9Zdfc4ExVNmuXHaJpSPh8uJ
  • erste Ripple-Adresse: rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn

Viele davon sind in der base58-Codierung von Ripple. Ich kann das Hex-Äquivalent bei Bedarf bereitstellen, aber es ist wahrscheinlich einfacher für die Leute, das oben verlinkte Go-Paket zu bekommen und die Testfälle selbst auszuführen. Es sollte für jeden Programmierer (ob er Go kennt oder nicht) trivial sein, den Testcode zu optimieren, um ihm alle benötigten Details anzuzeigen.

Bearbeiten: Mit den von Ihnen angegebenen privaten/öffentlichen Generatoren (0x7CFBA64F… und 0x0388E5BA…) sollten Sie herausfinden, 0x0388e5ba87a000cb807240df8c848eb0b5ffa5c8e5a521bc8e105c0f0a442178280000000000000000was 0x28f3e125edb203022c7d22c486284706058c209dbf4a98c3923705a4e5347c7agut ist und die Untersequenz nicht erhöhen muss. Das wird dem privaten Generator mod N hinzugefügt, um zu einem privaten Schlüssel von zu führen 0xa5ef877564d096ea445e72fda77c77bb45002261087c69d57cea56b008102d52.

Okay, aber wie wurde der private Schlüssel abgeleitet? Es sollte eine Summe des privaten Generators und eines anderen Schlüssels sein, der aus Geheimnis + Sequenz + Teilsequenz mit halbem SHA512-Wert generiert wurde.
Der private Generator (verwirrenderweise auch als Root Key bezeichnet) ist alles, was benötigt wird, um den/die privaten Schlüssel zu generieren. Das Geheimnis wird in diesem Schritt nicht verwendet. Das Geheimnis wird nur zur Herstellung des Generators verwendet. Derzeit wird die Funktion "Kontofamilie" meistens nicht verwendet und nur der erste (Index 0) private/öffentliche Schlüssel wird verwendet. Der Generator nimmt den Index des gewünschten Schlüssels und macht eine Schleife mit einem zusätzlichen Subindex, bis er einen gültigen Schlüssel findet, indem er seinen Hash verwendet, wie im Wiki beschrieben.
Im verknüpften Go-Code befindet sich das Hashing in publicgenerator.go:hashGenerate() und wird sowohl von den Methoden PrivateGenerator.Generate() als auch von PublicGenerator.Generate() verwendet.
Hmm, ein Blick auf hashGenerate() sum = hash.Sum(sum[:0])ergibt für mich nicht viel Sinn. Abgesehen davon scheint der private Schlüssel auf angehängte private generator, idxund gesetzt zu sein subseq. Der private Schlüssel sollte also 71ED064155FFADFA38782C5E0158CB260000000000000000?
Okay, ich habe meinen Fehler verstanden - ich habe den Master-Seed + die Sequenz + die Untersequenz verwendet, während ich den öffentlichen Generator + die Sequenz + die Untersequenz hätte verwenden sollen ...
(Übrigens, ich habe in meinem Go-Code auf bestimmte Methoden verwiesen, weil ich zufällig weiß, dass Sie mit Go vertraut sind; andere, die dies lesen, möchten woanders nachsehen :).) Das Argument von ist hash.Sum()ein Byte-Slice, an das es den resultierenden Hash anhängtsum=hash.Sum(sum[:0]) wird in der Schleife für den Hash verwendet, um den vorhandenen Slice zu überschreiben sumund Neuzuweisungen zu vermeiden.

Es stellt sich heraus, dass ich Master Seed + Sequenz + Subsequenz verwendet habe, während ich den öffentlichen Generator + Sequenz + Subsequenz hätte verwenden sollen. Also in meinem Beispiel:

  • Ich nehme 0388E5BA87A000CB807240DF8C848EB0B5FFA5C8E5A521BC8E105C0F0A442178280000000000000000und halb-SHA512 hash es, ich bekomme28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7A
  • Hinzufügen 7CFBA64F771E93E817E15039215430B53F7401C34931D111EAB3510B22DBB0D8(privater Generator) und 28F3E125EDB203022C7D22C486284706058C209DBF4A98C3923705A4E5347C7Aich bekomme A5EF877564D096EA445E72FDA77C77BB45002261087C69D57CEA56B008102D52- den privaten Schlüssel
  • Die entsprechende Adresse ist rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn, genau das, was ich generieren musste.