本文详细探讨了如何使用Web3.py库在以太坊区块链上与ERC-20代币进行交互,涵盖了ERC-20代币的基本概念、设置开发环境、实现代币转账及授权等内容。文章提供了丰富的代码示例和指导,使开发者能够在实战中熟悉与以太坊的交互方式。
在本指南中,我们深入探讨与以太坊区块链交互的实际方面,特别关注 ERC-20 代币的转移。ERC-20 代币是一种标准的以太坊代币类型,广泛用于各种应用中。我们将使用流行的库:Web3.py for Python 来实现这一功能。
依赖项 | 版本 |
---|---|
Python | 3.9.6 |
web3.py | 6.18.0 |
要详细了解 ERC-20 代币、它们在以太坊生态系中的角色,以及对 ERC-20 智能合约批准至关重要的“approve”函数的深入了解,请参考我们的综合指南:如何使用 QuickNode SDK 发送 ERC-20 代币。本指南将特别关注使用 Web3py 的实际实施方面。
现在,在深入研究发送 ERC-20 代币的技术细节之前,让我们先设置一个免费的 QuickNode 端点并为我们的钱包提供资金。
你可以自由使用公共节点或部署并管理自己的基础设施;然而,如果你希望获得 8 倍的响应速度,你可以将重担留给我们。免费注册一个账户 这里。
登录后,点击 创建端点 按钮,然后选择你要部署的区块链和网络。为了本指南的目的,我们将选择 Ethereum Sepolia 链。
创建端点后,请保留该页面,因为我们将在本指南的技术编码部分中需要它。
提示
请注意,尽管我们在本指南中使用 Ethereum Sepolia 进行演示,但你也可以使用其他兼容 EVM 的链,如 Base、Polygon、Arbitrum 等,来与智能合约和 ERC-20 代币进行交互。
创建好基础设施后,我们现在将进入技术部分。
如果你在 Sepolia 测试网中需要 ETH,Multi-Chain QuickNode 水龙头 可以轻松获取测试 ETH!
导航到 Multi-Chain QuickNode 水龙头并连接你的钱包(例如 MetaMask、Coinbase Wallet),或粘贴你的钱包地址以检索测试 ETH。请注意,在以太坊主网使用 EVM 水龙头需要主网余额要求为 0.001 ETH。你还可以通过推特或用你的 QuickNode 账户登录以获取奖金!
在本指南的其余部分,我们将转到编码部分,并演示如何将 ERC-20 代币发送到以太坊地址,并批准智能合约分配一定数量的 ERC-20 代币。
我们将使用一个流行的 web3 SDK,名为 Web3.py,它被设计用于以太坊交互。使用 Web3.py,开发者和用户可以发送交易、与智能合约交互、读取区块数据以及其他多种用例。
首先,确保你已安装 Python(版本 3+),然后打开终端通过 Pip 安装 Web3py 库:
pip install web3
如果你在安装过程中遇到问题,可能是你的环境配置不正确。请参考故障排除 指南 获取有关如何建立干净环境的说明。
接下来,让我们创建一个名为 main.py 的文件:
echo > main.py
随后,输入以下 Python 代码:
from web3 import Web3
from web3.middleware import geth_poa_middleware
import json
## RPC URL 和合约细节的常量
RPC_URL = 'YOUR_QUICKNODE_ENDPOINT'
CONTRACT_ADDRESS = Web3.to_checksum_address('ERC20_CONTRACT_ADDRESS')
TO_ADDRESS = 'TO_ADDRESS' # 调整发送地址
## 替换为你的私钥
private_key = 'YOUR_PRIVATE_KEY'
## 检查是否提供了私钥
if not private_key:
raise ValueError("未提供私钥。")
## 创建连接到指定 RPC URL 的 Web3 实例
w3 = Web3(Web3.HTTPProvider(RPC_URL))
## 为使用授权共识算法的网络注入 PoA 中间件
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
## 检查与以太坊网络的连接
if not w3.is_connected():
raise ConnectionError("无法连接到 HTTPProvider")
## 从文件加载合约 ABI
with open('abi.json') as abi_file:
contract_abi = json.load(abi_file)
## 创建合约对象
contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=contract_abi)
## 定义交易细节
token_amount = w3.to_wei(1, 'ether') # 根据需要调整转账数量
## 获取交易的 nonce
nonce = w3.eth.get_transaction_count(w3.eth.account.from_key(private_key).address)
## 构建交易
transaction = contract.functions.transfer(TO_ADDRESS, token_amount).build_transaction({
'chainId': w3.eth.chain_id,
'gas': 2000000, # 根据需要调整气体限制
'gasPrice': w3.eth.gas_price, # 根据需要调整气体价格或使用 w3.eth.generate_gas_price()
'nonce': nonce,
})
## 用私钥签名交易
signed_txn = w3.eth.account.sign_transaction(transaction, private_key)
## 尝试发送交易
try:
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
print(f"交易已发送!哈希: {tx_hash.hex()}")
except Exception as e:
print(f"发送交易时出错: {e}")
记得将占位符 YOUR_QUICKNODE_ENDPOINT、YOUR_PRIVATE_KEY、ERC20_CONTRACT_ADDRESS 和 TO_ADDRESS 替换为实际值。
重要:你还需要在相同目录中创建一个 abi.json 文件,并包含你要转移代币的智能合约(ERC-20 代币)的 ABI。如果你要转移的 ERC-20 代币的智能合约已在 Etherscan 上验证,你可以通过合同标签检索 ABI。
最后,我们可以通过运行以下终端命令来执行代码:
python main.py
输出将类似于:
交易已发送!哈希: 0x9fc4ea7be48f5af020e257023e5e56c28246fe3d54c815bc5b623e45d5ef1aab
就是这样!
如本 指南 中 批准 部分所述,你无需使用 approve 函数将 ERC-20 代币转入智能合约;但是,如果你希望智能合约代表你访问部分或全部 ERC-20 代币,你需要首先调用 approve 函数。
让我们演示如何做到这一点。我们不会深入讨论设置文件(因为与上述过程相同),所以只需跟随而不编码。
transaction = contract.functions.approve(spender_address, token_amount).build_transaction({
'chainId': w3.eth.chain_id,
'gas': 2000000, # 根据需要调整气体限制
'nonce': nonce,
})
请注意唯一的变化是在函数名称和参数字段。我们将函数更新为 approve
,因为这是我们要调用的函数,并将参数值更新为 spender_address,它应该引用你想要批准代币的合约地址。因此,回顾一下,当使用 approve
函数时,你需要添加或更改的主要内容就是调用那个新函数,并更新地址以引用 spender_address 地址(智能合约)。
恭喜你完成本指南!你现在已经掌握了使用 Web3.py 自信地发送 ERC-20 代币的知识。这一技能是与以太坊区块链交互的基本部分,也是你 Web3 工具箱中的宝贵资产。
请记住,区块链开发是一个不断发展的领域,保持更新是 🔑。订阅我们的 新闻通讯,获取有关 Web3 和区块链的更多文章和指南。如果你有任何疑问或需要进一步的帮助,请随时加入我们的 Discord 服务器或使用下面的表单提供反馈。通过关注我们的 Twitter (@QuickNode) 和 Telegram 公告频道,保持信息畅通与联系。
让我们知道 如果你有任何反馈或新主题请求。我们非常期待你的意见。
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!