这篇文章详细介绍了Vyper编程语言及其在以太坊智能合约中的应用,强调了其安全性和易用性,并提供了安装和使用Vyper的具体步骤,适合开发者学习如何用Vyper编写和部署智能合约。此外,还提到了一些已知的安全漏洞和如何防范。
已知安全漏洞
更新于 2023年7月30日
Vyper 团队发现了 Vyper 版本 0.2.15、0.2.16 和 0.3.0 中的一些漏洞。如果你们在这些版本中有活动合约,请参阅以下推文并联系 Vyper 团队。请谨慎行事,不要共享任何私钥或种子短语,即使是被知名团体的团队成员要求也不能 🙏。
在 EVM(以太坊虚拟机)上执行的代码必须高度有效,以最小化执行智能合约所需的Gas。合约中的任何低效代码最终都需要更高的Gas费用来执行,从而变得过于昂贵,这在微交易中尤其不理想。因此,Vyper 在这里派上用场;Vyper 与 Solidity 在逻辑上相似,与 Python 在语法上相似,正成为许多智能合约开发者的选择。因此,在本文中,让我们学习如何使用 Vyper 编写以太坊智能合约。
Vyper 是一种相对较新的 pythonic 编程语言,用于编写智能合约。Vyper 目标是以太坊虚拟机(EVM)。Vyper 的语法非常简单易懂;Vyper 的主要原则之一是使开发者几乎不可能编写误导性程序。
人们可能会问,既然我们已经有 Solidity 作为主要的智能合约编写语言,为什么还要使用 Vyper。在 2018 年进行的一项 研究 中,研究人员分析了近一百万个已部署的以太坊智能合约,发现许多合约存在严重漏洞;研究人员将这些合约分为三类,以更好地识别和追踪漏洞:
自杀合约 - 可以被任意地址销毁的智能合约。
贪婪合约 - 智能合约有时可能处于无法释放以太的状态,此阶段的智能合约称为贪婪合约。
挥霍合约 - 可以被修改为释放以太到任意地址的智能合约。
这些漏洞通过代码无意中产生,但无论意图如何,劣质代码都可能导致用户意外损失资金。Vyper 尝试通过让用户编写安全代码并使程序员更难意外编写误导性或脆弱代码来消除这一问题。
以下是 Vyper 的特点:
它是强类型的。
支持有符号整数和十进制定点数。
像 Python 一样小且易懂的代码。
具有边界和溢出检查。
可判性:使用 Vyper,我们可以为任何函数调用的Gas消耗计算出精确的上界。
限制对纯函数的支持:Vyper 中的任何常量都不能改变状态。
Vyper 与 Solidity:
Vyper 通过省略一些 Solidity 的特性来消除编写不安全代码的可能性。希望使用 Vyper 编写智能合约的开发者必须了解 Vyper 所不具备的 Solidity 特性;以下是 Vyper 省略的 Solidity 特性:
溢出
无界数组
无限循环
修饰符
继承
汇编支持
Vyper 省略了大多数面向对象编程范式—或许需要为事务编程定义一个新的范式。
我们将在 Ropsten 测试网上部署我们的合约。要开始,你需要使用 Metamask 浏览器扩展创建一个 ETH 钱包和一些测试 ETH,你可以通过访问 Ropsten faucet 获取。你需要在 Metamask 钱包中选择 Ropsten 测试网络,将钱包地址复制到水龙头的文本框中,然后单击“发送我测试以太”。
在系统上安装 Vyper 的最简单方法是使用 Python 的 PIP 包管理器。Vyper 需要在系统上安装 Python 3.6 或更高版本;你可以通过在终端/cmd 中输入以下内容检查是否已安装 Python:
$ python --version
如果未安装版本 3.6 或更高版本,可以按照 Python 官方网站的下载页面 上的说明进行操作。
现在,让我们使用 PIP 安装 Vyper。在终端/cmd 中输入以下内容:
$ pip install vyper
如果一切顺利,Vyper 将安装到你的系统中。
你可以通过在终端/cmd 中输入以下内容来检查 Vyper 是否完全安装:
$ vyper --version
现在,打开你的文本编辑器,创建一个新的 Vyper 文件 contract.vy(vy 是 Vyper 的文件扩展名),并粘贴以下内容:
## @version ^0.2.0
greet: public(String[100])
@external
def __init__():
self.greet = "Hello World"
上述代码的解释:
第 1 行:指定此合约所针对的 Vyper 版本。
第 3 行:声明一个公共变量 greet,它将存储在区块链上,greet 的数据类型为字符串,最大长度为 100。
第 5-6 行:标记我们的 init 函数为 @external,这意味着它只能通过交易或其他合约调用。定义我们的 __init__ 函数,这是一个在对象创建时调用的 pythonic 构造函数,将初始化 greet 变量。
第 7 行:将字符串“Hello World”传递给我们的变量 greet。
现在去你的终端/cmd,cd 到你保存合约的目录,输入以下命令编译你的 Vyper 合约:
$ vyper contract.vy
$ vyper -f abi contract.vy
如果合约没有任何错误,它将被编译为字节码和 ABI,结果看起来会像这样:
现在,让我们使用 MyEtherWallet 部署我们的合约:https://www.myetherwallet.com/interface/deploy-contract
将你的 Metamask 钱包连接到 MyEtherWallet 平台,将终端/cmd 中的字节码和 ABI 粘贴到相应字段中,填写合约名称,然后单击“签署交易”,从 Metamask 确认交易。
现在我们已成功部署合约,让我们与其互动。转到你的 Metamask 插件的活动部分,单击最后一笔交易(部署合约的那一笔),单击右上角的 Etherscan 按钮,然后复制合约地址。
将合约地址粘贴到 MyEtherWallet 的与合约互动部分 中,并附上 ABI,然后点击继续。
从下拉菜单中选择函数“选择项目”,然后点击 greet。你会在结果部分看到 Hello World 消息。
祝贺你成功部署第一份 Vyper 合约;有关更多信息,请参阅 Vyper 的官方文档,并感谢 Jacques Wagener 修复了 Vyper Remix 插件的远程编译器。
订阅我们的 通讯,获取更多以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 与我们联系。你还可以在我们的 Discord 社区服务器中与我们聊天,那里有一些你见过的最酷的开发者 :)
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!