Solidity vs. Vyper:你需要知道的一切
作者 Alchemy
支撑应用运行的是智能合约的持续执行。智能合约最初由计算机科学家、密码学家Nick Szabo提出,简单来说,它就是可编程的代码和数据,用于规定区块链上账户的行为。智能合约代码存在于区块链上,是改变Ethereum区块链状态的机制之一。
智能合约是使Ethereum上的程序得以实现的关键组成部分。Vitalik Buterin的原始白皮书将Ethereum描述为"下一代智能合约……平台"。虽然智能合约通常被编写用于执行资产转移,但其应用范围要广泛得多,包括创建代币、构建应用和DeFi产品,以及交易NFT。
编写智能合约有多种编程语言,选择哪种语言取决于具体用例,因为每种web3语言都针对不同的需求进行了优化,各有其优势和取舍。
首先,开发者需要在高级语言和低级语言之间做出选择。高级语言抽象掉了实现的具体细节,使开发者无需理解字节码就能轻松创建智能合约。
在Ethereum和兼容Ethereum虚拟机(EVM)的区块链上使用的两种高级语言是Solidity和Vyper。
什么是Solidity?
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) - 可执行的代码行,能够在合约内部及外部执行状态变更
- 事件 - 通过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中,函数定义可以由修饰符前置,修饰符可以在代码的其他位置定义,用于在智能合约执行前后进行检查、进行状态变更等操作。
由于修饰符的这种特性,很容易写出具有误导性的代码——一个看似无害的函数修饰符,实际上可能执行了会造成漏洞的操作。为了提高可读性、便于检测危险代码,Vyper不支持修饰符。
3. 类继承
要读懂使用类继承编写的代码,需要通读多个不同的代码文件才能理解合约的运作方式。此外,由于Solidity允许多重继承,读者还需要理解优先级规则,才能弄清冲突是如何解决的。
如果多个同名函数被继承,合约实际使用的是哪一个?
由于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代码使智能合约安全审计人员能够轻松读懂并准确理解智能合约的具体行为。这意味着所有阅读你的智能合约的人,都能够迅速识别出资产在区块链上将如何被操作。
最后,随着你学习Vyper,其可读性也将有助于你更轻松地读懂其他应用现有的智能合约。
相比Solidity,使用Vyper有哪些取舍?
虽然看起来开发者用Vyper能做到Solidity所能做的一切,并且还增加了额外的安全保护,但选择Vyper而非Solidity也伴随着两个主要的取舍:灵活性和社区。
1. 灵活性
Vyper的官方文档指出,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开发者:
Solidity学习资源
学习Solidity的最佳方式是报名参加Solidity训练营,而由来自ChainShot的一支才华横溢的web3工程师团队主导的Alchemy University's Ethereum Developer Bootcamp,是目前市面上最全面的为期7周的在线Solidity课程。随着Alchemy近期收购ChainShot,Alchemy现将ChainShot原价3,000美元的训练营完全免费开放。
立即报名Alchemy University's Ethereum开发者训练营,学习如何开发Ethereum应用。
除了训练营之外,以下是一些学习Solidity的其他途径:
- 官方文档 - Solidity文档详细介绍了从类型到智能合约、再到编译器的方方面面
- Solidity by Example - 一系列附带解说的Solidity代码示例集
- Clean Contracts - 学习如何编写安全、可预测的Solidity智能合约
- Ethernaut by OpenZeppelin - 在这个以智能合约为基础的攻防游戏中破解智能合约
如果开发者对开发领域整体还比较陌生,Alchemy的3周JavaScript速成课程是开始Ethereum训练营之前一个很好的预备课程。
Vyper学习资源
一旦你通过训练营学完了Solidity,学习Vyper最好的方式就是阅读官方文档、跟着教程动手实践,并研究GitHub上的.vy文件。
结语
大多数开发者会发现Solidity足以满足他们的智能合约需求,但对于那些需要极高安全级别的场景,Vyper是一个绝佳的选择。由于Vyper和Solidity都是充分发挥在Ethereum区块链上构建应用潜力的工具,二者并无明显的胜负之分。Vyper和Solidity是两种互补的、Ethereum开发者必学的编程语言。
相关概览

构建区块链应用
Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。


