So erstellen Sie Signaturen und validieren sie offline ohne Verwendung von web3

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?

web3.py 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.

Antworten (1)

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

Danke schön. Gibt es eine JS- oder Python-Implementierung davon, die leicht verfügbar ist?
@ Rabe ja! Siehe aktualisierte Frage für Python.