Vyper语言模块系统详解:从基础使用到高级特性

Vyper语言模块系统详解:从基础使用到高级特性

vyper Pythonic Smart Contract Language for the EVM vyper 项目地址: https://gitcode.com/gh_mirrors/vy/vyper

什么是Vyper模块

在Vyper智能合约语言中,模块是一组函数定义和变量声明的集合,它提供了一种代码复用的机制。与Solidity等语言不同,Vyper更倾向于通过组合(composition)而非继承(inheritance)来实现代码复用。模块可以封装从类型定义、函数声明到状态变量的所有内容,形成一个独立的可复用单元。

模块的基本使用

创建模块

在Vyper中,任何合约本身就是一个有效的模块。例如,下面是一个简单的所有权管理模块:

# ownable.vy

owner: address

@deploy
def __init__():
    self.owner = msg.sender

def _check_owner():
    assert self.owner == msg.sender

@pure
def _times_two(x: uint256) -> uint256:
    return x * 2

@external
def update_owner(new_owner: address):
    self._check_owner()
    self.owner = new_owner

这个模块提供了两个主要功能:

  1. 内部辅助函数_check_owner()用于验证调用者是否为所有者
  2. 外部函数update_owner()允许所有者更新合约所有权

导入模块

Vyper支持多种导入语法,以下是等效的导入方式:

import ownable                # 通过ownable访问
import ownable as ow          # 通过ow访问
from . import ownable         # 通过ownable访问
from . import ownable as ow   # 通过ow访问

对于纯函数(不依赖状态的函数),可以直接使用:

import ownable as helper

@external
def my_function(x: uint256) -> uint256:
    return helper._times_two(x)

模块状态管理

模块初始化

要使用模块的状态变量,必须首先初始化模块。这通过initializes关键字实现:

import ownable

initializes: ownable

@deploy
def __init__():
    ownable.__init__()

@external
def my_access_controlled_function():
    ownable._check_owner()  # 只有owner可以调用
    # 其他操作...

初始化时需要注意:

  • 模块的__init__()函数只能调用一次
  • 模块状态变量通过模块名.变量名访问

作为接口使用

模块也可以作为接口使用,通过__at__语法:

import ownable

an_ownable: ownable.__interface__

def call_ownable(addr: address):
    self.an_ownable = ownable.__at__(addr)
    self.an_ownable.transfer_ownership(...)

高级模块特性

uses语句

uses语句允许模块使用另一个模块的状态而不直接初始化它,这种设计通常用于库开发:

# ownable_2step.vy
import ownable

uses: ownable

pending_owner: address

@deploy
def __init__():
    self.pending_owner = empty(address)

@external
def begin_transfer(new_owner: address):
    ownable._check_owner()
    self.pending_owner = new_owner

@external
def accept_transfer():
    assert msg.sender == self.pending_owner
    ownable.owner = new_owner
    self.pending_owner = empty(address)

带依赖的模块初始化

当模块有依赖关系时,需要使用特殊的:=语法:

import ownable
import ownable_2step

initializes: ownable
initializes: ownable_2step[ownable := ownable]

@deploy
def __init__():
    ownable.__init__()
    ownable_2step.__init__()

函数导出机制

Vyper中,外部函数不会自动包含在最终合约中,必须显式导出:

# 导出单个函数
exports: ownable_2step.transfer_ownership

# 导出多个函数
exports: (
    ownable_2step.transfer_ownership,
    ownable_2step.accept_ownership,
)

# 导出整个接口
exports: base_token.IERC20

# 导出模块所有外部函数
exports: ownable_2step.__interface__

设计理念与注意事项

Vyper模块系统的设计受到Rust所有权系统的启发,具有以下特点:

  1. 模块状态访问前必须"使用"或"初始化"
  2. 模块可以"使用"多次
  3. 如果模块状态被访问,必须"初始化"且只能初始化一次

使用模块时需要注意:

  • 确保__init__()函数按依赖顺序调用
  • 避免重复初始化
  • 明确导出需要的函数

Vyper的模块系统通过这种严格的设计,既保证了代码的复用性,又确保了合约的安全性和可预测性。

vyper Pythonic Smart Contract Language for the EVM vyper 项目地址: https://gitcode.com/gh_mirrors/vy/vyper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆可鹃Joey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值