Address

JSONRPC validateaddress 命令中的“pubkey”是什麼編碼?

  • February 11, 2014

我需要將公鑰轉換為適用於 BouncyCastle 的形式。

為此,我打開調試器並編寫:

ListAddressGroupings

然後我選擇一個地址並寫

validateaddress 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS

我得到了結果:

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

但是我不確定這是什麼格式。

  • JSON-RPC 的 validateaddress 值的編碼是什麼pubkey

我問這個問題是為了確定簽名 UTF8 消息時簽名恢復所需的“recId”值。換句話說,我需要將下面的公鑰轉換為我可以用於該目的的數組。

  • 有沒有更簡單或更好的方法從給定的錢包中獲取公鑰?

樣本數據

Base58: 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Public: 020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50

SignMessage: Test
Output: IITRv4NdcaIgXP7DDNOkOrShBiJkBFoBqjXJXozKNClHnwSmNK3+QbT7ypKTkcc0F5UPsUCef5+gqhTb8sBZLuQ=

進一步嘗試:

  • 當我在 SO 上使用此方法將公共值“020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50”作為十六進制轉換為字節時,我得到了左側下方的列。這是不正確的。但是,當我從私鑰中提取公鑰時,我會在右側得到類似但不同的結果。
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);
} 

在此處輸入圖像描述

公鑰採用 OpenSSL 返回的格式,是字節的直接十六進制編碼。如果第一個字節是 0x04,那麼它是一個 65 字節的未壓縮密鑰(32 字節 X 和 32 字節 Y)。如果第一個字節是 0x02 或 0x03,它是一個 33 字節的壓縮密鑰(32 字節的 X 和一個 Y 符號位)。

recID 被編碼為簽名消息的一部分。檢查 ECKey 類中的 verifyMessage() 方法以查看它是如何提取的。

右邊的列是正確的,它與您從 validateaddress 獲得的內容相匹配。

引用自:https://bitcoin.stackexchange.com/questions/21979