Как найти подпись транзакции? web3.eth.getTransaction()
похоже, не делает это доступным.
Это можно сделать с помощью EthereumJS: набора библиотек и утилит для Ethereum. https://github.com/ethereumjs
Во-первых, получите необработанную кодировку блока, содержащего вашу целевую транзакцию. Это можно сделать на live.ether.camp.
В качестве альтернативы, если вы не хотите копировать с live.ether.camp, вы можете восстановить необработанные кодировки блоков, загрузив данные цепочки Ethereum в базу данных уровня и запросив по хэшу блока.
Наконец, используя ethereumjs (см. модули ethereumjs-block и ethereumjs-tx), вы можете легко восстановить подписи транзакций.
Подпись транзакции недоступна для обычных API, таких как JavaScript web3 и JSON RPC.
Следующий естественный вопрос: почему бы и нет?
Ethereum не нужно хранить все подписи транзакций, так как он основан на состоянии, а не на UTXO (неизрасходованный выходной набор транзакций).
Следующий естественный вопрос: что такое UTXO и какое отношение он имеет к транзакциям и почему в Ethereum нет UTXO?
Виталик пишет про UTXO здесь . Основные моменты кратко изложены ниже.
Что такое UTXO и какое отношение он имеет к транзакциям?
В Биткойне способ, которым транзакция на самом деле работает «под капотом», заключается в том, что она потребляет набор объектов, называемых неизрасходованными выходами транзакции («UTXO»), созданных одной или несколькими предыдущими транзакциями, а затем создает один или несколько новых UTXO, которые затем может использоваться будущими транзакциями... Таким образом, баланс пользователя не сохраняется в виде числа; скорее, его можно рассчитать как общую сумму номиналов UTXO, которыми они владеют.
Почему Эфириум этого не делает?
UTXO излишне сложны, и сложность в реализации становится даже больше, чем в теории.
UTXO не имеют состояния и поэтому не подходят для приложений, более сложных, чем выпуск и передача активов, которые обычно имеют состояние, например, различные виды смарт-контрактов.
Понятно, почему UTXO плохо сочетаются со смарт-контрактами с отслеживанием состояния: если есть необходимость создать контракт с несколькими фазами, например. когда несколько сторон должны предоставить некоторую форму входных данных, затем через некоторое время эти стороны должны выполнить некоторую дополнительную операцию, и затем, наконец, контракт распределяет средства в зависимости от этих операций, тогда трудно понять, как вписать эту модель в принципиально не имеющие состояния объекты, которые можно только потратить или не потратить.
Подводя итог, можно сказать, что нет никакой реальной причины, по которой вам нужна подпись для Ethereum, поэтому она не предоставляется обычными API.
eth_getTransactionByHash
На данный момент (февраль 2019 г.) в JSON RPC есть подпись .
вот как вы можете получить подпись из Python:
In [1]: import web3
w3=web3.Web3(web3.HTTPProvider('https://geth.golem.network:55555'))
t=w3.eth.getTransactionFromBlock(w3.eth.blockNumber, 0)
t.hash
Out[1]: HexBytes('0xf4bbed857cc67a5ad8f49f12926e6e9b87f550cdd82542310bf196c8e78b838c')
In [2]: from eth_account.internal.signing import extract_chain_id, to_standard_v
s=w3.eth.account._keys.Signature(vrs=(to_standard_v(extract_chain_id(t.v)[1]), w3.toInt(t.r), w3.toInt(t.s)))
type(s)
Out[2]: eth_keys.datatypes.Signature
In [3]: s
Out[3]: '0xf8b1b27aa4746ee1950dcc125e10103e9aba49bdc03e7ccd101b02b94f9c062f17995e4d31cb5a7d8252c5628ec55635d67ba4d853a9a49dae49a05db3b05cef00'
Вы можете использовать его в дальнейшем, например, для восстановления открытого ключа подписавшего.
In [4]: from eth_account.internal.transactions import ALLOWED_TRANSACTION_KEYS, serializable_unsigned_transaction_from_dict
tt={k:t[k] for k in ALLOWED_TRANSACTION_KEYS - {'chainId', 'data'}}
tt['data']=t.input
tt['chainId']=extract_chain_id(t.v)[0]
ut=serializable_unsigned_transaction_from_dict(tt)
In [5]: s.recover_public_key_from_msg_hash(ut.hash())
Out[5]: '0x58ed29a99e06f14a5b7dc33a3d670f3274dfa7ebe891c20e3b8df2aa5d1de12676a3a8ca747d703db52126197a743535640450bb1b89c68a3848129fe5751ac3'
In [6]: s.recover_public_key_from_msg_hash(ut.hash()).to_checksum_address()
Out[6]: '0x5E032243d507C743b061eF021e2EC7fcc6d3ab89'
In [6]: t['from']
Out[6]: '0x5E032243d507C743b061eF021e2EC7fcc6d3ab89'
Павел Былица
Павел Былица
Дбрайсон
Тьяден Хесс
Дбрайсон
никсмак