¿Qué codificación es "pubkey" del comando de dirección de validación de JSONRPC?

Necesito convertir una clave pública en un formato adecuado para usar con BouncyCastle.

Para ello abro el depurador y escribo:

ListAddressGroupings

Luego escojo una dirección y escribo

validateaddress 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS

Y obtengo el resultado:

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

Sin embargo, no estoy seguro de en qué formato está esto.

  • ¿Cuál es la codificación del valor de la dirección de validación de JSON-RPC denominada pubkey?

Hago esta pregunta para poder determinar el valor "recId" necesario para la recuperación de la firma cuando se firma un mensaje UTF8. En otras palabras, necesito convertir la clave pública a continuación en una matriz que pueda usar para ese propósito.

  • ¿Hay alguna manera más fácil o mejor de obtener la clave pública de una billetera determinada?

Data de muestra

Base58: 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Public: 020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50

SignMessage: Test
Output: IITRv4NdcaIgXP7DDNOkOrShBiJkBFoBqjXJXozKNClHnwSmNK3+QbT7ypKTkcc0F5UPsUCef5+gqhTb8sBZLuQ=

Más intentos:

  • Cuando convierto el valor público "020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50" como hexadecimal a bytes usando este método en SO, obtengo la siguiente columna a la izquierda. Esto es incorrecto. Sin embargo, cuando extraigo la clave pública de la clave privada , obtengo un resultado similar pero diferente a la derecha.

    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);
    } 
    

ingrese la descripción de la imagen aquí

Respuestas (1)

La clave pública está en el formato devuelto por OpenSSL y es una codificación hexadecimal directa de los bytes. Si el primer byte es 0x04, entonces es una clave sin comprimir de 65 bytes (X de 32 bytes y Y de 32 bytes). Si el primer byte es 0x02 o 0x03, es una clave comprimida de 33 bytes (X de 32 bytes y un bit para el signo Y).

El recID se codifica como parte del mensaje firmado. Verifique el método verificarMessage() en la clase ECKey para ver cómo se extrae.

La columna de la derecha es correcta y coincide con lo que obtuvo de la dirección de validación.

Mi código para leer los datos hexadecimales era incorrecto, distinguía entre mayúsculas y minúsculas. ¡Gracias!