如何使用Python通过EIP-1559和传统方法发送交易

  • QuickNode
  • 发布于 2024-07-05 13:29
  • 阅读 18

本文提供了使用 web3.py 库在以太坊上发送交易的详细指导,涵盖了 EIP-1559 和传统交易方法。通过设置钱包、连接以太坊网络以及编写 Python 脚本,读者将学会如何安全有效地发起和监控交易,并理解 EIP-1559 升级对交易的影响。

概述

在区块链开发中,以太坊作为构建去中心化应用程序(dApps)和智能合约的流行平台而脱颖而出。web3.py 库为 Python 开发者提供了一种方便的方式来与以太坊网络进行交互。

在本指南中,我们将带你了解如何使用 web3.py 通过 EIP-1559 和传统方法在以太坊上发送交易。到最后,你将对如何利用这个强大的库安全高效地发起交易有一个深入的了解。此外,你还将了解 EIP-1559 更新对交易的影响。

我们将在本指南中使用以太坊的 Sepolia 测试网络,以方便为主。然而,这同样适用于以太坊主网。

你将需要的

你可以通过点击上面的链接并按照其说明下载和安装每个依赖项。

本指南中使用的依赖项
依赖项 版本
python 3.6.0
web3.py 6.5.0

你将要做的

  • 了解 EIP-1559 及其对开发者的影响
  • 使用通过 EIP-1559 引入的新动态费用方法(Type-2)和传统方法(Type-0)发送交易到以太坊区块链,使用 web3.py

web3.py 和以太坊交易概述

web3.py 是一个 Python 库,作为与以太坊区块链交互的强大接口。它使开发者能够编写 Python 代码与以太坊节点进行交互,发送交易,部署智能合约等。

以太坊交易 涉及在以太坊网络上发送价值(以太币或 Ether)或与智能合约进行交互。交易包含重要的细节,例如发送者和接收者地址、交易价值、油价和数据。

在本指南中,我们仅讨论使用 Type-0(传统交易方法)和 Type-2(新动态费用方法 EIP-1559 引入的)发送以太币。与智能合约的交互将是新的指南内容。

EIP-1559 对发送交易的影响

EIP-1559 的引入旨在通过实施更有效的以太坊油价方法来减少链上油价的波动性。

在 EIP-1559 之前,以太坊链上低油费的交易经常长时间处于待定状态,因为区块总是被出价最高的交易填满。为了解决这个问题,EIP-1559 建立了一个更复杂、更公平的油费系统,包括 基本费用(Base Fee)优先费用(Priority Fee)

  • 基本费用(Base Fee) 是包含在下一个区块中的必需费用金额。基本费用可能会根据当前区块与前一个区块的充满程度而变化。
  • 优先费用(Priority Fee) 是可选的,由用户确定。它基本上是一种激励,使其包含在一个区块中。

EIP-1559 升级与之前的版本完全兼容。因此,传统交易仍然可以正常运行。

对开发者有什么不同?

在 EIP-1559 之前,开发者必须指定一个 gasPrice 值来发送交易。现在,gasPrice 参数被 maxFeePerGasmaxPriorityFeePerGas 替代。

  • maxFeePerGas 是用户愿意为每单位 gas 支付的最高费用。
  • maxPriorityFeePerGas 是用户设定的可选费用。使用这个变量,用户可能为高优先级交易支付溢价。每当一个区块达到 100% 容量时,这个参数决定着交易优先级,与 EIP-1559 之前相同。

我们将在本指南中全面讲解这两种发送交易的方法。

开发者设置

通过 QuickNode 访问以太坊

要与以太坊进行交互,比如发送交易,你需要一个 API 端点来连接网络。你可以使用公共节点或部署和管理你自己的基础设施;然而,如果你想要 8 倍的更快响应时间,你可以将繁重的工作留给我们。点击 这里 注册一个免费账户。

创建账户后,点击 创建一个端点 按钮。然后,选择你选择的链。我们在本指南中使用 以太坊 Sepolia 测试网

接下来,复制你的 HTTP 提供者 URL;你将在接下来的部分中使用它来访问以太坊区块链。

QuickNode Endpoints

创建钱包

让我们使用我们的 生成钱包 组件创建一个新钱包。只需点击 生成钱包 按钮,该组件就会为你创建一个新钱包。

如果你已经有一个钱包(例如 Metamask),你可以提取你的私钥以在本指南中使用。

保存你的 公共地址私钥;你将在本指南中使用它们。

💼 生成钱包

生成钱包

请仅将生成的钱包用于测试目的。请勿将其用于生产环境。

为钱包提供资金

要向区块链发送交易,你需要一个钱包,其中包含一些区块链原生加密货币。在这种情况下,你将需要以太币(ETH),这是以太坊的原生加密货币。

