Vyper编程语言:特性、安全性与应用场景

  • cyfrin
  • 发布于 1天前
  • 阅读 111

本文详细介绍了Vyper编程语言,在智能合约开发中的安全性和简洁性,强调了其设计原则与核心特性。通过比较Vyper和Solidity,指出Vyper在安全优先和易审计性方面的优势,同时提供了安装Vyper的步骤和最佳实践,适合需要高安全性的区块链项目开发者。

Vyper 编程语言:智能合约开发者指南

学习 Vyper 以进行安全的智能合约开发。探索其功能、安全优势、与 Solidity 的比较、安装流程以及现实世界中的 DeFi 用例。

你知道吗,超过 7,959 个用 Vyper 编写的智能合约在领先的区块链上保护了超过 23 亿美元的锁定总价值(Total Value Locked, TVL)?要了解这一点的重要性,可以考虑到有 23 个国家的整个经济价值还不如这个数字。

一张图表显示了 Vyper 的锁定总价值(TVL)随时间的变化,2025 年 1 月 23 日达到峰值 23.33 亿美元。

来源:DeFiLlama

一张表列出了在各个区块链上 Vyper 合约的部署数量,包括以太坊、Avalanche 和 Arbitrum。

来源:Dune

虽然 Vyper 并没有像 Solidity 那样流行,但这个智能合约编程语言功能强大,特别适合在以太坊虚拟机( EVM)兼容的网络上创建 智能合约。随着安全漏洞持续挑战 区块链 行业,Vyper 对简单性和安全性的专注使其成为开发者和 协议 的一个有吸引力的选择。

因此,这种面向合约的编程语言越来越受到欢迎。让我们探索一下它的具体含义及其对 智能合约开发 的功能价值。

什么是 Vyper 编程语言?

Vyper 是一种特意为 EVM 设计的 Python 风格编程语言。它于 2017 年创建,响应了智能合约开发中的安全担忧,强调了三个 核心原则:安全性、简单性和可审计性。

与 Solidity 不同,Vyper 有意限制某些编程特性,以减少潜在漏洞,增强代码安全性并促进审计。这一目标是确保安全、高效的智能合约的开发。

Vyper 的设计原则有助于实现这一目标:

  1. 安全第一:每个设计选择都优先考虑安全性,甚至不惜牺牲便利性,排除“风险”特性。

  2. 简约的特性集:有限的特性集减少了攻击面,使智能合约更安全、更容易审计。

  3. 类似 Python 的语法:简洁可读,Vyper 的 语法 使 Python 开发者容易理解。这降低了学习曲线,减少了错误。

  4. 强类型系统:Vyper 对变量、函数输入和输出进行了严格的类型检查。这防止了意外的类型转换,确保了合约的可预测性。

  5. 内置保护:Vyper 包含自动保护措施,如溢出检查、数组和字符串的边界验证、以及重入保护。这些减小了常见智能合约漏洞的风险。

这些基础原则为 Vyper 独特特性的实现奠定了基础,接下来我们将探讨这些特性。

Vyper 的核心特性

Vyper 的特性使其极为适合在 EVM 区块链上编写智能合约。

内置安全特性

该语言提供了一些基本的安全措施,以防止常见的漏洞:

  • 自动溢出检查:所有算术运算都会自动检查溢出条件,防止可能导致合约漏洞的数值错误。

  • 显式边界检查:数组和字符串操作包含内置的边界检查,消除其他语言中常见的缓冲区溢出漏洞。

  • Gas 限制保护:Vyper 允许精确计算 gas 消耗的上限。这有助于防止基于 gas 耗尽的拒绝服务(DoS)攻击。

  • 重入 保护:该语言包含防止 重入攻击 的内置保护,这是智能合约中常见的一种漏洞。

一张图表概述了 Vyper 的内置安全特性,如自动溢出检查、显式边界检查、gas 限制安全和重入保护。

这些内置的安全特性确实有可能带来一些缺点。

Vyper 的有意权衡以优先考虑安全性

