Hay una función web3.eth.accounts.sign en la implementación de web3js. Pero no puedo encontrar el equivalente exacto en web3py. No veo esto. Encontré algo similar a esto: la función signHash (enlace https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-message ). Esta documentación dice que el mismo mecanismo hash, pero como resultado, la ejecución no devuelve lo mismo que en web3js (web3.eth.accounts.sign).
Usé esta función en web3js para obtener la firma (y luego usé la biblioteca ECDSA (en Solidity) para obtener el firmante. En web3js funciona correctamente (pero en web3py - no). Me conecto a la red de prueba (ropsten) a través de Infura.
En web3js (donde msg - lo que está firmado):
let signature = await web3.eth.accounts.sign(msgHash, '0x' + privateKeyUser);
console.log('signature ='+signature.signature);
En web3py (lo intento, pero no funciona):
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 tiene otro valor.
¿Cuál es el análogo exacto en web3py de cómo funciona esta función web3.eth.accounts.sign en web3js? ¡Gracias!
Como mencionó en los comentarios que está dispuesto a usar web3.py v5, aquí está el enfoque v5 para firmar un mensaje :
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())
Si desea obtener más información sobre EIP-191, consulte el artículo original sobre EIP-191 . Es breve y legible.
Ese fragmento es equivalente al 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);
sign()
Tenga en cuenta que el método javascript "firma datos arbitrarios" en lugar de un hash de mensaje. Por lo tanto, aunque parezca que primero lo está codificando, podría firmar el mensaje original en su lugar.
En la versión de python, prepare el mensaje original para firmar con: encode_defunct(text=original_message)
.
encode_defunct
. Actualicé la respuesta y obtengo el mismo resultado que obtuviste con web3js.Es difícil saberlo sin ver el contenido de todas las variables, incluidas las claves.
Pero mi intuición es que está mezclando bytes sin procesar y cadenas ASCII hexadecimales: algunas de las variables no son lo que cree que son.
Si es posible, ¿puede editar su pregunta con muchas impresiones y resultados para comparar?
Para cualquiera que haya venido aquí con web3.py < v5
:
Use defunct_hash_message en el mensaje antes de usar 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
produce.noel maersk
web3.js
. (Existe esta distinción enweb3.py
.)noel maersk
web3.py
en v5 ; losstable
documentos a los que se vincula son v4. Aclare si necesita específicamente v4, o si v5 también es aceptable.noel maersk
Alex
Alex
Alex
Alex
tallista
Alex
Alex