Welche Codierung ist "pubkey" aus dem JSONRPC-Validateaddress-Befehl?

Ich muss einen öffentlichen Schlüssel in eine Form umwandeln, die für die Verwendung mit BouncyCastle geeignet ist.

Dazu öffne ich den Debugger und schreibe:

ListAddressGroupings

Dann suche ich mir eine Adresse aus und schreibe

validateaddress 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS

Und ich bekomme das Ergebnis:

{
"isvalid" : true,
"address" : "1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS",
"ismine" : true,
"isscript" : false,
"pubkey" : "020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50",
"iscompressed" : true,
"account" : "testDONOTUSE"
}

Allerdings bin ich mir nicht sicher, welches Format das hat.

  • Wie lautet die Codierung des Validateaddress-Werts von JSON-RPC mit dem Namen pubkey?

Ich stelle diese Frage, damit ich den "recId"-Wert bestimmen kann, der für die Signaturwiederherstellung benötigt wird, wenn eine UTF8-Nachricht signiert wird. Mit anderen Worten, ich muss den unten stehenden öffentlichen Schlüssel in ein Array konvertieren, das ich für diesen Zweck verwenden kann.

  • Gibt es eine einfachere oder bessere Möglichkeit, den Pubkey aus einer bestimmten Brieftasche zu erhalten?

Beispieldaten

Base58: 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Public: 020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50

SignMessage: Test
Output: IITRv4NdcaIgXP7DDNOkOrShBiJkBFoBqjXJXozKNClHnwSmNK3+QbT7ypKTkcc0F5UPsUCef5+gqhTb8sBZLuQ=

Weitere Versuche:

  • Wenn ich den öffentlichen Wert "020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50" mit dieser Methode auf SO als Hex in Bytes umwandle, erhalte ich die Spalte unten links. Das ist falsch. Wenn ich jedoch den öffentlichen Schlüssel aus dem privaten Schlüssel extrahiere , erhalte ich rechts ein ähnliches, aber unterschiedliches Ergebnis.

    public static byte[] publicKeyFromPrivate(BigInteger privKey, bool compressed)
    { 
        X9ECParameters ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1");
        ECPoint point1 = ecParams.G.Multiply(privKey);
        return point1.GetEncoded(compressed);
    } 
    

Geben Sie hier die Bildbeschreibung ein

Antworten (1)

Der öffentliche Schlüssel hat das von OpenSSL zurückgegebene Format und ist eine reine Hex-Codierung der Bytes. Wenn das erste Byte 0x04 ist, handelt es sich um einen 65-Byte-unkomprimierten Schlüssel (32-Byte-X und 32-Byte-Y). Wenn das erste Byte 0x02 oder 0x03 ist, handelt es sich um einen komprimierten 33-Byte-Schlüssel (32-Byte X und ein Bit für das Y-Zeichen).

Die recID wird als Teil der signierten Nachricht codiert. Überprüfen Sie die Methode verifyMessage() in der ECKey-Klasse, um zu sehen, wie sie extrahiert wird.

Die rechte Spalte ist korrekt und stimmt mit dem überein, was Sie von validateaddress erhalten haben.

Mein Code zum Lesen der Hex-Daten war falsch, es wurde zwischen Groß- und Kleinschreibung unterschieden. Danke!