/ 币圈行情

-1.连接到以太坊网络

发布时间:2025-11-17 15:45:35
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

解锁以太坊的交互之门:使用Python与ABI进行智能合约开发


区块链技术浪潮中,以太坊凭借其图灵完备的智能合约功能,成为了去中心化应用(Dapp)开发的基石,而对于任何希望与以太坊网络进行交互的开发者来说,有三个核心概念必须掌握:ABI以太坊Python,本文将深入探讨这三者如何协同工作,带你轻松实现Python与以太坊智能合约的交互,为你打开通往去中心化世界的大门。

核心概念解析:三位一体的基石

在深入代码之前,我们首先要理解这三个关键词的真正含义。

  1. ABI (Application Binary Interface - 应用二进制接口) 你可以把ABI想象成智能合约的“说明书”或“API文档”,它是一个标准化的JSON格式文件,详细描述了智能合约的公共接口,包括:

    • 函数列表:合约中所有可被外部调用的函数。
    • 函数名称:每个函数的名称。
    • 输入参数:每个函数需要接收的参数类型(如 uint256, address, string 等)。
    • 输出返回值:函数执行后返回的结果类型。
    • 状态可变性:函数是 pure (纯计算), view (只读), 还是 payable (可接收以太币)。

    没有ABI,你的Python代码就不知道合约长什么样,有哪些功能,以及如何正确地调用它,ABI是Python与智能合约之间进行“沟通”的桥梁。

  2. 以太坊 以太坊不仅仅是一个加密货币,更是一个全球性的、去中心化的计算机,在这个“计算机”上,开发者可以部署和运行智能合约,你的Python脚本通过连接到以太坊网络(无论是主网、测试网还是本地私有网络),来读取数据、发送交易,从而与部署在链上的智能合约进行交互。

  3. Python Python以其简洁的语法、强大的库生态和开发效率,成为了区块链开发领域的首选语言之一,它拥有成熟的库来处理加密、网络请求和与以太坊节点的交互,使得复杂的区块链操作变得简单直观。

实战准备:环境搭建

在开始编写代码之前,我们需要准备一个开发环境。

  1. 安装Python库:我们将使用 web3.py 库,这是Python中最流行、功能最强大的以太坊交互库。

    pip install web3
  2. 获取智能合约ABI:当你使用Solidity语言编写智能合约并编译后(可以使用在线编译器如 Remix IDE 或本地工具如 Truffle),编译器会自动生成ABI文件(一个.json文件),这里我们以一个简单的存储合约为例:

    Storage.sol

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.9;
    contract Storage {
        uint256 private number;
        function set(uint256 _newNumber) public {
            number = _newNumber;
        }
        function get() public view returns (uint256) {
            return number;
        }
    }

    编译后,你会得到类似这样的ABI(为了简洁,这里只列出关键部分):

    [
      {
        "inputs": [],
        "name": "get",
        "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [{ "internalType": "uint256", "name": "_newNumber", "type": "uint256" }],
        "name": "set",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      }
    ]
  3. 连接到以太坊节点:你的Python脚本需要一个入口点来访问以太坊网络,你有几个选择:

    • Infura或Alchemy:提供可靠的云端节点服务,适合主网和测试网开发。
    • 本地节点:在自己的电脑上运行一个以太坊客户端(如Geth或Nethermind)。
    • 本地开发网络:使用 Ganache 一键启动一个功能齐全的私有测试链,非常适合开发和调试。

    本文以 Infura 为例,你需要去 infura.io 注册并创建一个项目,获取一个以 https:// 开头的RPC URL。

代码实战:Python与ABI的完美邂逅

万事俱备,让我们开始用Python与智能合约交互,我们将实现两个操作:读取数据(调用get函数)写入数据(发送交易调用set函数)

from web3 import Web3
# 替换成你自己的 Infura 或 Alchemy RPC URL
INFURA_URL = "https://mainnet.infura.io/v3/YOUR_PROJECT_ID"
# 或者连接到本地Ganache: "http://127.0.0.1:7545"
w3 = Web3(Web3.HTTPProvider(INFURA_URL))
# 检查连接是否成功
if w3.is_connected():
    print("成功连接到以太坊节点!")
else:
    print("连接失败,请检查RPC URL。")
    exit()
# --- 2. 定义智能合约ABI和地址 ---
# 这里我们使用一个已部署在Goerli测试网上的简单存储合约作为示例
# 在实际开发中,这里应该是你自己的合约ABI和地址
CONTRACT_ABI = '[...]'  # 这里粘贴上面提供的JSON格式ABI
CONTRACT_ADDRESS = "0x5FbDB2315678afecb367f032d93F642f64180aa3" # 示例地址,请替换为你的合约地址
# 确保地址是校验过的格式
if not w3.is_address(CONTRACT_ADDRESS):
    print("无效的合约地址!")
    exit()
# --- 3. 实例化合约 ---
# 创建合约对象
contract = w3.eth.contract(address=CONTRACT_ADDRESS, abi=CONTRACT_ABI)
# --- 4. 读取合约数据 (调用 view/pure 函数) ---
# 使用 transact() 发送交易会修改链上状态
# 使用 call() 调用只读函数,不会产生gas费
try:
    # 调用 get() 函数
    stored_number = contract.functions.get().call()
    print(f"当前存储的数字是: {stored_number}")
except Exception as e:
    print(f"读取数据时出错: {e}")
# --- 5. 写入合约数据 (发送交易调用 nonpayable/payable 函数) ---
# 发送交易需要支付Gas费,并且需要发送者的账户来签名交易
# 你需要一个拥有ETH的账户地址和对应的私钥(仅用于演示,请勿将私钥硬编码或上传到GitHub!)
# 设置发送者账户
# 在实际应用中,应该从安全的地方(如环境变量或加密钱包)加载私钥
sender_address = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" # 示例地址
private_key = "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" # 示例私钥
# 获取账户的nonce,确保交易顺序正确
nonce = w3.eth.get_transaction_count(sender_address)
# 构建交易
# 要调用的函数名和参数
tx = contract.functions.set(42).build_transaction({
    'chainId': 5, # Goerli测试网的Chain ID
    'gas': 200000,
    'gasPrice': w3.to_wei('10', 'gwei'),
    'nonce': nonce,
})
# 签名交易
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
# 发送交易
print("正在发送交易...")
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
print(f"交易已发送,交易哈希: {w3.to_hex(tx_hash)}")
# 等待交易被打包
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f"交易收据: {tx_receipt}")
# 再次读取数据,验证是否修改成功
updated_number = contract.functions.get().call()
print(f"修改后存储的数字是: {updated_number}")

总结与展望

通过以上步骤,我们成功地利用Python、web3.py库和智能合约ABI,实现了与以太坊网络上智能合约的读取写入操作。

  • ABI是灵魂

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:bangqikeconnect@gmail.com