Accounts
如何從java中的私鑰獲取地址
我使用在 java 程式碼中生成私鑰
HashUtil.sha3("cow".getBytes())
寫入新的私鑰文件:
c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4
然後,我使用,我在 geth 中
geth account import
得到了一個地址。["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826"]
但是當我嘗試在 Java 中獲取公共地址時,它顯示了一個不同的地址:
BigInteger pk = new BigInteger(senderPrivKey); ECKey key = ECKey.fromPrivate(pk); System.out.println("address\t: " + Hex.toHexString(key.getAddress()) );
結果是
address : 8e54de809503da0a87309f8d5e98f77551ddd7f5
我希望顯示地址
cd2a3d9f938e13cd947ec05abc7fe734df8dd826
,我是否使用了錯誤的程式碼?我還學習了EthereumJ中的 ECKeyTest.java,有單元測試首先從私鑰獲取公鑰,然後從公鑰獲取地址。但就我而言,結果仍然是
8e54de809503da0a87309f8d5e98f77551ddd7f5
.
概括
問題中的程式碼理論上不應該執行,因為私鑰是十六進制格式,並且在
new BigInteger(senderPrivKey)
沒有指定基數的情況下解析十六進製字元串的呼叫16
將導致拋出異常。當程式碼調整為使用
new BigInteger(senderPrivKey, 16)
指定基數 16 基數時,會按預期生成公鑰。細節
這是一個工作範例。保存為TestKey.java,編譯執行。
import java.math.BigInteger; import org.ethereum.crypto.ECKey; import org.spongycastle.util.encoders.Hex; public class TestKey { public static void main(String[] args) { String senderPrivKey = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"; BigInteger pk = new BigInteger(senderPrivKey, 16); System.out.println("Private key: " + pk.toString(16)); ECKey key = ECKey.fromPrivate(pk); System.out.println("Public key: " + Hex.toHexString(key.getAddress())); } }
以及執行時的輸出:
Private key: c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4 Public key: cd2a3d9f938e13cd947ec05abc7fe734df8dd826
我使用了以下 Maven 依賴項:
<dependency> <groupId>org.ethereum</groupId> <artifactId>ethereumj-core</artifactId> <version>1.1.0-RELEASE</version> <!-- <type>zip</type> --> </dependency>
我不知道您的程式碼是如何執行的,因為當我在上面的原始碼中更改以下行以匹配您的程式碼時,
BigInteger(...)
建構子期望解析一個以 10 為基數的數字而不是一個以 16 為基數的數字:BigInteger pk = new BigInteger(senderPrivKey);
我得到以下異常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "c" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.math.BigInteger.<init>(BigInteger.java:461) at java.math.BigInteger.<init>(BigInteger.java:597) at TestKey.main(TestKey.java:14)