давайте предположим, что у меня есть этот закрытый ключ (тестовая учетная запись на 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: Есть ли лучший способ сделать это?
Заранее спасибо :)
Значения, которые вы представляете для результата подписи, неверны. Я сделал это, используя ту же транзакцию, которую вы показываете, и предоставленный вами закрытый ключ. Когда вы подписываете транзакцию, используя закрытый ключ, который вы показываете, вы получаете:
'г': 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, проблема в вашем коде заключается в том, что используемый вами хэш не является правильным.
Надеюсь это поможет.
Перед тем , как подписать 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 и нули).
резчик