通过专注于安全性和可审计性,Vyper 有意排除了许多在其他语言中常见的编程特性:

  1. 无函数重载:与 Solidity 或 Python 不同,Vyper 不允许多个同名但参数不同的函数。每个函数必须有唯一的名称,消除了歧义,简化了审计。

  2. 无操作符重载:与 Python 或 C++ 不同,Vyper 防止重新定义操作符,以避免隐藏逻辑风险。操作符保留标准行为,确保可预测性和安全性。

  3. 无递归调用:Vyper 编程语言完全消除了递归函数,以强制执行可预测的 gas 消耗并避免 gas 限制攻击。

  4. 无无限长度循环:编写 Vyper 智能合约时,所有循环必须具有固定的边界。这确保了 gas 限制可以被精确计算,防止 DoS 攻击。

  5. 无修饰符:函数修饰符,允许隐藏前提条件、后条件或 状态 更改,被排除。相反,内联 assert 声明使代码更易于阅读和审计。

  6. 无类继承:不包括继承简化了程序理解,并消除了跟踪多个文件或优先规则之间行为的需求。

  7. 无内联汇编:防止引入难以跟踪的低级操作,保持了代码的可读性和可追溯性。

现在你已经对 Vyper 编程语言有了一个高层的理解,接下来看看如何开始构建 Vyper。

安装 Vyper

要使用 Vyper,你必须设置开发环境。以下是一步一步的指南,帮助你开始:

前提条件

