本文详细介绍了智能合约在以太坊及其兼容区块链中的作用,深入比较了两种主要编写智能合约的高阶编程语言:Solidity和Vyper,分别强调了它们的特性、优缺点和应用场景。同时提供了学习这两种语言的资源,为开发者选择合适的工具提供指导。
支持去中心化应用(dApps)的是连续执行的 智能合约。最初由计算机科学家和密码学家 Nick Szabo 提出的智能合约,简单来说就是控制区块链上账户行为的可编程代码和数据。智能合约代码存储在区块链上,是改变以太坊区块链状态的机制之一。
智能合约是实现以太坊程序的关键组成部分。考虑到 Vitalik Buterin的原始白皮书 将以太坊描述为“下一代智能合约…平台。”虽然智能合约通常被编程用于执行资产的转移,但它们的应用范围更广,包括创建代币、构建去中心化应用(dApps)和去中心化金融产品(DeFi),以及交易NFT。
有几种编程语言可用于编写智能合约,选择哪种语言取决于使用案例,因为每种 web3 语言在不同需求、优点和取舍上进行了优化。
主要而言,开发人员首先需要在高级语言和低级语言之间做出选择。高级语言抽象掉实现的详细信息,允许开发人员无需理解字节码即可轻松创建智能合约。
以太坊及支持以太坊虚拟机(EVM)兼容区块链上使用的两种高级语言是 Solidity 和 Vyper。
Solidity 是一种高级的、图灵完备的编程语言,用于在以太坊虚拟机上编写智能合约,适用于多种用例,包括去中心化金融(DeFi)、NFT 和钱包。
Solidity 受到 C++ 和 JavaScript 的强烈影响——在语法上显而易见——并使用与 Python 相同的多重继承算法。尽管通常与以太坊关联,但 Solidity 也能在多个区块链平台上运行,如 Polkadot 和 Avalanche。
由 以太坊首席技术官 Gavin Wood 提出的 Solidity 是为满足对灵活的基于智能合约的开发者平台的需求而开发的。借助 Solidity,开发人员可以为多样的用例编写智能合约,从而创建今天运行在以太坊上的生机勃勃的去中心化应用生态系统。
Vyper 是一种高级编程语言,类似于 Solidity,并被有意设计为增加在 EVM 兼容区块链上使用的智能合约的安全性。
使用 Python 风格的语法——因此得名——Vyper 代码优先考虑可读性,以便开发人员能够在部署合约之前轻松发现代码中的错误和漏洞。
为了进一步支持智能合约的安全性,Vyper 使用强类型和可决定性。声明的每个变量必须显式地给出类型,并且合约的可决定性使得开发人员能够在合约部署之前计算Gas消耗的上限。
Solidity 和 Vyper 都可以用于创建 EVM 兼容的智能合约,但由于这两种 web3 编码语言有着独特的设计原则,因此在决定哪种编程语言最适合 dApp 开发时,有其优缺点。
为了更好地理解这种对比,让我们首先看一下 Solidity 和 Vyper 的重叠点。
每种语言都是高级的,Solidity 和 Vyper 的编译器会将你的代码翻译成可被 EVM 执行的系统级字节码。 这意味着在部署后,Solidity 和 Vyper 的智能合约将以相同的字节码语言执行。因此,Solidity 和 Vyper 合约可以在同一应用中并发使用。
Vyper 和 Solidity 的智能合约在结构上有几个相似之处:
版本声明 - 版本声明是每个智能合约意图使用的编译器版本或版本范围
状态变量 - 在智能合约存储中永久存储的值
结构体 - 可以自定义定义,将多个变量组合成单一类型
函数 - 可执行的代码行,可以在合约内部和外部执行状态更改
事件 - 通过 EVM 日志记录操作,它们在发出后可以有效地搜索
溢出检查 - 通过检查数组访问和算术,防止数据类型的意外溢出,以确保变量存储是安全的
Solidity 和 Vyper 智能合约之间的主要结构有很大部分是共享的。然而,Solidity 和 Vyper 都提供了非常不同的方式使 web3 开发人员编写智能合约。
Vyper 和 Solidity 之间的关键区别来自 Vyper 对安全性的关注,包括可决定性,并且不支持修饰符、继承、内联汇编、函数重载和递归调用。
Vyper 通过增添特性并省略 Solidity 的一些高风险属性,相对 Solidity 实现了这种额外的安全性。
通过可决定性,开发人员可以计算每个合约的Gas消耗上限,以防止气体限制攻击。气体限制攻击是一种拒绝服务(DoS)攻击类型,恶意行为者通过合约发送交易以超过区块气体限制,从而强制所有其他交易失败或回滚。
在 Solidity 中,函数定义可以以修饰符开头,且修饰符可以在代码的其他地方定义,以执行智能合约执行前后的检查、进行状态更改等。
由于修饰符的性质,编写误导性代码很容易,使得一个看似无害的函数修饰符实际上执行创建漏洞的操作。Vyper 不支持修饰符以提升可读性和识别危险代码的能力。
为了使用类继承读取代码,需要查看多个不同的代码文件才能了解合约的工作原理。此外,因为 Solidity 允许 多重继承,读者需要理解优先级规则才能知道如何解决冲突。
如果有多个同名的函数被继承,那么合约实际使用的是哪一个?
由于 Vyper 不允许继承,代码的审计更加简单,因为需要审计的文件更少。
通过排除 Vyper 的内联汇编机制,或将 Solidity 代码转换为机器代码的能力,可以在代码中搜索变量名,以查看变量在何处被读取或修改。
因为在 Solidity 中重载函数可能隐藏有害代码,所以 Vyper 不支持重载。举例来说,函数 {sendToken(address)}
可能是安全的,而 {sendToken(address, “Hello!”}
会耗尽你的钱包。
通过省略函数重载,Vyper 更容易理解到底调用了哪些函数以及何时被调用。
递归调用和无限长度循环使得无法计算气体限制的上限,这与 Vyper 的可决定性特性存在冲突,因此 Vyper 不支持递归调用。
Vyper 的六大主要区别使得与 Solidity 相比,Vyper 拥有两个显著的优势:安全性和可审计性。
凭借其众多安全特性,Vyper 保护开发人员免于编写允许漏洞和可被利用的攻击面未被发现的代码。
Vyper 代码使得智能合约安全审计人员能轻松阅读和理解智能合约正在执行的内容。这意味着所有阅读你智能合约的人员都能快速识别资产如何在区块链上进行操作。
最后,当你学习 Vyper 时,其可读性将简化阅读其他 dApps 已存在智能合约的过程。
尽管开发人员看似可以用 Vyper 完成所有用 Solidity 能做的事情,并且增加了额外的安全保护,但选择 Vyper 而非 Solidity 有两个主要权衡:灵活性和社区。
Vyper 的文档 表明 Vyper 并不打算完全替代 Solidity,因为有些在 Solidity 中允许的操作在 Vyper 中是明确禁止的。因此,选择 Vyper 优于 Solidity 意味着放弃智能合约的灵活性,限制应用范围。
从数量上说,Solidity 是比 Vyper 更受欢迎的 web3 编程语言。通过对 GitHub 中所有用 Vyper 编写的文件(.vy)和所有用 Solidity 编写的文件(.sol)进行快速搜索,我们可以了解使用每种语言的开发人员的数量。在本文撰写时,GitHub 上大约有 10,300 个用 Vyper 编写的文件,而用 Solidity 编写的文件有 830 万个。
因此,对于使用 Vyper 的开发者来说,可供参考的指导和资源较少。除了官方指南之外,很难找到针对开发 Vyper 时可能遇到困难的社区讨论。
尽管 Vyper 和 Solidity 的兼容性意味着选择单一语言并不是非此即彼的提议,但需要更基本且灵活的智能合约时,应使用 Solidity,而需要确保安全性保障的应用则应选择 Vyper。
没有一种语言比另一种语言显得更好,因为它们各自有不同的用例。由于缺乏灵活性和没有深厚的开发者社区,Vyper 最适合于安全性需求最高的用例,新的 web3 开发者应先学习 Solidity。
尽管 Vyper 的开发者社区不够强大,仍然有一些丰富且有用的资源——包括正式和非正式的——可以用于学习这两种编程语言。以下资源将 帮助你成为 Solidity 开发者:
学习 Solidity 的 最佳方式 是注册一个 Solidity 训练营,Alchemy University 的以太坊开发者训练营由来自 ChainShot 的优秀 web3 工程师团队主办,是目前最全面的为期 7 周的在线 Solidity 课程。随着 Alchemy 最近收购 ChainShot,Alchemy 使得 ChainShot 的 3,000 美元训练营完全免费。
今天就注册 Alchemy University 的 以太坊开发者训练营,学习如何开发以太坊 dApps。
除了训练营,这里还有一些学习 Solidity 的额外方式:
官方文档 - Solidity 文档详细说明了从类型到智能合约及编译器的所有内容
Solidity 通过示例 - 为提供有用解释的 Solidity 代码示例集合
安全合约 - 学习如何编写安全和可预测的 Solidity 智能合约
OpenZeppelin 的 Ethernaut - 在这个基于智能合约的战争游戏中破解智能合约
如果开发人员在开发上是新手,Alchemy 的 为期 3 周的 JavaScript 快速课程 是开始以太坊训练营的绝佳先修课程。
一旦你完成了 通过训练营学习 Solidity,学习 Vyper 的最佳方式就是阅读官方文档、构建教程,并在 GitHub 上研究 .vy 文件。
大多数开发人员会发现 Solidity 能满足他们的智能合约需求,但对于那些需要极高安全级别的用户而言,Vyper 是一个绝佳选择。由于 Vyper 和 Solidity 都是充分实现以太坊区块链上构建可能性的工具,因此没有明确的赢家。Vyper 和 Solidity 是以太坊开发者必须学习的两种互补的 编程语言。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!