In der Implementierung von web3js gibt es eine Funktion web3.eth.accounts.sign. Aber ich kann das genaue Äquivalent in web3py nicht finden. Ich sehe das nicht. Ich habe etwas Ähnliches gefunden – die signHash-Funktion (Link https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-message ). Diese Dokumentation besagt, dass derselbe Hashing-Mechanismus, aber als Ergebnis die Ausführung nicht dasselbe zurückgibt wie in web3js (web3.eth.accounts.sign).
Ich habe diese Funktion in web3js verwendet, um die Signatur abzurufen (und dann die ECDSA-Bibliothek (auf Solidity) verwendet, um den Unterzeichner abzurufen. Auf web3js funktioniert es korrekt (aber auf web3py - nein). Ich verbinde mich über Infura mit dem Testnetzwerk (ropsten).
Auf web3js (wobei msg - was signiert ist):
let signature = await web3.eth.accounts.sign(msgHash, '0x' + privateKeyUser);
console.log('signature ='+signature.signature);
Auf web3py (ich versuche es, funktioniert aber nicht):
signature = web3.eth.account.signHash(msgHash, '0x' + privateKeyUser)
print('signature ='+signature.signature.hex())
And for example in variable "msgHash" value: 0x058c3b4c8e5dc4632b5c6b861b2c1861d53e426dc673c907ddf2651942b0f230 And at the output of web3js function (web3.eth.accounts.sign), we get signature: 0xd19241ed816026e846c8511e03a468aa6e038165ecb3c2229eee38b04c64b235408389dfad2b65d776dba236e7de1b63fdb6b2579e70c4ce9ad1b09a35da96521c And this is the correct value. Web3py hat einen anderen Wert.
Was ist in web3py genau analog dazu, wie diese web3.eth.accounts.sign-Funktion in web3js funktioniert? Danke schön!
Da Sie in Kommentaren erwähnt haben, dass Sie offen für die Verwendung von web3.py v5 sind, ist hier der v5-Ansatz zum Signieren einer Nachricht :
from eth_account import Account, messages
msg_hash_hex = "058c3b4c8e5dc4632b5c6b861b2c1861d53e426dc673c907ddf2651942b0f230"
private_key_hex = "b25c7db31feed9122727bf0939dc769a96564b2de4c4726d035b36ecf1e5b364"
#// This part prepares "version E" messages, using the EIP-191 standard
message = messages.encode_defunct(hexstr=msg_hash_hex)
#// This part signs any EIP-191-valid message
signed_message = Account.sign_message(message, private_key=private_key_hex)
print("signature =", signed_message.signature.hex())
Wenn Sie mehr über EIP-191 erfahren möchten, sehen Sie sich die ursprüngliche Beschreibung von EIP-191 an . Es ist kurz und lesbar.
Dieses Snippet entspricht dem Javascript:
msgHash = "0x058c3b4c8e5dc4632b5c6b861b2c1861d53e426dc673c907ddf2651942b0f230"
privateKeyUser = "b25c7db31feed9122727bf0939dc769a96564b2de4c4726d035b36ecf1e5b364"
// web3.js sign() *only* supports "version E" EIP-191 signing
// so it adds the preamble for you.
let signature = await web3.eth.accounts.sign(msgHash, '0x' + privateKeyUser);
console.log('signature ='+signature.signature);
Beachten Sie, dass die Javascript- sign()
Methode eher "beliebige Daten signiert" als einen Nachrichten-Hash. Obwohl Sie es also zuerst zu hashen scheinen, könnten Sie stattdessen die ursprüngliche Nachricht signieren.
Bereiten Sie in der Python-Version die Originalnachricht zum Signieren vor mit: encode_defunct(text=original_message)
.
encode_defunct
. Ich habe die Antwort aktualisiert und erhalte das gleiche Ergebnis wie mit web3js.Es ist schwer zu sagen, ohne den Inhalt aller Variablen, einschließlich der Schlüssel, zu sehen.
Aber mein Bauchgefühl ist, dass Sie rohe Bytes und hexadezimale ASCII-Strings mischen - einige der Variablen sind nicht das, was Sie denken.
Können Sie Ihre Frage nach Möglichkeit mit vielen Ausdrucken und Ausgaben bearbeiten, um sie zu vergleichen?
Für alle, die hierher gekommen sind mit web3.py < v5
:
Verwenden Sie defunct_hash_message für die Nachricht, bevor Sie signHash
.
from eth_account.messages import defunct_hash_message
prepared_message = defunct_hash_message(primitive=msgHash)
signature = web3.eth.account.signHash(prepared_message, '0x' + privateKeyUser)
print('signature =' + signature.signature.hex())
Noel Maersk
web3.js
erzeugt werden.Noel Maersk
web3.js
. (Es gibt diese Unterscheidung inweb3.py
.)Noel Maersk
web3.py
; Diestable
Dokumente, auf die Sie verlinken, sind v4. Klären Sie, ob Sie speziell v4 benötigen oder ob v5 auch akzeptabel ist.Noel Maersk
Alex
Alex
Alex
Alex
Schnitzer
Alex
Alex