Address

我可以始終使用以下實現將第一個字節設置為 0x02 嗎?

  • December 15, 2021

我已按照教程生成公鑰對值並生成有效的比特幣地址。

但是有一部分讓我想知道實現是否正確完成,如下所示:

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 = Ythen [-s]G = -Y。因此,如果您確實犯了這個錯誤然後想稍後修復它,這不是一個真正的問題。這在BIP-3400x02中用於通過省略/0x03並始終假設偶數 y 座標使所有公鑰變為 32 字節而不是 33 字節。

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