替换为你的Infura节点URL(或其他以太坊节点URL)

投稿 2026-07-15 7:57 点击数: 1

Python驾驭以太坊:轻松实现转账功能全解析


在区块链技术的浪潮中,以太坊(Ethereum)作为全球领先的智能合约平台,其灵活性和可编程性吸引了无数开发者和项目,从去中心化金融(DeFi)到非同质化代币(NFT),以太坊生态的繁荣离不开底层价值的转移——即以太币(ETH)及各类代币的转账,本文将深入探讨如何使用Python编程语言,结合强大的库,轻松实现以太坊的转账功能,带你走进区块链编程的实践世界。

为什么选择Python进行以太坊开发

Python以其简洁明了的语法、丰富的第三方库以及庞大的开发者社区,成为区块链开发,尤其是与以太坊交互的首选语言之一,无论是数据分析、脚本编写,还是构建去中心化应用(DApp)的后端逻辑,Python都能游刃有余,对于以太坊转账而言,Python可以让我们用更少的代码完成复杂的操作,降低开发门槛。

准备工作:环境与工具

在开始编写以太坊转账代码之前,我们需要准备以下几样“武器”:

  1. Python环境:确保你的系统已安装Python(推荐3.6及以上版本)。
  2. 随机配图
>以太坊节点:Python脚本需要与以太坊网络进行通信,这可以通过连接到本地运行的以太坊节点(如Geth或OpenEthereum)或使用第三方Infura、Alchemy等提供的远程节点服务来实现,对于初学者,使用Infura等节点服务更为便捷,无需自行同步和维护庞大的区块链数据。
  • 钱包与私钥:你需要一个包含足够ETH用于转账及手续费(Gas)的钱包,以及对应钱包的私钥。⚠️ 极度重要:私钥相当于你银行账户的密码,一旦泄露,资产将面临巨大风险,请务必妥善保管,不要在代码中硬编码私钥,或将其提交到版本控制系统。
  • Python库:我们将使用web3.py库,这是与以太坊节点进行交互最流行的Python库之一,它提供了丰富的API,用于账户管理、合约交互、转账等。
  • 安装web3.py非常简单,只需在终端运行:

    pip install web3

    使用Python实现以太坊转账:核心步骤

    下面,我们将通过一个完整的示例,展示如何使用Python和web3.py库从指定地址向另一个地址转账ETH。

    步骤1:导入必要的库并连接到以太坊节点

    from web3 import Web3
    import json
    infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
    w3 = Web3(Web3.HTTPProvider(infura_url))
    # 检查连接是否成功
    if w3.is_connected():
        print("成功连接到以太坊节点!")
    else:
        print("连接失败,请检查节点URL。")

    YOUR_INFURA_PROJECT_ID替换为你自己在Infura上创建的项目ID。

    步骤2:设置发送方账户信息(私钥与地址)

    # 替换为你的发送方私钥(⚠️ 生产环境务必使用安全方式管理私钥,如环境变量或加密钱包)
    sender_private_key = "YOUR_SENDER_PRIVATE_KEY"
    # 从私钥获取发送方地址
    sender_address = w3.eth.account.from_key(sender_private_key).address
    print(f"发送方地址: {sender_address}")

    步骤3:设置接收方地址与转账金额

    # 替换为接收方地址
    receiver_address = "0xReceiverAddressHere..."  # 示例: "0x742d35Cc6634C0532925a3b844Bc9e7595f8Ab1f"
    # 转账金额(以ETH为单位)
    amount_eth = 0.01
    # 将ETH转换为Wei(以太坊的最小单位,1 ETH = 10^18 Wei)
    amount_wei = w3.to_wei(amount_eth, 'ether')
    print(f"转账金额: {amount_eth} ETH ({amount_wei} Wei)")

    步骤4:构建交易

    以太坊转账本质上是一个交易,我们需要构建一个包含必要信息的交易字典。

    # 获取当前nonce(防止重放攻击)
    nonce = w3.eth.get_transaction_count(sender_address)
    # 构建交易
    transaction = {
        'nonce': nonce,
        'to': receiver_address,
        'value': amount_wei,
        'gas': 21000,  # 转账ETH的标准Gas限制
        'gasPrice': w3.eth.gas_price,  # 获取当前建议的Gas价格
        'chainId': 1  # 以太坊主网Chain ID,测试网可以使用3 (Ropsten) 或 4 (Rinkeby) 等
    }

    步骤5:签名交易

    使用发送方的私钥对交易进行签名。

    # 签名交易
    signed_txn = w3.eth.account.sign_transaction(transaction, sender_private_key)

    步骤6:发送交易并获取交易哈希

    将签名后的交易发送到以太坊网络。

    # 发送交易
    tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
    # 等待交易被打包并获取收据(可选)
    print(f"交易已发送,交易哈希: {tx_hash.hex()}")
    # 等待交易确认(例如等待5个区块确认)
    # receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120)
    # if receipt.status == 1:
    #     print("交易成功确认!")
    #     print(f"交易收据: {receipt}")
    # else:
    #     print("交易失败!")

    完整代码示例与注意事项

    将以上步骤整合,并添加错误处理和用户友好的提示,可以得到一个更健壮的脚本。请务必在实际使用前,在以太坊测试网(如Goerli)上进行充分测试。

    from web3 import Web3
    import time
    def send_eth():
        # 1. 连接节点
        infura_url = "https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID"  # 使用Goerli测试网
        w3 = Web3(Web3.HTTPProvider(infura_url))
        if not w3.is_connected():
            print("连接以太坊节点失败!")
            return
        # 2. 设置发送方信息 (⚠️ 测试网私钥,资产无实际价值,但仍需保管)
        sender_private_key = "YOUR_TESTNET_PRIVATE_KEY"
        sender_address = w3.eth.account.from_key(sender_private_key).address
        print(f"发送方地址: {sender_address}")
        # 3. 设置接收方与金额
        receiver_address = input("请输入接收方地址: ")
        if not w3.is_address(receiver_address):
            print("无效的接收方地址!")
            return
        amount_eth = float(input("请输入转账ETH数量: "))
        if amount_eth <= 0:
            print("转账数量必须大于0!")
            return
        amount_wei = w3.to_wei(amount_eth, 'ether')
        # 4. 构建交易
        try:
            nonce = w3.eth.get_transaction_count(sender_address)
            gas_price = w3.eth.gas_price
            print(f"当前Gas价格: {w3.from_wei(gas_price, 'gwei')} Gwei")
            transaction = {
                'nonce': nonce,
                'to': receiver_address,
                'value': amount_wei,
                'gas': 21000,
                'gasPrice': gas_price,
                'chainId': 5  # Goerli测试网Chain ID
            }
        except Exception as e:
            print(f"构建交易时出错: {e}")
            return
        # 5. 签名并发送交易
        try:
            print("正在签名交易...")
            signed_txn = w3.eth.account.sign_transaction(transaction, sender_private_key)
            print("正在发送交易...")
            tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
            print(f"交易发送成功!交易哈希: {tx_hash.hex()}")
            # 6. 等待交易确认
            print("等待交易确认...")
            receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=300) # 等待最多5分钟
            if receipt.status == 1:
                print("✅ 交易成功确认!")
                print(f"区块号: {receipt.blockNumber}")
                print(f"Gas使用量: {receipt.gasUsed}")
            else:
                print("❌ 交易执行失败!")
        except Exception as e:
            print(f"发送或确认交易时出错: {e}")
    if __name__ == "__main__":
        send_eth()

    重要注意事项:

    • 私钥安全:再次强调,绝对不要在代码中