Problem mit der Aktualisierungsmethode sha3.keccak_256() in Python

Ich habe ein einfaches SHA3-Python-Skript erstellt, um Ethereum-Adressen und priv/pub-Schlüssel zu generieren. Danach habe ich etwas ETH an diese Adressen geschickt, aber dann festgestellt, dass die Privatschlüssel nicht mit den Adressen übereinstimmen, die ich habe. Ich glaube, ich habe das Verhalten der Update-Methode in der Implementierung von Python keccak_256 missverstanden. Habe ich immer noch die Möglichkeit, private Schlüssel für die Adressen zu erhalten, die ich mit diesem Skript erhalten habe?

from ecdsa import SigningKey, SECP256k1
import sha3, sys

n = 5
full_file = "addresses.txt"
keccak = sha3.keccak_256()
with open(full_file, "r") as f:
    for i in range(n):
        priv = SigningKey.generate(curve=SECP256k1)
        pub = priv.get_verifying_key().to_string()
        keccak.update(pub)
        address = keccak.hexdigest()[24:]
        print address
        pr_key = str(priv.to_string().hex())
        pub_key = str(pub.hex())
        address_str = "0x" + address
        f.write(address_str + " " + pr_key + " " + pub_key + "\n")

Danke

FWIW, Sie möchten wahrscheinlich nicht selbst rollen. Auschecken: eth-account.readthedocs.io/en/latest/…

Antworten (1)

Es scheint, dass das, was Sie getan haben, fast funktioniert. Ich habe gerade deinen Code-Schnipsel etwas abgeändert:

from ecdsa import SigningKey, SECP256k1
import sha3, sys

n = 5
full_file = "addresses.txt"
keccak = sha3.keccak_256()
with open(full_file, "w") as f:
    f.write("address                                    | private key\n")
    f.write("---------------------------------------------------------------------------------------------------------------\n")
    for i in range(n):
        priv = SigningKey.generate(curve=SECP256k1)
        pub = priv.get_verifying_key().to_string()
        keccak.update(pub)
        address = keccak.hexdigest()[24:]
        pr_key = str(priv.to_string().hex())
        pub_key = str(pub.hex())
        f.write("0x" + address + " | " + "0x" + pr_key + "\n")

Wenn ich den öffentlichen und den privaten Schlüssel mit dem obigen Skript generiere und die Ausgabe der Web3js-Funktion web3.eth.accounts.privateKeyToAccount(privateKey)mit dem entsprechenden privaten Schlüssel als Eingabe überprüfe, erhalte ich den öffentlichen Schlüssel wie erwartet. Es gab nur zwei Dinge, die ich korrigieren musste:

  1. Die Datei full_filemuss als beschreibbar ( "w") nicht lesbar ( "r") geöffnet werden.
  2. Der private Schlüssel benötigt auch das 0x-Prefix genauso wie die Adresse (das ist der öffentliche Schlüssel ...)

Ich hoffe es hilft.

vielen Dank für die Aufmerksamkeit für dieses Problem. Und haben Sie überprüft, ob die Adressen, die Sie erhalten haben, wirklich mit den Pubkeys übereinstimmen, die Sie haben? (dieser Teil war eigentlich das Problem)
Ja, in der Tat. Wie oben geschrieben habe ich das Ergebnis anhand der privateKeyToAccountFunktion überprüft. Und der öffentliche Schlüssel, den ich erhalten habe, stimmte mit dem richtigen öffentlichen Schlüssel überein. Der erste private Schlüssel der ausgegebenen Datei ergibt also den ersten öffentlichen Schlüssel der Datei.
richtig. und haben Sie eine Idee, warum der erste öffentliche Schlüssel der ausgegebenen Datei NICHT die erste öffentliche Adresse der Datei angibt?
Was meinst du mit der "ersten öffentlichen Ansprache"? Laut diesem Beitrag ist die Adresse nur ein Teil des öffentlichen Schlüssels. Wenn also die öffentlichen Schlüssel in Ordnung sind, sollte auch die Adresse in Ordnung sein. Übersehe ich etwas?