Различные значения для v, r, s? Что я делаю не так?

давайте предположим, что у меня есть этот закрытый ключ (тестовая учетная запись на ropsten, не беспокойтесь):

785cdcd731a1b2438ec4511a25d04efbdc499ed350df612364af1aa6f4fd6abd

Когда я использую Pyethereum для запуска

v, r, s = ecsign(tx['hash'], normalize_key(private_key))

then v, r, s = (28, 70432465444433342622726730664370509023990924819271715983647847605365849029795, 7960080711554037742197166599216482712965266632510536462814358773930726674178)

Когда я сравниваю это с фактической транзакцией:

{'blockHash': HexBytes('0x47b8f62c1400dae65105d2f8e03824bfc58481c0b32f45788ad3378fbc05e9f6'), 
'blockNumber': 4156209, 
'from': '0x4e5C95B38bd0B18B83f130a1ffae58cFC58961DE', 
'gas': 21000, 
'gasPrice': 8000000000, 
'hash': HexBytes('0x8ec420a3ba331f2a967ecdaf69b78bbb604ebbb2554a8c635142b7b306defaae'), 
'input': '0x', 
'nonce': 0, 
'r': HexBytes('0xe298a05754cc5a24790bb8c21ecb60fd93f2d096146af7397440697a338dff46'), 
's': HexBytes('0x5999f680f17e505c979c43a3a9e7707c817efde705f967681d8a5066b49e5352'), 
'to': '0xED6CA7d908f897d0B0D5f9B9E7Aa470698E10b1b', 
'transactionIndex': 27, 
'v': 42, 
'value': 1000000000000000000}

Значения для r, s, v очень разные. (Событие, когда я конвертирую их с помощью bytes.from_hex(tx['r']))

Q1: Кто-нибудь знает, что я делаю неправильно?

Просто чтобы убедиться: транзакция была сделана с метамаской, а затем ключ был экспортирован из метамаски, поэтому нет никаких шансов, что ключ для подписи транзакции был другим.

Q2: Есть ли лучший способ сделать это?

Заранее спасибо :)

Что касается лучшего способа сделать это: проверьте web3py.readthedocs.io/en/stable/… , который является тонким слоем поверх eth-account (в котором прямо сейчас есть ошибка документации, но она должна быть исправлена ​​в ближайшее время): eth- account.readthedocs.io

Ответы (2)

Значения, которые вы представляете для результата подписи, неверны. Я сделал это, используя ту же транзакцию, которую вы показываете, и предоставленный вами закрытый ключ. Когда вы подписываете транзакцию, используя закрытый ключ, который вы показываете, вы получаете:

'г': 102492371167525662808729438177964772018202086674566648709527465604425496526662,

's': 40527872430728510063557974166309434109284218396283342950340797635881485620050,

'в': 42

Представление R и S в Hexadecimal - S = '0x5999F680F17E505C979C43A3A9E7707C817EFDE705F967681D8A5066B49E5352' R = '0xE298A05754CC5A2490BB890BB890BB890BAF890BAF890BAF890BAF890BARBI5352' R = '0xE298A05754C5790BBI5352' r = '0xE298A05754C5790BBI5352' r = '0xE298A05754C5990BBI5352' r = '0xE298A05754C5990BBI5352' r =

это значения, которые вы показываете для фактической транзакции.

РЕДАКТИРОВАТЬ

privatekey = '0x785cdcd731a1b2438ec4511a25d04efbdc499ed350df612364af1aa6f4fd6abd'
transaction = {
     'to': '0xED6CA7d908f897d0B0D5f9B9E7Aa470698E10b1b',
     'value': 1000000000000000000,
     'gas': 21000,
     'gasPrice': 8000000000,
     'nonce': 0,
     'data':'0x',
     'chainId': 3}

signed = w3.eth.account.signTransaction(transaction,privatekey)

Обратите внимание, что, как указывает @Ismael, проблема в вашем коде заключается в том, что используемый вами хэш не является правильным.

Надеюсь это поможет.

Это не связано с normalize_key, но с тем, как вы подписываете транзакцию.
Эй, спасибо за ваш ответ. Не могли бы вы опубликовать код, который сработал для вас?
Я сделал это с помощью web3py, я добавил его в свой ответ.

Перед тем , как подписать EIP155, вы хэшируете RLP-кодировку транзакции без r, s, v. См. https://github.com/ethereum/pyethereum/blob/develop/ethereum/transactions.py#L133 .

По умолчанию tx["hash"]в хэш включаются r, s и v. И ваша транзакция не будет подтверждена.

После EIP155 процедура указывает, что вы должны заменить r, s и v некоторыми конкретными значениями (chain_id и нули).