本文作者:一个程序猿[1]
在一小部分用例中,你可能需要对尚未包含在区块中的签名交易进行解码。例如,MEV 协议与独立于主交易池的签名交易集一起工作时。如果你不明白这句话的意思,那么你很有可能不需要这篇博文的内容,你可能仅仅对获取以及出块的交易数据感兴趣。那么,我们就从这里开始吧。
获取打包交易
如果你对从以太坊区块链获取交易数据感兴趣,可以使用一个简单直接的 API[2]。请注意,这些是已广播到网络并已成功打包到块中的交易。
代码语言:javascript复制from web3 import Web3, HTTPProvider
w3 = Web3(HTTPProvider('...'))
w3.eth.get_transaction('0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060')
# AttributeDict({
# 'hash': HexBytes('0x5c504...'),
# 'blockHash': HexBytes('0x4e3a3...'),
# 'blockNumber': 46147,
# 'from': '0xA1E43...',
# 'gas': 21000,
# 'gasPrice': 50000000000000,
# 'input': '0x',
# 'nonce': 0,
# 'r': HexBytes('0x88ff6...'),
# 's': HexBytes('0x45e0a...'),
# 'to': '0x5DF9B...',
# 'transactionIndex': 0,
# 'type': '0x0',
# 'v': 28,
# 'value': 31337
# })
- 以太坊主网上的第一笔交易? -
解析签名交易
本文编写时, Web3.py 中并没有一个专用 API 来解析的未打包签名交易,但这个功能可以通过py-evm[3]和eth-utils[4]库里的实用工具来构建。
在底层,解码交易的逻辑现在需要考虑 ["类型化交易"](https://eips.ethereum.org/EIPS/eip-2718 ""类型化交易""),这是在柏林网络升级[5]中引入以太坊的。升级后仍然兼容旧的交易,但是类型化交易的交易哈希第一字节是一个特定范围的值。比如EIP-1559[6]交易,交易类型为0x02
,后面跟 rlp 编码的交易主体:0x02 || rlp([chain_id, nonce, amount, data, ...])
。
根据定义,每个类型化交易都有唯一的数据负载(payload),需要对其进行编码和解码。他们统称为 sedes,是序列化/反序列化(serialization/deserialization)的缩写。幸运的是,py-evm 在TransactionBuilder
类中藏了这些实现细节。
把它们放在一起综合考虑 —— 下面的代码将交易哈希转换为字节,然后用 py-evm 的最新TransactionBuilder
解析 payload。
from eth.vm.forks.arrow_glacier.transactions import ArrowGlacierTransactionBuilder as TransactionBuilder
from eth_utils import (
encode_hex,
to_bytes,
)
# 1) 待解析的签名数据
original_hexstr = '0x02f86b010...'
# 2) 把十六进制的签名数据转换为 bytes:
signed_tx_as_bytes = to_bytes(hexstr=original_hexstr)
# 3) 反序列化交易
decoded_tx = TransactionBuilder().decode(signed_tx_as_bytes)
print(decoded_tx.__dict__)
# {'type_id': 2, '_inner': DynamicFeeTransaction(chain_id=1, nonce=4, max_priority_fee_per_gas=2500000000, max_fee_per_gas=118977454018, gas=45000, to=b'xe9xcb...', value=0, data=b'', access_list=(), y_parity=1, r=23532..., s=28205...)}
# 4) the (human-readable) sender's address:
sender = encode_hex(decoded_tx.sender)
print(sender)
# 0xe9cb1f...
原文链接:https://snakecharmers.ethereum.org/web3-py-patterns-decoding-signed-transactions/
参考资料
[1]
一个程序猿: https://learnblockchain.cn/people/9
[2]
API: https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.get_transaction
[3]
py-evm: https://github.com/ethereum/py-evm/
[4]
eth-utils: https://github.com/ethereum/eth-utils/
[5]
柏林网络升级: https://ethereum.org/en/history/#berlin
[6]
EIP-1559: https://eips.ethereum.org/EIPS/eip-1559