:2026-02-18 22:42 点击:4
Python 与以太坊 RPC:开启区块链交互的便捷之门
在区块链技术飞速发展的今天,以太坊(Ethereum)作为全球领先的智能合约平台,吸引了无数开发者和研究者的目光,而 Python,以其简洁的语法、强大的库支持和广泛的应用生态,成为了与区块链技术进行交互的热门选择,通过以太坊的 RPC(Remote Procedure Call,远程过程调用)接口,Python 可以轻松地连接到以太坊节点,执行各种操作,如查询账户信息、发送交易、部署智能合约等,本文将详细介绍如何利用 Python 和以太坊 RPC 进行交互。
以太坊节点(如 Geth、Parity 或 Infura 提供的节点)通过 JSON-RPC 协议暴露其功能,JSON-RPC 是一种轻量级的远程过程调用协议,使用 JSON 格式进行数据编码,开发者可以通过发送 HTTP 或 WebSocket 请求到节点的指定端口(默认为 8545),调用预先定义好的方法(如 eth_blockNumber, eth_getBalance, eth_sendTransaction 等),并接收节点返回的 JSON 响应。
以太坊 RPC 就是以太坊节点提供的一套“API”,允许外部程序(如我们的 Python 脚本)向节点发送指令并获取结果。
requests 库发送 HTTP 请求与 RPC 交互,但有许多优秀的第三方库(如 web3.py)封装了底层的 RPC 调用细节,提供了更高级、更友好的 API,大大简化了开发难度。要进行 Python 与以太坊 RPC 的交互,最常用的库是 web3.py,你可以使用 pip 进行安装:
pip install web3
你还需要一个以太坊节点的 RPC 地址,这可以是你自己本地的节点(运行 Geth 或 Nethermind 并开启 RPC 服务),也可以是第三方服务提供商(如 Infura、Alchemy)提供的节点地址,对于初学者,使用 Infura 等服务更为便捷,无需自己同步和维护区块链数据。
下面我们以 web3.py 库为例,展示如何连接到以太坊节点并执行一些常见操作。
连接到以太坊节点
你需要导入 Web3 类,并提供节点的 RPC URL。
from web3 import Web3
# Infura 的 URL: "https://mainnet.infura.io/v3/YOUR_PROJECT_ID"
# 或本地节点: "http://127.0.0.1:8545"
rpc_url = "https://mainnet.infura.io/v3/YOUR_PROJECT_ID" # 请替换为你的实际 RPC URL
w3 = Web3(Web3.HTTPProvider(rpc_url))
# 检查连接是否成功
if w3.is_connected():
print(f"成功连接到以太坊节点!当前区块号: {w3.eth.block_number}")
else:
print("连接失败!")
查询账户余额
你可以通过地址查询以太坊账户的 ETH 余额。
# 替换为你想查询的以太坊地址
address = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
# 确保地址是 checksum 格式
checksum_address = w3.to_checksum_address(address)
# 查询余额(单位是 Wei)
balance_wei = w3.eth.get_balance(checksum_address)
# 将 Wei 转换为 ETH
balance_eth = w3.from_wei(balance_wei, 'ether')
print(f"地址 {checksum_address} 的余额是: {balance_eth} ETH")
发送交易(需要私钥和 Gas)
发送交易是一个相对复杂的过程,需要发送方地址的私钥进行签名,并指定 Gas 限制和 Gas 价格。
from web3.exceptions import TransactionNotFound # 发送方私钥(请妥善保管,切勿泄露) sender_private_key = "YOUR_SENDER_PRIVATE_KEY" # 替换为发送方私钥 sender_address = w3.eth.account.from_key(sender_private_key).address # 接收方地址 receiver_address = "0x1234567890123456789012345678901234567890" # 获取当前最新的 nonce nonce = w3.eth.get_transaction_count(sender_address) # 构建交易 tx = { 'nonce': nonce, 'to': receiver_address, 'value': w3.to_wei(0.01, 'ether'), # 发送 0.01 ETH 'gas': 21000, # 转账交易的典型 Gas 限制 'gasPrice': w3.eth.gas_price, # 当前建议的 Gas 价格 'chainId': 1, # 以太坊主网 chainId } # 签名交易 signed_tx = w3.eth.account.sign_transaction(tx, sender_private_key) # 发送交易 tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) print(f"交易已发送,交易哈希: {w3.to_hex(tx_hash)}") # 等待交易被打包 try: receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120) print(f"交易收据: {receipt}") except TransactionNotFound: print("交易在指定时间内未被确认")
调用智能合约
与智能合约交互通常需要合约的 ABI(Application Binary Interface,应用程序二进制接口)和合约地址。
# 假设我们有一个简单的 ERC20 代币合约
# 合约地址 (示例,实际使用时替换)
contract_address = "0xTokenContractAddress"
# 合约 ABI (示例,实际使用时替换为完整的 ABI)
# 这里只包含一个简单的 balanceOf 函数的 ABI 片段
abi = [
{
"constant": True,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "balance", "type": "uint256"}],
"type": "function"
}
]
# 创建合约实例
contract = w3.eth.contract(address=contract_address, abi=abi)
# 调用合约的 balanceOf 函数 (不修改状态,只读)
owner_address = "0xOwnerAddressToken"
balance = contract.functions.balanceOf(owner_address).call()
print(f"地址 {owner_address} 在合约中的代币余额: {balance}")
web3.py 提供了异步支持(web3.eth.async Eth),可以更高效地处理并发请求。通过 Python 和以太坊 RPC,开发者能够以相对简单的方式访问以太坊区块链的强大功能。web3.py 库更是极大地降低了这一门槛,使得构建去中心化应用(DApps)、进行区块链数据分析、自动化交易等任务变得触手可及,随着 Web3 技术的不断发展,掌握 Python 与以太坊 RPC 的交互方法,无疑将为开发者在区块链领域打开更多机遇之门,希望本文能为你的区块链开发之旅提供一个良好的起点。
本文由用户投稿上传,若侵权请提供版权资料并联系删除!