Ich brauche nur eine einfache Möglichkeit, eine Nachricht offline zu signieren, vorzugsweise mit Python oder JavaScript. Ich möchte mich nicht mit Web3 anmelden müssen . Ich möchte nur, dass mein privater Schlüssel von einer Variablen im Code verwendet wird.
Dies ist nur für ein Proof-of-Concept-Tool, das ich mache, weshalb ich Web3 oder andere Knoten dafür nicht verwenden möchte. Gibt es eine solche Bibliothek, mit der ich eine Nachricht genauso signieren und verifizieren kann , wie es ein Ethereum-Knoten tun würde?
Diese Frage ist ein mögliches Duplikat . Ich denke jedoch, dass dieser Code für Ihren POC hilfreich sein kann, dh zum Signieren und Verifizieren von Nachrichten ohne die Verwendung von Web3js.
Unter Verwendung von Java bietet Ihnen die Klasse ECKey.java in EthereumJ alle erforderlichen Funktionen. Hier ein Beispiel aus der Praxis...
Unterzeichnung:
public void testEthereumSign() throws IOException {
ECKey key = ECKey.fromPrivate(privateKey);
System.out.println("Secret\t: " + Hex.toHexString(key.getPrivKeyBytes()));
System.out.println("Pubkey\t: " + Hex.toHexString(key.getPubKey()));
System.out.println("Data\t: " + exampleMessage);
byte[] messageHash = HashUtil.sha3(exampleMessage.getBytes());
ECDSASignature signature = key.sign(messageHash);
String output = signature.toBase64();
System.out.println("Signtr\t: " + output + " (Base64, length: " + output.length() + ")");
assertEquals(sigBase64, output);
}
Überprüfung:
public void testVerifySignature1() {
ECKey key = ECKey.fromPublicOnly(pubKey);
BigInteger r = new BigInteger("28157690258821599598544026901946453245423343069728565040002908283498585537001");
BigInteger s = new BigInteger("30212485197630673222315826773656074299979444367665131281281249560925428307087");
ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray(), (byte) 28);
key.verify(HashUtil.sha3(exampleMessage.getBytes()), sig);
}
Python mit Pyethereum :
sign(key, network_id=None)
- unterzeichnet die Transaktion mit dem angegebenen Schlüssel
sha3(data)
- Berechnet den SHA3 (oder genauer gesagt keccak256) Hash
ecrecover_to_pub(hash, v, r, s)
- Stellt den öffentlichen Schlüssel wieder her, der die Signatur als 64-Byte-Blob von encode_int32(x) + encode_int32(y) erstellt hat. Wenn Sie dies hashen und die letzten 20 Bytes verwenden, erhalten Sie die Adresse, die eine Nachricht signiert hat.
ecsign(hash, key)
- gibt die v-, r-, s-Werte einer Signatur zurück
normalize_key(key)
- Konvertiert einen Schlüssel aus vielen Formaten in eine 32-Byte-Binärdatei
privtoaddr(key)
- wandelt einen Schlüssel in eine Adresse um
Schnitzer
w3.eth.account.sign()
tut, wonach Sie suchen. Leider ist es im Moment nur durch Installation aus dem Quellcode zugänglich. Es soll in der nächsten Woche oder so als Beta veröffentlicht werden.