Получить подпись транзакции в блокчейне

Как найти подпись транзакции? web3.eth.getTransaction()похоже, не делает это доступным.

Подпись транзакции недоступна для обычных API, таких как JavaScript web3 и JSON RPC.
Зачем тебе это?
Необработанные транзакции, включая подпись, доступны в других реализациях блокчейна, таких как Биткойн. Почему не на Эфириуме?
Это потому, что Эфириуму не нужно хранить все подписи транзакций, поскольку он основан на состоянии, а не на UTXO.
Хорошая информация. Так действительно ли Эфириум вообще хранит подписи транзакций?
@TjadenHess, пожалуйста, оставьте свой комментарий в качестве ответа и, возможно, уберите этот вопрос из категории «Неотвеченные»?

Ответы (3)

Это можно сделать с помощью 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, которыми они владеют.

Почему Эфириум этого не делает?

  1. UTXO излишне сложны, и сложность в реализации становится даже больше, чем в теории.

  2. 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'