Какая кодировка является «pubkey» из команды JSONRPC validateaddress?

Мне нужно преобразовать открытый ключ в форму, пригодную для использования с BouncyCastle.

Для этого я открываю отладчик и пишу:

ListAddressGroupings

Затем я выбираю адрес и пишу

validateaddress 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS

И получаю результат:

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

Однако я не уверен, в каком это формате.

  • Какова кодировка значения validateaddress JSON-RPC с именем pubkey?

Я задаю этот вопрос, чтобы определить значение «recId», необходимое для восстановления подписи при подписании сообщения UTF8. Другими словами, мне нужно преобразовать приведенный ниже открытый ключ в массив, который я могу использовать для этой цели.

  • Есть ли более простой или лучший способ получить публичный ключ из данного кошелька?

Образец данных

Base58: 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Public: 020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50

SignMessage: Test
Output: IITRv4NdcaIgXP7DDNOkOrShBiJkBFoBqjXJXozKNClHnwSmNK3+QbT7ypKTkcc0F5UPsUCef5+gqhTb8sBZLuQ=

Дальнейшие попытки:

  • Когда я конвертирую общедоступное значение «020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50» как шестнадцатеричное в байты, используя этот метод на SO, я получаю столбец ниже слева. Это неправильно. Однако когда я извлекаю открытый ключ из закрытого ключа , я получаю похожий, но другой результат справа.

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

введите описание изображения здесь

Ответы (1)

Открытый ключ имеет формат, возвращаемый OpenSSL, и представляет собой прямое шестнадцатеричное кодирование байтов. Если первый байт равен 0x04, то это несжатый ключ размером 65 байт (32 байта X и 32 байта Y). Если первый байт равен 0x02 или 0x03, это 33-байтовый сжатый ключ (32-байтовый X и один бит для знака Y).

recID кодируется как часть подписанного сообщения. Проверьте метод verifyMessage() в классе ECKey, чтобы увидеть, как он извлекается.

Столбец справа правильный и соответствует тому, что вы получили от validateaddress.

Мой код для чтения шестнадцатеричных данных был неправильным, он был чувствителен к регистру. Спасибо!