现在是为你的钱包提供资金的时候了,因为每一次区块链上的交易都需要一些 ETH 作为油费。如果你想了解更多关于油费的信息,请参见 本指南 的详细信息。

由于我们使用的是 Sepolia 测试网,我们可以从 QuickNode 的水龙头 自由获取一些 ETH。获取 ETH 的步骤如下:

  • 访问 QuickNode 水龙头
  • 选择 以太坊Sepolia
  • 输入你的钱包地址
  • 点击 继续 按钮并按照指示操作

你需要在以太坊主网上至少有 0.001 ETH 才能使用水龙头。如果你没有,也可以从其他水龙头获得一些测试 ETH。

QuickNode Faucet

设置项目

你已创建钱包并通过水龙头获取测试 ETH。现在是创建脚本的时候了。你需要一个终端窗口(即 Terminal, Windows PowerShell)和代码编辑器(即 Visual Studio Code)来设置项目。

在终端中运行以下代码以创建一个文件夹来存储你在本指南中将要构建的所有文件。

mkdir send-tx-python && cd send-tx-python

现在,使用 pip 安装 web3.py 库,这是 Python 的软件包管理工具。

如果你的系统同时安装了 Python 2Python 3,你可能需要使用 pip3 代替 pip

pip install web3

使用 Type-2 以太坊交易发送 ETH

然后,创建一个 Python 文件以使用 EIP-1559 升级后的参数发送 Type-2 交易。

echo > send-tx-type-2.py

现在,使用代码编辑器打开文件,并将以下代码粘贴到其中。我们在下面包含了代码的说明。

