---
title: "Solidity vs. Vyper：你需要知道的一切"
description: "Solidity 与 Vyper 的相似之处、差异及常见应用场景"
---

# Solidity vs. Vyper：你需要知道的一切

支撑[应用](https://www.alchemy.com/dapps/top/defi-dapps)运行的是[智能合约](https://www.alchemy.com/overviews/solidity-smart-contract)的持续执行。智能合约最初由计算机科学家、密码学家**Nick Szabo**提出，简单来说，它就是可编程的代码和数据，用于规定区块链上账户的行为。智能合约代码存在于区块链上，是改变Ethereum区块链状态的机制之一。

智能合约是使Ethereum上的程序得以实现的关键组成部分。**Vitalik Buterin的原始白皮书**将Ethereum描述为"下一代智能合约……平台"。虽然智能合约通常被编写用于执行资产转移，但其应用范围要广泛得多，包括创建代币、构建应用和DeFi产品，以及交易NFT。

编写智能合约有多种编程语言，选择哪种语言取决于具体用例，因为每种web3语言都针对不同的需求进行了优化，各有其优势和取舍。

首先，开发者需要在高级语言和低级语言之间做出选择。高级语言抽象掉了实现的具体细节，使开发者无需理解字节码就能轻松创建智能合约。

在Ethereum和兼容[Ethereum虚拟机](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)（EVM）的区块链上使用的两种高级语言是**Solidity**和**Vyper**。

## **什么是Solidity？**

[**Solidity**](https://www.alchemy.com/overviews/solidity)是一种用于在Ethereum虚拟机上编写智能合约的高级、图灵完备的编程语言，适用于多种用例，包括去中心化金融（DeFi）、NFT和钱包。

Solidity深受C++和JavaScript的影响——这在其语法中可见一斑——并使用与Python相同的多重继承算法。虽然Solidity与Ethereum关系最为密切，但它也能在Polkadot和Avalanche等多个区块链平台上运行。

Solidity由**Ethereum首席技术官Gavin Wood**提出，其开发目的是满足对灵活的、基于智能合约的开发者平台的需求。借助Solidity，开发者可以为各种用例编写智能合约，从而创建出如今在Ethereum上运行的充满活力的去中心化应用生态系统。

## **什么是Vyper？**

**Vyper是一种与Solidity类似的高级编程语言，其设计初衷是提高EVM兼容区块链上智能合约的安全性。**

Vyper使用类Python的语法——这也是其名字带有"蛇"（serpentine）意味的由来——代码优先考虑可读性，使开发者能够在部署合约之前轻松发现代码中的漏洞和缺陷。

为了进一步提升智能合约的安全性，Vyper使用了强类型和可计算的可判定性。Vyper中声明的每个变量都必须给定明确的类型，而合约的可判定性使开发者能够在合约部署前计算出gas消耗的上限。

## **Solidity与Vyper对比**

Solidity和Vyper都可用于创建兼容EVM的智能合约，但由于这两种web3编程语言有着各自独特的设计原则，在决定哪种语言更适合dApp开发时，各有其优势和取舍。

为了更好地理解这种对比，我们先来看看Solidity和Vyper有哪些相似之处。

### **Solidity和Vyper有哪些相似之处？**

两种语言都是高级语言，Solidity和Vyper的编译器都会将代码翻译成EVM可执行的系统级字节码。这意味着，部署后，Solidity和Vyper智能合约将以相同的字节码语言执行。因此，Solidity和Vyper合约可以在同一应用中并存使用。

Vyper和Solidity的智能合约在结构上有几处相似：

- **版本声明（Version pragma）** - 版本声明是指每份智能合约所对应的编译器版本或版本范围
- 状态变量 - 永久存储在智能合约存储中的值
- **结构体（Structs）** - 可以自定义，将多个变量组合成单一类型
- **函数（Functions）** - [可执行的代码行](https://www.alchemy.com/overviews/solidity-functions)，能够在合约内部及外部执行状态变更
- 事件 - 通过EVM记录操作日志，便于在事件触发后进行高效检索
- **溢出检查（Overflow Checking）** - 通过检查数组访问和算术运算，防止数据类型意外溢出，确保变量存储安全

Solidity和Vyper智能合约的核心结构有很大一部分是相通的。然而，Solidity和Vyper在允许web3开发者编写智能合约的方式上，也存在很大差异。

### **Solidity和Vyper有哪些不同之处？**

**Vyper与Solidity之间的关键差异，源于Vyper将安全性作为底层设计原则的取向，包括可判定性，以及不支持修饰符、继承、内联汇编、函数重载和递归调用。**

Vyper通过增加一些功能、同时省去Solidity一些风险较高的特性，来实现相对于Solidity更高的安全性。

#### **1. 可判定性**

有了可判定性，开发者可以计算出每份合约gas消耗的上限，从而防范gas限制攻击。gas限制攻击是一种拒绝服务（DoS）攻击，恶意行为者通过合约发送交易，使区块gas限制被耗尽，从而迫使其他所有交易失败或回滚。

#### **2. 修饰符（Modifiers）**

在Solidity中，[函数定义可以由修饰符前置](https://www.alchemy.com/overviews/solidity-modifier)，修饰符可以在代码的其他位置定义，用于在智能合约执行前后进行检查、进行状态变更等操作。

由于修饰符的这种特性，很容易写出具有误导性的代码——一个看似无害的函数修饰符，实际上可能执行了会造成漏洞的操作。为了提高可读性、便于检测危险代码，Vyper不支持修饰符。

#### **3. 类继承**

要读懂使用类继承编写的代码，需要通读多个不同的代码文件才能理解合约的运作方式。此外，由于Solidity允许[多重继承](https://www.alchemy.com/overviews/solidity-interface)，读者还需要理解优先级规则，才能弄清冲突是如何解决的。

如果多个同名函数被继承，合约实际使用的是哪一个？

由于Vyper不允许继承，需要审计的文件更少，代码也就更容易被审计。

#### **4. 内联汇编**

通过在Vyper中去除内联汇编机制——即将Solidity代码转换为机器码的能力——开发者可以在代码中搜索变量名，找到该变量被读取或修改的每一处位置。

#### **5. 函数重载**

由于Solidity中的函数重载使得隐藏有害代码成为可能，Vyper不支持这一特性。例如，函数`\{sendToken(address)\}`可能是安全的，而`\{sendToken(address, “Hello!”)\}`却会转走你钱包中的资产。

通过省去函数重载，Vyper使人们更容易准确理解到底调用的是哪个函数、以及在何时被调用。

#### **6. 递归调用与无限长度循环**

递归调用和无限长度循环使得无法计算gas限制的上限，这与Vyper的可判定性特性相冲突，这也是Vyper不支持递归调用的原因。

### **相比Solidity，使用Vyper有哪些优势？**

**Vyper的六大差异为其带来了相比Solidity的两大明显优势：安全性和可审计性。**

#### **1. 安全性**

凭借众多安全特性，Vyper可以防止开发者写出存在漏洞的代码，避免出现未被发现的缺陷和可被利用的攻击面。

#### **2. 可审计性**

Vyper代码使[智能合约安全](https://www.alchemy.com/overviews/smart-contract-security-best-practices)审计人员能够轻松读懂并准确理解智能合约的具体行为。这意味着所有阅读你的智能合约的人，都能够迅速识别出资产在区块链上将如何被操作。

最后，随着你学习Vyper，其可读性也将有助于你更轻松地读懂其他应用现有的智能合约。

### **相比Solidity，使用Vyper有哪些取舍？**

**虽然看起来开发者用Vyper能做到Solidity所能做的一切，并且还增加了额外的安全保护，但选择Vyper而非Solidity也伴随着两个主要的取舍：灵活性和社区。**

#### **1. 灵活性**

[Vyper的官方文档](https://www.alchemy.com/overviews/learn-solidity)指出，Vyper并不打算完全替代Solidity，因为有些在Solidity中可以做到的事情，在Vyper编码中是被明确禁止的。因此，选择Vyper而非Solidity，就意味着放弃了智能合约的灵活性，限制了应用的适用范围。

#### **2. 开发者社区**

单从数量来看，Solidity是比Vyper更受欢迎得多的web3编程语言。快速搜索GitHub上所有用Vyper编写的文件（.vy）和所有用Solidity编写的文件（.sol），就能大致了解使用每种语言的开发者数量。截至本文撰写之时，GitHub上用Vyper编写的文件约有10,300个，而Solidity文件则有830万个。

因此，Vyper相关的指南和资源相对较少。除了官方指南之外，开发者在用Vyper编码时遇到困难，会更难找到相关的社区讨论。

## **Solidity还是Vyper——我应该选择哪种语言？**

**虽然Vyper和Solidity的兼容性意味着选择哪种语言并非非此即彼的问题，但更基础、需要灵活性的智能合约应该用Solidity编写，而需要严格安全保障的应用则应选择Vyper。**

这两种语言并没有孰优孰劣之分，因为它们各自适用于不同的用例。由于缺乏灵活性，也没有庞大的开发者社区，Vyper最适合用于需要最高安全级别的场景，而新入行的web3开发者则应该从学习Solidity开始。

## **如何开始学习Solidity和Vyper**

尽管Vyper的开发者社区不如Solidity那么庞大，但学习这两种编程语言仍有不少丰富且实用的资源——既有正式的，也有非正式的。以下资源将[帮助你成为Solidity开发者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)：

### **Solidity学习资源**

[学习Solidity的最佳方式](https://university.alchemy.com/?)是报名参加Solidity训练营，而由来自ChainShot的一支才华横溢的web3工程师团队主导的Alchemy University's Ethereum Developer Bootcamp，是目前市面上最全面的为期7周的在线Solidity课程。随着Alchemy近期收购ChainShot，Alchemy现将ChainShot原价3,000美元的训练营完全免费开放。

立即报名[Alchemy University's](https://docs.soliditylang.org/en/v0.8.20/) Ethereum开发者训练营，学习如何开发Ethereum应用。

除了训练营之外，以下是一些学习Solidity的其他途径：

- [**官方文档**](https://docs.soliditylang.org/en/v0.8.20/) - Solidity文档详细介绍了从类型到智能合约、再到编译器的方方面面
- [**Solidity by Example**](https://solidity-by-example.org/) - 一系列附带解说的Solidity代码示例集
- [**Clean Contracts**](https://www.useweb3.xyz/guides/clean-contracts) - 学习如何编写安全、可预测的Solidity智能合约
- [**Ethernaut by OpenZeppelin**](https://ethernaut.openzeppelin.com/) - 在这个以智能合约为基础的攻防游戏中破解智能合约

如果开发者对开发领域整体还比较陌生，Alchemy的**3周JavaScript速成课程**是开始Ethereum训练营之前一个很好的预备课程。

### **Vyper学习资源**

一旦你[通过训练营学完了Solidity](https://www.alchemy.com/overviews/solidity-bootcamp)，学习Vyper最好的方式就是阅读官方文档、跟着教程动手实践，并研究GitHub上的.vy文件。

## **结语**

大多数开发者会发现Solidity足以满足他们的智能合约需求，但对于那些需要极高安全级别的场景，Vyper是一个绝佳的选择。由于Vyper和Solidity都是充分发挥在Ethereum区块链上构建应用潜力的工具，二者并无明显的胜负之分。Vyper和Solidity是两种互补的、[Ethereum开发者必学的编程语言](https://www.alchemy.com/overviews/web3-programming-languages)。
