Address
我可以始終使用以下實現將第一個字節設置為 0x02 嗎?
我已按照本教程生成公鑰對值並生成有效的比特幣地址。
但是有一部分讓我想知道實現是否正確完成,如下所示:
ECPublicKey epub = (ECPublicKey) publicKey; ECPoint pt = epub.getW(); byte[] pubBytes = new byte[33]; //32 + 1 pubBytes[0] = 2; //0x02 System.arraycopy(pt.getAffineX().toByteArray(), 0, pubBytes, 1, 32);
對我來說,當 Y 座標的最後一個字節是奇數時,硬編碼 0x02 似乎會導致錯誤,還是我錯了?
如果這個實現確實被證明是錯誤的,我該如何正確實現它?
0x03
如果公鑰的 y 座標是奇數,那麼第一個字節應該是正確的。所以確實,教程是不正確的。如果 y 座標是奇數,只需設置它:pubBytes[0] = 3;
不過值得注意的是,您可以簡單地否定私鑰來實現偶數 y 座標。這很明顯,因為 if
[s]G = Y
then[-s]G = -Y
。因此,如果您確實犯了這個錯誤然後想稍後修復它,這不是一個真正的問題。這在BIP-3400x02
中用於通過省略/0x03
並始終假設偶數 y 座標使所有公鑰變為 32 字節而不是 33 字節。