前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Web3.py模式:解析签名交易

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

作者头像
Tiny熊
发布2022-11-07 10:07:23
9070
发布2022-11-07 10:07:23
举报

本文作者:一个程序猿[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。

代码语言:javascript
复制
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/

参考资料

[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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取打包交易
  • 解析签名交易
    • 参考资料
    相关产品与服务
    区块链
    云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档