Address
JSONRPC validateaddress 命令中的“pubkey”是什麼編碼?
我需要將公鑰轉換為適用於 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 獲得的內容相匹配。