Address

如何從私鑰確定地址?

  • December 21, 2020

wiki 中的步驟,獲取此範例私鑰:

0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

當我將它導入 Electrum 時,我發現這些值:

地址:

1GAehh7TsJAHuUAeKZcXf5CnwuGuGgyX2S

公鑰:

04d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645cd85228a6fb29940e858e7e55842ae2bd115d1ed7cc0e82d934e929c97648cb0a

如何從密鑰中確定地址(不使用 Electrum)?

我知道派生路線是私鑰 -> 公鑰 -> 地址,所以我找到了一種使用BitcoinJ在 Java 中生成公鑰的方法:

BigInteger privkey = new BigInteger("0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D", 16);
byte[] bytes = org.bitcoinj.core.ECKey.publicKeyFromPrivate(privkey, false);
String publickey = new BigInteger(1, bytes).toString(16);
while(publickey.length() < 130){
   publickey = "0" + publickey;
}
Log.d("public",publickey);

它提供了正確的公鑰,如上所示,所以我只需要找到一種方法來獲取地址。

我對不同的地址格式了解不多,但我的目標是使用一些公共 API(如blockchain.com )使用地址來檢查餘額。我猜這是 P2PKH 類型的地址。

我試過這個:

NetworkParameters params = MainNetParams.get();
ECKey key = ECKey.fromPrivate(privkey);
String address = LegacyAddress.fromKey(params, key).toString();
Log.d("address",address);

這給了我這個地址:

1LoVGDgRs9hTfTNJNuXKSpywcbdvwRXpmK

但是地址不一樣。

“1LoVG..”和另一個都是使用相同私鑰創建的有效舊 (1…) 地址。它們是不同的,因為其中一個使用壓縮的公鑰(你可能想查一下),而 1GAehh7 使用未壓縮的公鑰。始終對地址使用相同的壓縮格式,建議以壓縮格式創建新地址,因為這樣可以節省字節和交易費用。

要製作未壓縮的公鑰地址(壓縮是 BitcoinJ 中的預設值):

ECKey key = ECKey.fromPrivate(privkey);
key = key.decompress();
String address = LegacyAddress.fromKey(params, key).toString();

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