别忘了将代码中的这些占位符替换为实际值:

  • QUICKNODE_HTTP_PROVIDER_URL:从 通过 QuickNode 访问以太坊 部分获取的端点的 HTTP URL
  • YOUR_ADDRESS:你在 创建钱包 部分保存的钱包公共地址
  • RECIPIENT_ADDRESS:另一个钱包的公共地址。(例如 Vitalik 的地址 - 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
  • YOUR_PRIVATE_KEY:你在 创建钱包 部分保存的钱包私钥

在我们的指南中,我们将 11155111 作为链 ID,这是选定交易参数的原因,因为它是 Sepolia 测试网的链 ID。如果你使用不同的区块链,可以参考 ChainList 获取你想要使用的区块链的链 ID。然后,你可以在代码中替换它。

## 导入所需库
from web3 import Web3

## 连接到以太坊节点
web3 = Web3(Web3.HTTPProvider('QUICKNODE_HTTP_PROVIDER_URL'))

## 设置发送者和接收者地址
sender_address = 'YOUR_ADDRESS'
recipient_address = 'RECIPIENT_ADDRESS'

## 为发送者账户设置私钥。
## 请勿分享你的私钥。
private_key = 'YOUR_PRIVATE_KEY'

## 获取余额数据
balance_sender = web3.from_wei(web3.eth.get_balance(sender_address), 'ether')
balance_recipient = web3.from_wei(web3.eth.get_balance(recipient_address), 'ether')

print(f'账户 { sender_address } 的余额为: { balance_sender } ETH')
print(f'账户 { recipient_address } 的余额为: { balance_recipient } ETH')

## 获取并确定 gas 参数
latest_block = web3.eth.get_block("latest")
base_fee_per_gas = latest_block.baseFeePerGas   # 最近区块的基本费用(以 wei 为单位)
max_priority_fee_per_gas = web3.to_wei(1, 'gwei') # 优先费用,以便将交易包含在区块中
max_fee_per_gas = (5 * base_fee_per_gas) + max_priority_fee_per_gas # 你愿意支付的最高费用

## 定义交易参数
transaction_params = {
    'from': sender_address,
    'to': recipient_address,
    'value': web3.to_wei(0.01, 'ether'),  # 交易价值(本例中为 0.01 Ether)
    'nonce': web3.eth.get_transaction_count(sender_address),
    'gas': 21000,  # 交易的 gas 限制
    'maxFeePerGas': max_fee_per_gas, # 你愿意支付的最高费用
    'maxPriorityFeePerGas': max_priority_fee_per_gas, # 优先费用以将交易包括在区块中
    'chainId': 11155111 # Sepolia 测试网的 Chain ID
}

## 签署交易
transaction = web3.eth.account.sign_transaction(transaction_params, private_key)

## 发送交易
transaction_hash = web3.eth.send_raw_transaction(transaction.rawTransaction)

## 等待交易被挖掘
transaction_receipt = web3.eth.wait_for_transaction_receipt(transaction_hash)

## 检查交易状态
if transaction_receipt.status:
    print('交易成功!')
    print('交易哈希:', transaction_hash.hex())
    print(f'区块探索链接: https://sepolia.etherscan.io/tx/{transaction_hash.hex()}')
else:
    print('交易失败。')

## 在交易后获取余额数据
balance_sender = web3.from_wei(web3.eth.get_balance(sender_address), 'ether')
balance_recipient = web3.from_wei(web3.eth.get_balance(recipient_address), 'ether')

print(f'账户 { sender_address } 的余额为: { balance_sender } ETH')
print(f'账户 { recipient_address } 的余额为: { balance_recipient } ETH')
代码说明

send-tx-type-2.py 文件旨在使用 EIP-1559 升级后的参数发送 Type-2 交易。该文件包括向接收者的地址发送 0.01 ETH 的交易。以下是代码逻辑的详细信息。

  1. 导入库: 导入必要的库 web3,以与以太坊区块链交互。

  2. 连接到以太坊节点: 代码使用 QuickNode HTTP Provider URL 建立与以太坊节点的连接。

  3. 设置地址: 将发送者和接收者的以太坊地址分别指定为 sender_addressrecipient_address

  4. 设置私钥: 将与发送者以太坊账户相关的私钥设置为 private_key。保持私钥的私密性至关重要,切勿与任何人分享。

  5. 获取余额: 代码使用 get_balance 方法检索并打印发送者和接收者地址的余额。这些余额转换为以太币(Ether)以便于阅读。

  6. 确定 Gas 参数: 代码使用 get_block 方法从以太坊区块链获取最近的区块,并将其存储在变量 latest_block 中。然后,从 latest_block 中检索基本的 gas 费用并存储在变量 base_fee_per_gas 中。max_priority_fee_per_gas 是用户定义的优先费用,发送者愿意支付,以确保其交易尽快包含在区块中。在此代码中,该费用设为 1 gwei(10亿 wei)。max_fee_per_gas 是发送者愿意为每单位 gas 支付的金额。此金额通过将 max_priority_fee_per_gas 加上五倍的 base_fee_per_gas 计算得出。五是用户定义的常量,目的是确保发送者提供高于基本费用的费用,以鼓励将交易纳入区块。

  7. 定义交易参数: 交易参数设置为 transaction_params,包括发送者和接收者地址、交易价值(本例中为 0.01 Ether)、nonce(发送者地址发送的交易数量)、gas 限制、每单位 gas 的最大费用、优先费用以及 Sepolia 测试网的链 ID。

  8. 签署交易: 使用 sign_transaction 方法将交易签署,为 transaction_paramsprivate_key 作为输入。这确保了交易的真实性和授权。

  9. 发送交易: 已签署的交易通过 send_raw_transaction 方法发送到以太坊网络,返回交易哈希。

  10. 等待确认: 代码使用 wait_for_transaction_receipt 方法等待交易被挖掘,返回交易回执。

  11. 检查交易状态: 通过评估 transaction_receipt.status 检查交易状态。如果状态为真,则认为交易成功,并打印交易哈希。否则,交易被认为失败。

  12. 获取交易后的余额: 在交易后再次获取发送者和接收者地址的余额并打印,显示更新后的值。

现在,让我们运行脚本。

如果你的系统同时安装了 Python 2Python 3,你可能需要使用 python3 代替 python

python send-tx-type-2.py

该脚本将在交易发送之前和之后记录发送者和接收者账户的余额,以及交易哈希。

账户 0x58D09ecd499A1d6F2a0269f361Ee6DbbaBa44eF8 的余额为: 0.55 ETH
账户 0x833Cd8457F481274c794d2ac4eb277EC44252686 的余额为: 0 ETH
交易成功!
交易哈希: 0xed096c6914458c3886550f0094fd813d85ce5c5881c91feb5c9a7f4bd180b5cc
区块探索链接: https://sepolia.etherscan.io/tx/0xed096c6914458c3886550f0094fd813d85ce5c5881c91feb5c9a7f4bd180b5cc
账户 0x58D09ecd499A1d6F2a0269f361Ee6DbbaBa44eF8 的余额为: 0.539978999998845 ETH
账户 0x833Cd8457F481274c794d2ac4eb277EC44252686 的余额为: 0.01 ETH

请注意,由于油费的原因,发送者账户的余额减少的金额略高于发送的金额。

使用 Type-0 以太坊交易发送 ETH

现在是创建一个 Python 文件以使用 EIP-1559 升级之前的参数发送 Type-0(传统)交易。

echo > send-tx-type-0.py

使用代码编辑器打开文件,并将以下代码粘贴到其中。请务必像前一部分那样替换相应的占位符为你的实际值。

## 导入所需库
from web3 import Web3

## 连接到以太坊节点
web3 = Web3(Web3.HTTPProvider('QUICKNODE_HTTP_PROVIDER_URL'))

## 设置发送者和接收者地址
sender_address = 'YOUR_ADDRESS'
recipient_address = 'RECIPIENT_ADDRESS'

## 为发送者账户设置私钥。
## 请勿分享你的私钥。
private_key = 'YOUR_PRIVATE_KEY'

## 获取余额数据
balance_sender = web3.from_wei(web3.eth.get_balance(sender_address), 'ether')
balance_recipient = web3.from_wei(web3.eth.get_balance(recipient_address), 'ether')

print(f'账户 { sender_address } 的余额为: { balance_sender } ETH')
print(f'账户 { recipient_address } 的余额为: { balance_recipient } ETH')

## 定义交易参数
transaction_params = {
    'from': sender_address,
    'to': recipient_address,
    'value': web3.to_wei(0.01, 'ether'),  # 交易价值(本例中为 0.01 Ether)
    'nonce': web3.eth.get_transaction_count(sender_address),
    'gas': 21000,  # 交易的 gas 限制
    'gasPrice': web3.eth.gas_price, # 返回当前的 gas 价格(以 Wei 为单位)
    'chainId': 11155111 # Sepolia 测试网的 Chain ID
}

## 签署交易
transaction = web3.eth.account.sign_transaction(transaction_params, private_key)

## 发送交易
transaction_hash = web3.eth.send_raw_transaction(transaction.rawTransaction)

## 等待交易被挖掘
transaction_receipt = web3.eth.wait_for_transaction_receipt(transaction_hash)

## 检查交易状态
if transaction_receipt.status:
    print('交易成功!')
    print('交易哈希:', transaction_hash.hex())
    print(f'区块探索链接: https://sepolia.etherscan.io/tx/{transaction_hash.hex()}')
else:
    print('交易失败。')

## 在交易后获取余额数据
balance_sender = web3.from_wei(web3.eth.get_balance(sender_address), 'ether')
balance_recipient = web3.from_wei(web3.eth.get_balance(recipient_address), 'ether')

print(f'账户 { sender_address } 的余额为: { balance_sender } ETH')
print(f'账户 { recipient_address } 的余额为: { balance_recipient } ETH')

如前所述,唯一区别是使用了 gasPrice 参数,而不是 maxFeePerGasmaxPriorityFeePerGas

现在,运行该脚本。

如果你的系统同时安装了 Python 2Python 3,你可能需要使用 python3 代替 python

python send-tx-type-0.py

如果一切顺利,你的输出应该与下面的非常相似。显而易见,它与 Type-2 交易的输出非常相似。

账户 0x58D09ecd499A1d6F2a0269f361Ee6DbbaBa44eF8 的余额为: 0.539978999998845 ETH
账户 0x833Cd8457F481274c794d2ac4eb277EC44252686 的余额为: 0.01 ETH
交易成功!
交易哈希: 0xa7e12254ffc483467051027c2d5ccd164d2161ed75c09ba974d324b3347acc00
区块探索链接: https://sepolia.etherscan.io/tx/0xa7e12254ffc483467051027c2d5ccd164d2161ed75c09ba974d324b3347acc00
账户 0x58D09ecd499A1d6F2a0269f361Ee6DbbaBa44eF8 的余额为: 0.529978999968815 ETH
账户 0x833Cd8457F481274c794d2ac4eb277EC44252686 的余额为: 0.02 ETH

现在,让我们在 Sepolia 测试网区块浏览器中检查这两笔交易,从而查看交易详细信息、地址、代币和区块。

  1. 转到 以太坊 Sepolia 测试网浏览器
  2. 将你的交易哈希粘贴到搜索框中并按回车
  3. 更多细节 字段下,点击 单击以显示更多 查看其他详细信息

如果你检查两笔交易,一笔是 Type-0(传统) 交易,而另一笔是 Type-2(EIP-1559) 交易。此外,油费的细节也不同。传统交易只有一个油费参数,而 EIP-1559 交易有三个油费参数。

交易详情

结论

恭喜你获得了关于如何使用 Web3.py 构建和发送交易到以太坊区块链的基础知识!

本指南提供了利用 web3.py 库在以太坊网络上发送交易的全面操作。通过探索 EIP-1559 和传统方法,你深入了解了交易发起过程以及 EIP-1559 更新的影响。

如果你遇到任何问题或有任何疑问,我们很乐意为你提供帮助!请在 DiscordTwitter 找到我们。

我们 ❤️ 反馈!

让我们知道 如果你有任何反馈或新主题的请求。我们很想收到你的留言。

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。