Safe-eth-py 开发指南:掌握以太坊与 Safe 智能账户交互的核心工具库

·

在以太坊生态系统开发中,高效、安全的工具库至关重要。safe-eth-py 作为一个功能强大的 Python 库,为开发者提供了与以太坊及其相关项目(尤其是 Safe 智能账户)交互的全面解决方案。无论您是处理智能合约、整合价格预言机,还是构建 Django 支持的 Web 应用,这个库都能显著提升开发效率。

核心功能概览

safe-eth-py 集成了多个专门设计的模块,覆盖以太坊开发的常见需求:

快速安装与配置

安装 safe-eth-py 非常简单,只需使用 pip 包管理器:

pip install safe-eth-py

或者,将其添加到项目的 requirements.txt 文件中。

如果您需要 Django 相关的功能(如模型、序列化器等),请使用:

pip install safe-eth-py[django]

注意:在某些系统上,依赖项 coincurve 可能需要额外的库才能正确编译。如果遇到构建问题,请确保系统已安装所需的开发工具链。

为新区块链添加 Safe 支持

若希望为新的区块链网络添加 Safe 智能账户支持,社区驱动的流程使得贡献变得简单:

  1. 在项目的 GitHub 仓库中创建一个新议题
  2. 使用专用的模板 add_safe_address_new_chain.yml 填写新区链的详细信息。
  3. 提交后,系统会自动执行验证检查。
  4. 验证通过后,将自动创建一个拉取请求(Pull Request)。
  5. 最终,由 Safe 团队审核并合并该自动生成的拉取请求。

👉 查看实时多链支持状态与贡献指南

以太坊实用工具详解

EthereumClient 类

EthereumClient 是与以太坊节点交互的核心类。它通过 HTTP/HTTPS URL 连接节点,不仅封装了 Web3.py 的功能,还提供了许多性能优化工具。

一个关键特性是批量调用(batch calls),它允许在单个请求中向多个合约发起只读调用,极大减少了网络延迟并提升了效率:

from safe_eth.eth import EthereumClient
from safe_eth.eth.contracts import get_erc721_contract

ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
erc721_contract = get_erc721_contract(ethereum_client.w3, token_address)

# 批量获取代币名称和符号
name, symbol = ethereum_client.batch_call([
    erc721_contract.functions.name(),
    erc721_contract.functions.symbol(),
])

您当然也可以直接访问底层的 Web3.py 实例,以使用其全部原生功能:

block_data = ethereum_client.w3.eth.get_block(57)

常量与预言机

常用常量
库定义了以太坊开发中常用的常量,如零地址(NULL_ADDRESS)、哨兵地址(SENTINEL_ADDRESS)以及签名参数(R, S, V)的最大最小值。

价格预言机
safe_eth.eth.oracles 模块集成了多个去中心化交易所的价格预言机,例如 UniswapV2。您可以轻松查询任意两种代币之间的兑换价格:

from safe_eth.eth import EthereumClient
from safe_eth.eth.oracles import UniswapV2Oracle

ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
uniswap_oracle = UniswapV2Oracle(ethereum_client)

gno_address = '0x6810e776880C02933D47DB1b9fc05908e5386b96'
weth_address = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'

# 获取 GNO 相对于 WETH 的价格
price = uniswap_oracle.get_price(gno_address, weth_address)

高级工具函数

safe_eth.eth.utils 包含实用的底层操作函数,其中最值得一提的是 mk_contract_address_2。它用于计算使用 CREATE2 操作码部署的新合约的地址,这对于实现 counterfactual(假设存在)部署等高级模式非常有用。

Django 集成与 REST 工具

对于使用 Django 和 Django REST framework 构建 Web 应用的开发者,safe-eth-py 提供了强大的开箱即用支持:

所有这些组件都配有完整的测试套件,保障了代码的可靠性与稳定性。

Safe API 集成服务

safe_eth.safe.api 模块封装了与 Safe 官方交易服务 API(Transaction Service API)的交互。通过它,开发者可以程序化地管理 Safe 账户、交易、委托和消息。

重要:使用默认的交易服务需要 API 密钥。您可以通过两种方式设置:

  1. 设置环境变量 SAFE_TRANSACTION_SERVICE_API_KEY
  2. 在初始化 TransactionServiceApi 时直接传入 api_key 参数。

要获取 API 密钥,请在 Safe Developer Portal 上注册账户。如果您使用的是自定义部署的交易服务(通过 base_url 参数设置),则可能不需要 API 密钥。

from safe_eth.eth import EthereumNetwork
from safe_eth.safe.api import TransactionServiceApi

# 初始化针对 Gnosis 链的 API 客户端
transaction_service_api = TransactionServiceApi(EthereumNetwork.GNOSIS)

# 获取指定 Safe 地址的所有交易
transactions = transaction_service_api.get_transactions("0xAedF684C1c41B51CbD228116e11484425d2FACB9")

常见问题

safe-eth-py 的主要用途是什么?
它是一个综合性的 Python 库,旨在简化与以太坊区块链和 Safe 智能账户的交互。核心功能包括增强的节点客户端、多链 Safe 支持、多种价格预言机以及无缝的 Django 框架集成。

如何解决安装时的 coincurve 编译错误?
这通常是由于系统缺少编译所需的底层密码学库(如 libsecp256k1)引起的。请根据您的操作系统安装相应的开发依赖包,然后再尝试安装 safe-eth-py。

EthereumClient 的批量调用有何优势?
批量调用允许在单个网络请求中执行多个合约视图函数调用,相比逐个调用,能显著降低网络延迟,大幅提升数据检索效率,尤其是在需要获取大量合约状态时。

我可以使用自定义的 Safe 交易服务吗?
可以。在初始化 TransactionServiceApi 时,通过 base_url 参数指定您自定义服务的根 URL 即可。需要注意的是,自定义服务可能不需要或不使用 API 密钥认证。

如何在 Django 模型中正确地存储以太坊地址?
强烈建议使用 safe_eth.eth.django.models.EthereumAddressField 作为模型字段。它不仅确保了地址以校验和格式存储,还内置了有效性验证。

库支持哪些以太坊网络?
该库设计为支持所有以太坊虚拟机兼容网络。对于 Safe 智能账户的支持,则通过社区贡献流程不断添加新区块链。您可以查看项目文档或源码了解已正式支持的网络列表。


本库由全球开发者社区共同维护,欢迎所有形式的贡献。