Ich verwende einen privaten Schlüssel in Java-Code generierenHashUtil.sha3("cow".getBytes())
Schreiben Sie in eine neue private Schlüsseldatei:
c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4
Dann verwende ich geth account import
, ich habe eine Adresse ["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826"]
in Geth.
Aber wenn ich versuche, eine öffentliche Adresse in Java zu bekommen, zeigt es eine andere Adresse:
BigInteger pk = new BigInteger(senderPrivKey); ECKey key = ECKey.fromPrivate(pk); System.out.println("address\t: " + Hex.toHexString(key.getAddress()) );
Das Ergebnis istaddress : 8e54de809503da0a87309f8d5e98f77551ddd7f5
Ich habe erwartet, dass die Adresse angezeigt cd2a3d9f938e13cd947ec05abc7fe734df8dd826
wird, habe ich einen falschen Code verwendet?
Ich habe auch ECKeyTest.java in EthereumJ gelernt, es gibt Komponententests, die zuerst den öffentlichen Schlüssel vom privaten Schlüssel und dann die Adresse vom öffentlichen Schlüssel erhalten. Aber in meinem Fall ist das Ergebnis immer noch 8e54de809503da0a87309f8d5e98f77551ddd7f5
.
Der Code in der Frage sollte theoretisch nicht ausgeführt werden, da der private Schlüssel im Hex-Format vorliegt und der Aufruf zum new BigInteger(senderPrivKey)
Analysieren der Hex-Zeichenfolge ohne die 16
angegebene Basis zu einer ausgelösten Ausnahme führen würde.
Wenn der Code so angepasst wird, new BigInteger(senderPrivKey, 16)
dass er den Basis-16-Radix angibt, wird der öffentliche Schlüssel wie erwartet generiert.
Hier ist ein funktionierendes Beispiel. Speichern Sie es als TestKey.java, kompilieren und führen Sie es aus.
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()));
}
}
Und die Ausgabe beim Ausführen:
Private key: c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4
Public key: cd2a3d9f938e13cd947ec05abc7fe734df8dd826
Ich habe die folgende Maven-Abhängigkeit verwendet:
<dependency>
<groupId>org.ethereum</groupId>
<artifactId>ethereumj-core</artifactId>
<version>1.1.0-RELEASE</version>
<!-- <type>zip</type> -->
</dependency>
Ich weiß nicht, wie Ihr Code gelaufen ist, denn wenn ich die folgende Zeile im obigen Quellcode so ändere, dass sie Ihrem Code entspricht, BigInteger(...)
erwartet der Konstruktor, dass er eine Zahl zur Basis 10 anstelle einer Zahl zur Basis 16 analysiert:
BigInteger pk = new BigInteger(senderPrivKey);
Und ich bekomme die folgende Ausnahme:
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)
byte[] senderPrivKey = HashUtil.sha3("cow".getBytes());
senderPrivKey kein String ist und Hex.encode(senderPrivKey)
ist"c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"
Doug Hou
byte[] senderPrivKey = HashUtil.sha3("cow".getBytes());
und Hex.encode(senderPrivKey) gleich "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4" ist.