Solidity 与 Vyper - Quicknode

  • QuickNode
  • 发布于 2025-02-17 15:38
  • 阅读 33

本文探讨了以太坊智能合约的两种编程语言——Solidity和Vyper。文章介绍了智能合约的基础知识及其重要性,深入分析了Solidity和Vyper的优缺点,包括其语法特点、社区支持和安全性。此外,作者还为初学者提供了选择合适语言的建议,突出强调了Vyper在安全性上的优势。

已知安全漏洞

更新时间:2023年7月30日

Vyper团队发现了Vyper版本0.2.15、0.2.16和0.3.0的一些漏洞。如果你在这些版本中有活动合约,请参阅以下推文并联系Vyper团队。请明智行事,绝不要分享任何私钥或助记词,即使是受人尊敬的团队成员请求时也是如此🙏。

原帖

概述

随着以太坊区块链上智能合约的引入,开发出一种除Solidity之外的编程语言以编写智能合约代码只是时间问题。Vyper就是这样一种语言,旨在使智能合约源代码更易于阅读。我们有关于SolidityVyper的指南,因此本指南不讨论基础知识。相反,我们将探讨每种语言的优缺点。

先决条件:

  • 对Solidity有基本理解。
  • 对Vyper有基本理解。

关于智能合约

当我们想到区块链时,想到的第一件事是数字货币,而第二件事是可编程软件,即智能合约。智能合约是以太坊引入的,其他区块链也迅速出现在市场上,寻求实现相同的功能。智能合约使以太坊的整个生态系统得以运行。没有它们,就没有Aave或UniSwap。根本不会有DeFi。在了解了一些背景之后,你可能在想,智能合约到底是什么?

根据以太坊文档:

“智能合约”仅仅是运行在以太坊区块链上的程序。它是驻留在以太坊区块链上特定地址的代码(其函数)和数据(其状态)的集合。

简单来说,它是一种将永远存在并运行的软件,它将以确定性、可预测的方式执行任务。在你过于兴奋之前,我们需要讨论高层语言和低层语言。高层语言是人类可读的语言,有助于我们开发代码。理解和解析代码的意图是相对容易的。低层语言是机器可读的语言,允许机器理解和执行代码。

在早期,开发人员使用低层语言编写代码。然而,这并不是最佳的方式,新的开发人员需要花费多年时间才能理解并开发出有影响力的软件。这就是为什么开发人员用高层语言编写代码。高层语言允许开发人员以人类可理解的格式编写代码。但是,为了让机器理解逻辑,我们做了编译器。编译器将高层语言源代码转换为机器可读的低层代码。

回到之前的问题,你可以使用被称为字节码的低层语言编写智能合约,而理解起来可能需要花费多年的时间,实施也可能需要几个月。我知道没有人会选择那样,所以我们可以选择更好的解决方案,即使用高层语言。你可以使用多种语言来设计合约——

  1. Solidity
  2. Vyper
  3. Yul
  4. Yul+
  5. FE

以下是一些需要记住的有趣事实——

  1. 以太坊并不使用实际机器来运行你的合约。它运行一个称为以太坊虚拟机(EVM)的虚拟机来执行智能合约。
  2. 无论你选择哪种高层语言,它都会被编译成机器可读的格式,如字节码。

虽然还有其他语言可以用来编写智能合约,但我们将专注于Solidity和Vyper。

关于Solidity

介绍

如果你曾在区块链领域,你一定听说过Solidity。它是一种面向对象高层语言。它受一些现有高层语言(如JavaScript和C++)的强烈影响。这是一种静态类型语言,这意味着你必须定义想要存储在变量中的值类型,以便编译器知道预期的数据类型。在开发确定性应用时,这一点至关重要。

代码和语法

以下是用Solidity编写的简单合约。

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Promise {

    string promiseMessage;

        // 设置函数
    function setPromise( string memory _promise) public{
        promiseMessage=_promise;
    }
    // 获取函数
    function getPromise()public view returns(string memory){
        return promiseMessage;
    }

}

这是一个简单的智能合约,具有名为_promiseMessage_的状态变量。它有两个函数 -

  1. setPromise 为状态变量设置值。
  2. getPromise 返回状态变量的值。

如果你以前使用过JavaScript或C++,你可能会发现该语法有些熟悉。

优点

  1. 互联网上有大量学习资源和教程。

  2. 拥有广泛的社区支持。如果你遇到问题,有一个庞大的社区可以帮助你解决问题。

  3. 可用的开发工具非常优秀。以下是一些示例 -

    1. Remix:用于编写智能合约的在线编辑器。
    2. Truffle和Hardhat:编写、测试和部署合约的开发套件。
    3. 许多行业主要参与者(如Aave和UniSwap)是用Solidity编写的。
  4. 支持动态大小数组和字符串。在以上代码中,我们可以更改字符串的长度。

  5. 在最近的Solidity版本中异常处理被添加到了平台中。

缺点

  1. 存在溢出风险,即要存储的值可能过大。

  2. 根据2018年进行的调查,许多Solidity合约在开发/测试过程中存在严重漏洞。

关于Vyper

介绍

在开发合约时,Vyper是继Solidity之后第二受欢迎的选择。根据官方文档的简要概述:

Vyper是一种面向合约的、类Python的编程语言,它针对以太坊虚拟机(EVM)。

它是特意开发的,以解决Solidity中的安全问题。正如你从定义中猜测的那样,它受Python的强烈影响。与Solidity不同,Vyper去掉了一些面向对象的概念,例如继承,被称为面向合约或事务编程。其主要动机是使合约可审计和更安全,从而减少出错的可能性。它是一种强类型语言,这意味着它不允许你将一种数据类型用作另一种数据类型。这确保在处理各种数据类型时不会发生意外情况。

代码和语法

这里,我们将使用Vyper编写先前展示的合约。要深入了解,你可以参考我们的指南如何使用Vyper编写以太坊智能合约

我们所做的事情与使用Solidity时是相同的。我希望Python开发者能看到一些熟悉的语法。与Solidity不同,这里我们将字符串的上限定义为100个字符。

有趣的事实:Uniswap V1是用Vyper编写的!

优点

  1. 对于Python开发者来说,更容易入手。

  2. 它旨在确保安全性和可读性透明。

  3. 开发工具出现上升趋势,例如:

    1. Brownie: 😃 一种基于Python的开发框架,用于测试智能合约。
    2. Etherscan提供在线编辑器以编译你的合约。
  4. Curve等DeFi协议用于开发其合约。

  5. 对字符串和数组有一定限制。这使合约更不易受到攻击。

  6. 可以为任何函数调用的Gas消耗计算出精确的上限。

缺点

  1. 社区支持并不充分。

  2. 缺乏修饰符、类继承、递归调用和动态数据类型。

  3. 仍在开发中。许多Solidity中的特性在Vyper中并不存在。

结论

那么,万众瞩目的问题是,哪个更好?

开发Vyper的主要动机并不是取代Solidity,而是与其共同使用。一切归结于开发者。对于初学者,建议从Solidity开始,但对于安全合约,使用Vyper是一个好选择。当然,这并不是说反之亦然也是不对的。这完全取决于你的个人偏好。每种语言都有其优缺点。你可以在这里找到详细的语法差异列表。

在完成本指南的同时,我们希望你学到了一些知识;并能在选择下一个以太坊项目的语言时作出更明智的判断!

订阅我们的通讯,获取关于以太坊的更多文章和指南。如果你有任何反馈,请随时通过Twitter与我们联系。你也可以随时在我们的Discord社区服务器上与我们聊天,那里有一些你见过的最酷的开发者 😃

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

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。