首先,确保你的设置满足最低要求:

  1. Python 环境

    • 安装 Python 3.6 或更高版本
    • 可用的 Python 套件安装管理器( uvpip
    • 虚拟环境(建议)
  2. 开发工具

    • Git(用于版本控制)
    • 支持 Python 的代码编辑器
    • 命令行接口(CLI)访问

安装方法

使用 uv(推荐)

由于 Vyper 是一个命令行工具,因此我们应该在其自己的虚拟隔离环境中安装 Vyper。这样,如果你下载其他 Python 工具,就不会遇到依赖管理问题。例如,如果你有一个依赖 3.10 版本 Vyper 的 Python 项目,但你想在命令行中使用 4.0 版本的 Vyper,你可以让你的项目使用 3.10,因为命令行的 Vyper 是隔离的!

uv tool install vyper

## 验证安装
vyper --version

但是,如果你想将 Vyper 添加到 Python 项目中,可以运行:

uv venv
source .venv/bin/activate
uv add vyper

## 验证安装
vyper --version
使用 pip

此方法直接从 Python 包索引(PyPI)安装 Vyper。Pip 是人们在 Python 虚拟环境中安装软件包的最常用方式。

## 创建并激活虚拟环境(推荐)
python -m venv vyper-env
source vyper-env/bin/activate  # 在 Windows 上:vyper-env\Scripts\activate

## 安装 Vyper
pip install vyper

## 验证安装
vyper --version

安全提示:一个 隔离的开发环境 确保依赖项与系统安装保持分离。这减少了与其他 Python 项目之间发生冲突的风险,以及潜在恶意 Python 脚本被运行的风险。

使用 Docker

Docker 允许你在容器化环境中运行 Vyper,避免将其直接安装在你的计算机上,同时提高安全性。因此,如果你想要一个干净、便携的设置,而又不修改本地环境,这是一种理想选择。

## 拉取最新的 Vyper Docker 镜像
docker pull vyperlang/vyper

## 在容器中运行 Vyper
docker run -v $(pwd):/code vyperlang/vyper /code/your_contract.vy

这种方法在处理多个项目或与其他人协作时尤其有用。

从源代码构建

一些开发者可能希望获取最新特性或为 Vyper 的开发作出贡献。在这种情况下,从源代码构建 编译器 是最佳选择。

## 克隆仓库
git clone https://github.com/vyperlang/vyper.git
cd vyper

## 安装依赖
pip install -e .

这种方法提供了对最新更新的访问,并允许你探索 Vyper 编译器的内部材料。然而,这可能比预构建选项需要更多的维护。

所以,选择最适合你开发需求和工作流程的方法。

安装后设置

安装 Vyper 后,完成以下步骤:

  1. 配置你的集成开发环境(IDE)

    • 安装 Vyper 语法高亮扩展(例如 tintinwebtrocher

    • 设置代码检查工具(分析代码的错误、漏洞、风格问题或可疑构造的程序或扩展)

    • 配置编译设置,使你能够直接在 IDE 中编译 Vyper 代码,从而简化开发工作流程。

  2. 设置开发工具

    • 安装测试框架,如 FoundryMoccasin,以简化 Vyper 智能合约的开发和测试。尤其是,Moccasin 提供了一种 Python 风格的方式来管理合约的部署和测试,且与 Vyper 完美集成。

    • 配置你的部署工具,以简化与区块链的交互、管理部署参数和监控结果。

    • 设置本地区块链环境。这是一个在你的计算机上本地运行的模拟区块链,例如 Foundry 的 anvil。它允许你开发、测试和调试智能合约,而无需与实时网络交互。这种方法节省时间,避免不必要的成本。

现在你可以开始编写代码了。

用 Vyper 编写智能合约

让我们探讨一个如何使用 Vyper 编程语言编写智能合约的示例。该合约实现了一个基本的 ERC-20 代币,并附带几个安全特性:

## pragma version 0.4.0
"""
@license MIT
@title ERC20
@author You!
@dev 这是一个基本(不完全正确)的 ERC20 合约
"""

## 合约状态变量
owner: public(address)
total_supply: public(uint256)
balances: public(HashMap[address, uint256])
allowances: public(HashMap[address, HashMap[address, uint256]])

## 跟踪合约活动的事件
event Transfer:
    sender: indexed(address)
    receiver: indexed(address)
    amount: uint256

event Approval:
    owner: indexed(address)
    spender: indexed(address)
    amount: uint256

@deploy
def __init__(_total_supply: uint256):
    """
    @notice 初始化代币合约
    @param _total_supply 代币的初始总供应量
    """
    self.owner = msg.sender
    self.total_supply = _total_supply
    self.balances[msg.sender] = _total_supply

@external
def transfer(_to: address, _value: uint256) -> bool:
    """
    @notice 将代币转账到另一个地址
    @param _to 收件人地址
    @param _value 要转移的代币数量
    @return 转账成功与否
    """
    assert self.balances[msg.sender] >= _value, "余额不足"
    assert _to != empty(address), "无法转账到零地址"

    self.balances[msg.sender] -= _value
    self.balances[_to] += _value
    log Transfer(msg.sender, _to, _value)
    return True

@external
def approve(_spender: address, _value: uint256) -> bool:
    """
    @notice 授权地址代为支出代币
    @param _spender 需要被授权的地址
    @param _value 被授权的代币数量
    @return 授权成功与否
    """
    assert _spender != empty(address), "无法授权零地址"

    self.allowances[msg.sender][_spender] = _value
    log Approval(msg.sender, _spender, _value)
    return True

理解 Vyper 的代码结构

  1. 状态变量

    • 清晰的可见性修饰符使用 public 确保透明性:可见性修饰符决定了变量可以如何以及在哪里被访问。public 允许变量被外部读取。

    • 所有变量均显式声明类型,以增强安全性:定义显式数据类型(如 uint256, address)防止由于类型不匹配引起的意外行为。这也帮助合约按预期运作。

    • 使用 HashMaps 通过优化数据结构进行高效存储HashMap 是一种键值存储结构,用于存储余额和授权。它允许快速查找,是管理像用户账户这样的复杂数据集的高效工具。

  2. 事件

    • 索引参数方便高效过滤:事件中的索引参数允许日志轻松查询和过滤。因此,用户和第三方工具能够跟踪活动,如账户之间的转账。

    • 清晰记录转账和批准活动:像 TransferApproval 这样的事件明确记录代币的运动和权限。这使得开发者和审计者更容易跟踪合约的行为。

    • 标准化事件结构以提高互操作性:使用广为人知的事件格式确保与外部工具和平台(例如区块链浏览器或钱包)的兼容性。

  3. 功能

    • 内置安全检查防止常见漏洞:函数确保在转账前检查足够的余额或验证收件人地址是否有效。这些措施防止了典型问题,如超额度支出或转移到无效地址。

    • 清晰的错误消息帮助调试失败的断言:错误消息描述了失败的原因。这帮助开发者快速识别并修复测试或审计过程中的问题。

那么,Vyper 和 Solidity 之间有何区别?

Vyper vs Solidity:全面比较

Vyper 和 Solidity 都是与 EVM 兼容的智能合约语言,但它们满足不同的需求。了解它们的区别有助于开发者选择正确的工具。

  • 语法和学习曲线:Solidity 的语法类似于 C++ 和 JavaScript。相比之下,Vyper 受 Python 启发的语法广泛使用,更简单、更易于理解。使其特别适合初学者或具 Python 背景的人。

  • 灵活性与简单性:Solidity 提供了多种特性,包括动态 数组、继承和修饰符,使开发者能够构建高度可定制和复杂的智能合约。然而,这种灵活性带来了更陡峭的学习曲线和更大的潜在漏洞风险。另一方面,Vyper 通过设计有意牺牲了许多这些特性,以优先考虑清晰性、可预测性和安全性。这确保了代码更易于审计和维护。

  • 工具和社区支持:Solidity 受益于广泛的社区支持、大量活跃开发者的生态系统、Remix 等工具及 OpenZeppelin 的合约库,以及全面的文档。而 Vyper 虽在成长,但工具和社区支持较少。这可能给寻找现成解决方案的开发者带来挑战。

  • 安全特性:Vyper 有意排除的特性最小化了攻击面。这使其成为项目安全至关重要的理想选择。Solidity 尽管灵活,但需要开发者手动实现这些保护措施,增加了人为错误的风险。

  • 字节码效率与 gas 成本:Vyper 拒绝允许动态大小的变量意味着它不需要在字节码级别保持一个 自由内存指针。这可能使 Vyper 合约在某些场景中稍微节省 gas。不过,两者都不如像 Huff 和 Yul 等低级语言优化,这些语言通过降低抽象层次来减少 gas 成本。

一张并排的表格,比较 Vyper 和 Solidity 的语法、灵活性、安全性、工具、社区支持、代码可读性、用例和字节码效率。

尽管这两种语言都编译为 EVM 字节码,但它们的用途不同。Solidity 在灵活性和生态系统支持方面表现卓越,而 Vyper 优先考虑清晰性和可靠性。因此,在需要强大且易于审计的代码的项目中,Vyper 是一个有力的选择。

现在,让我们看看 Vyper 在实践中的应用。

使用 Vyper 编程语言的现实应用

去中心化金融(DeFi)

  • Curve Finance 使用 Vyper 用于其自动化市场制造商( AMM)合约。该平台特别选择 Vyper 用于其数学密集型稳定币交易池,原因包括:

    • 更好地处理金融计算中的小数点精度
    • 对于大型数值操作提供内置溢出保护
    • 更清晰的代码组织以简化复杂数学公式
  • Lido Finance 使用 Vyper 进行安全高效的质押合约,并已投资 30 万美元用于 Vyper 的开发,以实现:

    • 更强的安全性,降低质押合约的风险
    • 提高可靠性,支持审计和漏洞奖励机制

安全关键应用

  • 使用 Vyper 构建的 多重签名钱包 (如 SuperSig)受益于:

    • 简化的代码流使得安全审计更为直观
    • 清晰的状态变量管理,用于跟踪拥有者权限
    • 明确的函数声明,防止签名验证被绕过
  • 代币归属合约,如 Yearn Finance 的归属托管合约,选择 Vyper 是由于:

    • 基于时间的计算受益于 Vyper 精确的小数处理
    • 锁定期限清晰明确定义,易于审计
    • gas 优化功能有助于减少分发成本

在使用 Vyper 构建时,有几个事项需要牢记。

Vyper 开发的最佳实践

在创建基于 Vyper 的以太坊智能合约时,遵循已建立的最佳实践,以确保安全性和效率。

开发智能合约时,应将安全性作为首要重点。以下是需要遵循的重要实践:

  1. 开发工作流程
  • 始终使用最新的 Vyper 版本,以便从安全更新中受益
  • 针对所有可能的场景实施全面错误处理
  • 遵循既定的 gas 优化模式
  • 保持清晰且全面的文档
  • 使用版本控制及适当的代码审查流程
  1. 代码审计
  • 在开发过程中定期进行安全审计
  • 对所有代码路径实施全面的测试覆盖
  • 执行 gas 优化审查,以确保高效运行
  • 充分测试边界条件
  • 验证所有数学操作的准确性

那么,你怎么开始学习 Vyper?

在哪里学习 Vyper 编程语言?

要学习 Vyper,以下资源提供全面的指南和课程:

  • Cyfrin Updraft 提供了一系列面向不同熟练程度的课程:

  • Vyper 通过示例:一个示例库和视频解释,演示 Vyper 的运作(由 Cyfrin 提供支持)。

  • Vyper 的官方 文档 提供了对语法、功能和最佳实践的详细解释。这使其成为各级开发者的重要参考。

  • Vyper.fun:一个互动平台,你可以通过构建宝可梦游戏来学习 Vyper,使学习过程既有趣又具有实践性。

这些资源汇聚在一起,为掌握 Vyper 提供了坚实的基础,满足不同学习偏好和技能水平。

结论

Vyper 是开发安全智能合约的强大工具。它为关键区块链项目提供无与伦比的安全性、清晰性和可审计性。尽管不是 Solidity 的完全替代品,但在安全性和代码简单性优先的情况下,这是理想选择。

所以,提高你的智能合约开发技能,今天就 开始学习 Vyper 在 Cyfrin Updraft!

  • 原文链接: cyfrin.io/blog/vyper-pro...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.