Address
如何從私鑰確定地址?
從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();