本文详细介绍了Vyper编程语言,在智能合约开发中的安全性和简洁性,强调了其设计原则与核心特性。通过比较Vyper和Solidity,指出Vyper在安全优先和易审计性方面的优势,同时提供了安装Vyper的步骤和最佳实践,适合需要高安全性的区块链项目开发者。
学习 Vyper 以进行安全的智能合约开发。探索其功能、安全优势、与 Solidity 的比较、安装流程以及现实世界中的 DeFi 用例。
你知道吗,超过 7,959 个用 Vyper 编写的智能合约在领先的区块链上保护了超过 23 亿美元的锁定总价值(Total Value Locked, TVL)?要了解这一点的重要性,可以考虑到有 23 个国家的整个经济价值还不如这个数字。
来源:DeFiLlama
来源:Dune
虽然 Vyper 并没有像 Solidity 那样流行,但这个智能合约编程语言功能强大,特别适合在以太坊虚拟机( EVM)兼容的网络上创建 智能合约。随着安全漏洞持续挑战 区块链 行业,Vyper 对简单性和安全性的专注使其成为开发者和 协议 的一个有吸引力的选择。
因此,这种面向合约的编程语言越来越受到欢迎。让我们探索一下它的具体含义及其对 智能合约开发 的功能价值。
Vyper 是一种特意为 EVM 设计的 Python 风格编程语言。它于 2017 年创建,响应了智能合约开发中的安全担忧,强调了三个 核心原则:安全性、简单性和可审计性。
与 Solidity 不同,Vyper 有意限制某些编程特性,以减少潜在漏洞,增强代码安全性并促进审计。这一目标是确保安全、高效的智能合约的开发。
Vyper 的设计原则有助于实现这一目标:
安全第一:每个设计选择都优先考虑安全性,甚至不惜牺牲便利性,排除“风险”特性。
简约的特性集:有限的特性集减少了攻击面,使智能合约更安全、更容易审计。
类似 Python 的语法:简洁可读,Vyper 的 语法 使 Python 开发者容易理解。这降低了学习曲线,减少了错误。
强类型系统:Vyper 对变量、函数输入和输出进行了严格的类型检查。这防止了意外的类型转换,确保了合约的可预测性。
内置保护:Vyper 包含自动保护措施,如溢出检查、数组和字符串的边界验证、以及重入保护。这些减小了常见智能合约漏洞的风险。
这些基础原则为 Vyper 独特特性的实现奠定了基础,接下来我们将探讨这些特性。
Vyper 的特性使其极为适合在 EVM 区块链上编写智能合约。
该语言提供了一些基本的安全措施,以防止常见的漏洞:
自动溢出检查:所有算术运算都会自动检查溢出条件,防止可能导致合约漏洞的数值错误。
显式边界检查:数组和字符串操作包含内置的边界检查,消除其他语言中常见的缓冲区溢出漏洞。
Gas 限制保护:Vyper 允许精确计算 gas 消耗的上限。这有助于防止基于 gas 耗尽的拒绝服务(DoS)攻击。
这些内置的安全特性确实有可能带来一些缺点。
通过专注于安全性和可审计性,Vyper 有意排除了许多在其他语言中常见的编程特性:
无函数重载:与 Solidity 或 Python 不同,Vyper 不允许多个同名但参数不同的函数。每个函数必须有唯一的名称,消除了歧义,简化了审计。
无操作符重载:与 Python 或 C++ 不同,Vyper 防止重新定义操作符,以避免隐藏逻辑风险。操作符保留标准行为,确保可预测性和安全性。
无递归调用:Vyper 编程语言完全消除了递归函数,以强制执行可预测的 gas 消耗并避免 gas 限制攻击。
无无限长度循环:编写 Vyper 智能合约时,所有循环必须具有固定的边界。这确保了 gas 限制可以被精确计算,防止 DoS 攻击。
无修饰符:函数修饰符,允许隐藏前提条件、后条件或 状态 更改,被排除。相反,内联 assert
声明使代码更易于阅读和审计。
无类继承:不包括继承简化了程序理解,并消除了跟踪多个文件或优先规则之间行为的需求。
无内联汇编:防止引入难以跟踪的低级操作,保持了代码的可读性和可追溯性。
现在你已经对 Vyper 编程语言有了一个高层的理解,接下来看看如何开始构建 Vyper。
要使用 Vyper,你必须设置开发环境。以下是一步一步的指南,帮助你开始:
首先,确保你的设置满足最低要求:
Python 环境:
开发工具:
由于 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
此方法直接从 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 允许你在容器化环境中运行 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 后,完成以下步骤:
配置你的集成开发环境(IDE):
设置开发工具:
现在你可以开始编写代码了。
让我们探讨一个如何使用 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
状态变量
清晰的可见性修饰符使用 public
确保透明性:可见性修饰符决定了变量可以如何以及在哪里被访问。public
允许变量被外部读取。
所有变量均显式声明类型,以增强安全性:定义显式数据类型(如 uint256
, address
)防止由于类型不匹配引起的意外行为。这也帮助合约按预期运作。
使用 HashMaps
通过优化数据结构进行高效存储:HashMap
是一种键值存储结构,用于存储余额和授权。它允许快速查找,是管理像用户账户这样的复杂数据集的高效工具。
事件
索引参数方便高效过滤:事件中的索引参数允许日志轻松查询和过滤。因此,用户和第三方工具能够跟踪活动,如账户之间的转账。
清晰记录转账和批准活动:像 Transfer
和 Approval
这样的事件明确记录代币的运动和权限。这使得开发者和审计者更容易跟踪合约的行为。
标准化事件结构以提高互操作性:使用广为人知的事件格式确保与外部工具和平台(例如区块链浏览器或钱包)的兼容性。
功能
内置安全检查防止常见漏洞:函数确保在转账前检查足够的余额或验证收件人地址是否有效。这些措施防止了典型问题,如超额度支出或转移到无效地址。
清晰的错误消息帮助调试失败的断言:错误消息描述了失败的原因。这帮助开发者快速识别并修复测试或审计过程中的问题。
那么,Vyper 和 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 成本。
尽管这两种语言都编译为 EVM 字节码,但它们的用途不同。Solidity 在灵活性和生态系统支持方面表现卓越,而 Vyper 优先考虑清晰性和可靠性。因此,在需要强大且易于审计的代码的项目中,Vyper 是一个有力的选择。
现在,让我们看看 Vyper 在实践中的应用。
Curve Finance 使用 Vyper 用于其自动化市场制造商( AMM)合约。该平台特别选择 Vyper 用于其数学密集型稳定币交易池,原因包括:
Lido Finance 使用 Vyper 进行安全高效的质押合约,并已投资 30 万美元用于 Vyper 的开发,以实现:
使用 Vyper 构建的 多重签名钱包 (如 SuperSig)受益于:
代币归属合约,如 Yearn Finance 的归属托管合约,选择 Vyper 是由于:
在使用 Vyper 构建时,有几个事项需要牢记。
在创建基于 Vyper 的以太坊智能合约时,遵循已建立的最佳实践,以确保安全性和效率。
开发智能合约时,应将安全性作为首要重点。以下是需要遵循的重要实践:
那么,你怎么开始学习 Vyper?
要学习 Vyper,以下资源提供全面的指南和课程:
Cyfrin Updraft 提供了一系列面向不同熟练程度的课程:
Python 和 Vyper 智能合约开发入门 适合初学者,涵盖 Vyper 和智能合约开发的基础知识。
中级 Python 和 Vyper 智能合约开发 深入测试和部署合约到 zkSync,使用 Moccasin,同时教你如何启动你的第一个 加密货币。
高级 Python 智能合约开发课程 带你了解 Vyper 的高级概念,包括构建 DeFi 稳定币、在 ZKsync 上部署、Python 模糊测试技术,以及创建可定制的 NFT。同时,你将完成五个现实世界的项目,以提升你的区块链工程技能。
Vyper 通过示例:一个示例库和视频解释,演示 Vyper 的运作(由 Cyfrin 提供支持)。
Vyper 的官方 文档 提供了对语法、功能和最佳实践的详细解释。这使其成为各级开发者的重要参考。
Vyper.fun:一个互动平台,你可以通过构建宝可梦游戏来学习 Vyper,使学习过程既有趣又具有实践性。
这些资源汇聚在一起,为掌握 Vyper 提供了坚实的基础,满足不同学习偏好和技能水平。
Vyper 是开发安全智能合约的强大工具。它为关键区块链项目提供无与伦比的安全性、清晰性和可审计性。尽管不是 Solidity 的完全替代品,但在安全性和代码简单性优先的情况下,这是理想选择。
所以,提高你的智能合约开发技能,今天就 开始学习 Vyper 在 Cyfrin Updraft!
- 原文链接: cyfrin.io/blog/vyper-pro...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!