В реализации web3js есть функция web3.eth.accounts.sign. Но я не могу найти точного эквивалента в web3py, я этого не вижу. Я нашел что-то похожее на это — функцию signHash (ссылка https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-message ). В этой документации написано, что тот же механизм хеширования, но в результате выполнение возвращает не такое, как в web3js (web3.eth.accounts.sign).
Я использовал эту функцию в web3js для получения подписи (а затем с помощью библиотеки ECDSA (на Solidity) для получения подписчика. На web3js работает корректно (а на web3py - нет). Подключаюсь к тестовой сети (ropsten) через Infura.
На web3js (где msg — что подписано):
let signature = await web3.eth.accounts.sign(msgHash, '0x' + privateKeyUser);
console.log('signature ='+signature.signature);
На web3py (пробую, но не работает):
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 имеет другое значение.
Что является точным аналогом в web3py того, как эта функция web3.eth.accounts.sign работает в web3js? Спасибо!
Поскольку вы упомянули в комментариях, что вы открыты для использования web3.py v5, вот подход v5 для подписи сообщения :
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())
Если вы хотите узнать больше об EIP-191, ознакомьтесь с оригинальным описанием EIP-191 . Он короткий и читаемый.
Этот фрагмент эквивалентен 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()
Обратите внимание, что метод javascript «подписывает произвольные данные», а не хэш сообщения. Таким образом, хотя вы, кажется, сначала хешируете его, вместо этого вы можете подписать исходное сообщение.
В версии Python подготовьте исходное сообщение для подписи с помощью: encode_defunct(text=original_message)
.
encode_defunct
. Я обновил ответ и получил тот же результат, что и вы с web3js.Трудно сказать, не видя содержимого всех переменных, включая ключи.
Но я чувствую, что вы смешиваете необработанные байты и шестнадцатеричные строки ASCII - некоторые переменные не то, что вы думаете.
Если возможно, вы можете отредактировать свой вопрос с большим количеством отпечатков и результатов для сравнения?
Для тех, кто пришел сюда с web3.py < v5
:
Используйте defunct_hash_message в сообщении перед использованием 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())
Ноэль Маерск
web3.js
создает.Ноэль Маерск
web3.js
. (Есть такое различие вweb3.py
.)Ноэль Маерск
web3.py
в v5 ; документыstable
, на которые вы ссылаетесь, относятся к версии 4. Уточните, нужна ли вам конкретно v4, или v5 также приемлема.Ноэль Маерск
Алекс
Алекс
Алекс
Алекс
резчик
Алекс
Алекс