使用Web3.py模式:解析签名交易

Web3.py 中并没有一个专用 API 来解析的未打包签名交易,但这个功能可以通过py-evm和eth-utils库里的实用工具来构建。

使用Web3.py模式:解析签名交易

在一小部分用例中,你可能需要对尚未包含在区块中的签名交易进行解码。例如,MEV协议与独立于主交易池的签名交易集一起工作时。如果你不明白这句话的意思,那么你很有可能不需要这篇博文的内容,你可能仅仅对获取以及出块的交易数据感兴趣。那么,我们就从这里开始吧。

获取打包交易

如果你对从以太坊区块链获取交易数据感兴趣,可以使用一个简单直接的 API。请注意,这些是已广播到网络并已成功打包到块中的交易。

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-evmeth-utils库里的实用工具来构建。

在底层,解码交易的逻辑现在需要考虑 "类型化交易",这是在柏林网络升级中引入以太坊的。升级后仍然兼容旧的交易,但是类型化交易的交易哈希第一字节是一个特定范围的值。比如EIP-1559交易,交易类型为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'\xe9\xcb\...', 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/

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
一个程序猿
一个程序猿
江湖只有他的大名,没有他的介绍。