探索以太坊替代方案:使用Vyper创建智能合约
本课程详细介绍了如何使用Vyper进行区块链编程。通过本课程,您将学习以太坊和智能合约开发的基础知识,并使用Remix IDE亲自动手部署。探索构建自己的去中心化应用,就从今天开始!
Vyper和以太坊智能合约
智能合约是自动执行的合约,协议条款直接以代码形式编写。它是以太坊上dApp的基本构建块,当满足合约中预设的条件时,会自动执行交易,并实现以太坊的原生代币Ether在各个账户之间的转移。
以太坊、智能合约和Solidity介绍
以太坊
以太坊是一门开创性的技术,为一种被称为去中心化网络的新型互联网提供了基础。以太坊由Vitalik Buterin创建,是一个基于区块链的开源平台,允许开发人员创建和部署去中心化应用(dApp)。以太坊使用智能合约,使得dApp能够按计划精确执行,不存在停机、审查、欺诈或第三方干预。
以太币(ETH)是以太坊的原生加密货币,使用Solidity语言。以太坊的底层技术区块链本质上是一个分布式账本,保存了一份永久且防篡改的记录。这种去中心化架构使开发者能够通过平台强大的生态系统和适应性来创建多样化的去中心化应用(dApp)。
智能合约
智能合约是自动执行的合约,协议条款直接以代码形式编写。它是以太坊上dApp的基本构建块,当满足合约中预设的条件时,会自动执行交易,并实现以太坊的原生代币Ether在各个账户之间的转移。这种自动化消除了对中间人的需求,大大提高了过程中的效率和可信度。由于小型计算机程序存储在区块链中,开发智能合约的目的即是自动执行其条款和条件,从而提高数字协议的自动化和精确度水平。
智能合约的优势和用例
我们曾在课程:智能合约开发中讲到,智能合约具有几大优势,使其成为数字领域的创新概念:
消除中间人:智能合约消除了对中间人的需求,实现了更加经济实惠的交易。
去中心化:在区块链之上构建智能合约,可以创建去中心化平台,减少对单一中心化实体的依赖。
易于开发且成本低廉:以太坊等平台为开发人员提供了轻松且经济实惠地构建基于交易的应用所需的基础设施。
更高的安全性和透明度:智能合约是以代码形式编写的,因此交易不可逆转且可追踪,确保了更大程度的透明度和安全性。
自动执行:智能合约是自动执行的,创建了一个无需信任的交易环境,让用户可以放心地与世界上任何人进行交易。
占主导地位的语言Solidity
在以太坊上编写智能合约最常用的语言是Solidity。受JavaScript、Python和C++的影响,Solidity是为开发以太坊智能合约而设计的静态类型的编程语言。它功能丰富、发展成熟,并且有强大的社区支持,是许多以太坊开发者的首选。
Vyper介绍
以太坊替代方案Vyper
虽然Solidity在以太坊开发中占据了主导地位,但一种名为Vyper的语言提供了独特而有价值的替代性解决方案。Vyper是一种专注安全性、追求简洁性的语言,类似于Python,专为在以太坊中编写智能合约而设计。与Solidity不同,Vyper舍弃了部分功能,以确保合约更加安全且易于理解。
Vyper相较于Solidity的优势
虽然Solidity很受开发人员欢迎,但Vyper注重安全且方便用户理解,也深受许多开发人员青睐。对于熟悉Python的开发者来说,Vyper的语法更易理解,是Python开发者踏入以太坊dApp开发的良好起点。
Solidity与Vyper对比

为更好地了解Solidity和Vyper,我们将从语法、学习资料、数组和字符串大小、社区支持、合约和错误处理、变量定义、创建拍卖、指定函数、取款过程和合约终止等方面来比较这两种语言。
语法
Solidity和Vyper都属于高级编程语言,语法相对简单。但Solidity的语法更接近广泛使用的C++和JavaScript,这让开发人员更容易上手。而Vyper则更类似于Python,对那些熟悉Python的开发者来说会更加亲切。
学习资料
Solidity的使用更加广泛,因此有更多的文档和学习资料,有助于开发人员学习。Vyper则是一门较新的语言,学习资料相对较少,其形式简单,与Python有诸多相似之处,对于已经熟悉Python的开发人员来说,很容易上手。
数组和字符串大小
Solidity提供动态大小的字符串和数组,允许开发人员根据需要更改字符串的长度。Vyper则限制数组和字符串的大小,以减少智能合约中的潜在漏洞。
社区支持
Solidity的广泛使用促进了一个由开发人员、专家和爱好者组成的繁荣社区。而作为一门较新的语言,Vyper的社区规模较小。但随着该语言的不断发展,其社区支持也会随之增加。
合约定义和错误处理
在Solidity中,可以使用Brownie和VSCode等工具来定义合约。创建合约时,Vyper只需指定所使用的Vyper版本。此外,Vyper可以实时检测拼写错误,简化了调试过程,而Solidity需要在合约编译好后才能发现错误。
变量定义
Vyper中的变量定义很简单,类似于高级编程语言。而Solidity则采用更复杂的方法来定义变量,分号的使用则使这一过程更加复杂。
创建拍卖
在Vyper中创建拍卖比较简单。它允许使用外部修饰符,使其他合约可以调用它。而Solidity则需要更复杂的处理过程,包括错误定义和使用“if”语句。
指定函数
Vyper函数可以使用外部修饰符进行修饰,允许它们接受交易的付款。而Solidity需要在函数中指出外部和可支付部分。此外,Solidity使用“if”语句,而Vyper使用“assert”语句。
提款流程
与Solidity相比,Vyper中的提款过程相对简单。Solidity需要定义金额并创建“if”语句,而Vyper则采用更为直接的方法。
合约终止
Vyper用“assert”语句来检查时间,而在Solidity中,在将“ended”变量设置为”True”之前需要使用’if’语句。此外,与Vyper不同,Solidity要求标明拍卖结束事件并转移资金。
设置Vyper
准备开发环境
用Vyper编码前,需要确保计算机已做好开发的准备。具体来说,需要进行以下操作:
安装Python:Vyper需要Python 3.6或更高版本。您可以从官网下载Python,并按照说明在计算机上安装Python。您可以在终端中输入python--version来检查安装情况,返回的输出中可以看到您安装的Python版本。

安装Pip:Pip是Python的软件包管理器,用于安装和管理不属于Python标准库的其他软件包。在安装Python时,应该会自动安装Pip。您可以在终端中输入pip--version来检查安装情况。如果未安装,您可以从Pip官方网站下载并按照其提供的说明进行安装。

安装Vyper
环境准备就绪后,您可以安装Vyper。打开终端并运行以下命令:
Python
pip3 install vyper

可以看到,在代码末尾,终端建议我们通过输入以下命令来更新pip:
Python
python.exe -m pip install --upgrade pip
运行此命令以确保使用最新版本的pip。安装更新版本后,您会看到如下消息:

安装完成后,您可以通过运行vyper--version来检查Vyper版本的情况。您应该会在输出中看到您安装的Vyper版本。
Vyper的开发工具和集成开发环境
虽然您可以在任何文本编辑器中编写Vyper代码,但使用集成开发环境(IDE)可以使您的工作更加轻松,有以下两种选择:
Remix:Remix是以太坊提供的基于浏览器的集成开发环境,支持Solidity和Vyper,并提供内置编译器、强大的调试器和测试环境等功能。您可以通过访问官方Remix网站来使用Remix,免去了安装的复杂流程。(在本课程中我们将使用Remix)。
Brownie:Brownie是一个基于Python的以太坊开发环境和测试框架,支持Solidity和Vyper。Brownie的一个主要优势是您可以使用Python这种许多开发人员已经熟悉的语言编写测试。要安装Brownie,需要打开终端并运行pip3 install eth-Brownie。这将需要几分钟时间,同时会安装许多库和包。
Vyper的语法和基本概念
掌握Vyper的语法和基本结构,包括基本数据类型、函数、控制结构以及Vyper中的错误处理,它们是Vyper程序的基础。了解这些核心组成部分非常重要。
Vyper的语法
计算机和人一样,通过多种语言进行交流。Solidity和Vyper是以太坊区块链中两种最常见的语言。在第1课中,我们介绍了Vyper(一种以太坊智能合约编程语言),并与Solidity进行了比较。而在本节中,我们将深入探讨Vyper的语法,它与Python的语法非常相似。Vyper的目标之一是使智能合约编码更加简单,同时保持良好的安全性。它的语法旨在尽可能简单明了。如果您是Python编程人员,您会感到非常熟悉。即使不是,Vyper类似Python的语法也很容易学习。我们来看看Vyper的主要语法构成。
Python
# This is a comment in Vyper
@external
def greet(name: string[10]) -> string[30]:
return concat("Hello, ", name, "!")
Vyper的基本数据类型
数据类型是任何编程语言的构建块,定义了程序中可以存储和操作的数据类型。让我们来看看Vyper提供的一些基本数据类型:
布尔型(Boolean):一种二进制数据类型,有两种值,true(真)或false(假)。如:flag:bool=True
整数(Integer):Vyper支持整数,可以是正数、负数或零,大小从8到256位不等,最常见的是int128。示例:count: int128 = 10
小数(Decimal):用于表示带有小数点的数字。示例:price: decimal = 123.45
字节(Byte)和字符串(String):字节是字节数据的序列,而字符串是unicode字符的序列。示例:name: string[20] = 'Alice'
列表和数组:列表是相同数据类型项的集合,数组是一种特殊类型的列表,长度固定。例如:numbers: int128[5] = [1, 2, 3, 4, 5]
每种数据类型在编写智能合约时都有自己的用途。您需要根据要对该数据执行的操作类型,为要存储的每条数据选择正确的数据类型。
总的来说,Vyper提供的值有:
bool
int128
uint256
decimals
address
bytes32
Bytes
String
Python
# @version ^0.3.7
b: public(bool)
i: public(int128) # -2 ** 127 to (2 ** 127 - 1)
u: public(uint256) # 0 to 2 ** 256 - 1
dec: public(decimal) # -2 ** 127 to (2 ** 127 - 1), 10 decimal places
addr: public(address)
b32: public(bytes32)
bs: public(Bytes[100])
s: public(String[100])
@external
def __init__():
self.b = False
self.i = -1
self.u = 123
self.dec = 3.14
self.addr = 0x704534A22F03Ea46f76A07a195568D115E2e6d52
self.b32 = 0xada1b75f8ae9a65dcc16f95678ac203030505c6b465c8206e26ae84b525cdacb
self.bs = b"\x01"
self.s = "Hello Vyper"
Vyper中的函数
与许多其他编程语言一样,Vyper中的函数是执行特定任务的可复用代码块。它们使您的应用程序具有更好的模块性,并允许代码复用。
与Python一样,在Vyper中,您可以使用def关键字定义函数。函数也有参数列表和返回类型。下面是一个简单的Vyper函数:
Python
@external
def add(a: int128, b: int128) -> int128:
return a + b
使用@external修饰符可以从合约外部调用此函数(通过交易或其他合约)。如果没有此修饰符,该函数只能在定义它的合约内进行调用。
Internal和External函数
@internal函数只能在合约内部调用。
@external函数只能从合约外部调用。
示例:
Python
# @version ^0.3.7
# Internal functions can only be called inside this contract
@internal
@pure
def _add(x: uint256, y: uint256) -> uint256:
return x + y
@external
@view
def extFunc() -> bool:
return True
# External functions can only be called from outside this contract
@external
@view
def avg(x: uint256, y: uint256) -> uint256:
# cannot call other external function
# self.extFunc()
# can call internal functions
z: uint256 = self._add(x, y)
return (x + y) / 2
@internal
@pure
def _sqr(x: uint256) -> uint256:
return x * x
@external
@view
def sumOfSquares(x: uint256, y: uint256) -> uint256:
return self._sqr(x) + self._sqr(y)
Vyper中的控制结构
控制结构用于根据不同的决策执行不同的操作。Vyper提供了几种控制结构,包括if语句、for循环和while循环。
if语句是最基本的控制结构,只有在指定条件为真时才执行代码块。
Python
@external
def is_greater_than_ten(a: int128) -> bool:
if a > 10:
return True
else:
return False
Vyper中的for循环与Python的语法相同。您可以对列表、元组、集合等中的每个项执行一组语句。
Python
numbers: int128[5] = [1, 2, 3, 4, 5]
@external
def sum_numbers() -> int128:
sum: int128 = 0
for i in range(5):
sum += self.numbers[i]
return sum
只要给定条件为真,Vyper中的while循环就会重复执行目标语句。
Python
@external
def count_to_ten() -> int128:
count: int128 = 0
while count < 10:
count += 1
return count
Vyper中的错误处理
在编程中,错误处理对于处理运行时错误并向用户提供有意义的报错消息至关重要。Vyper使用assert语句来处理错误。
Python
@external
def divide(a: decimal, b: decimal) -> decimal:
assert b != 0, "Cannot divide by zero"
return a / b
在上述代码中,如果b为零,则将出现错误提示”不能除以零”,且交易将被还原。否则,将继续进行除法操作。
Vyper还提供了revert语句,可用于停止当前调用的执行并还原状态更改,同时还提供报错消息。
以上是对Vyper语法和基本原理的简要介绍。与任何编程语言一样,掌握Vyper的关键是勤加练习。我建议使用这些技巧编写简单的应用程序。在下一节中,我们将介绍如何使用Vyper构建和维护智能合约。请继续关注!
恭喜大家完成第2课的学习!到现在,您应该已经掌握了Vyper的语法和基本结构,包括基本数据类型、函数、控制结构以及Vyper中的错误处理,它们是Vyper程序的基础。了解这些核心组成部分非常重要,因此一定要多多练习,不断探索。您可以试着利用今天所学的知识创建简单的程序。要熟练撰写代码,亲自动手操作是唯一途径。
大家可以更深入地探索使用Vyper构建以太坊智能合约。在第3课中,我们将探讨更复杂的Vyper原则,以实践为基础,专注于在以太坊网络上设计、实施和使用智能合约。区块链技术是一个非常广阔的世界,处于不断发展变化中。作为区块链工程师,我们应该有着持续的发现和学习精神。您前进的每一小步,都将成为通往精通编程路上的重要一步。
在Vyper中创建和管理智能合约
通过本课程的学习,可为使用Vyper进行区块链编程打下了坚实的基础,对以太坊、智能合约以及如何在Remix IDE中使用Vyper创建智能合约有了深入的了解,为您打开了开发去中心化应用和参与区块链生态系统的机会。
简介
欢迎开启第3课的学习!在本课中,我们将重点应用前一课中学到的概念和语法,使用Vyper和Remix IDE开发以太坊智能合约。我们将创建、部署并使用简单的智能合约,让您掌握Vyper和以太坊的实操经验。我们将介绍一个简单的数据存储合约并模拟一个基本的投票系统。
SimpleStorage智能合约介绍
我们要部署的第一个合约是SimpleStorage。这个合约是一个简单的数据存储合约,用于存储单个数字。SimpleStorage由一个变量storedData和两个函数set和get组成。set函数用于存储数字,get函数用于检索此数字。
部署并使用SimpleStorage合约
我们将分步介绍如何在以太坊区块链上部署和使用SimpleStorage合约。将合约部署到以太坊区块链是将合约的字节码和ABI传输到以太坊网络的过程,从那里可以调用和执行合约。一旦合约部署完成,它将获得一个独特的地址,可以通过该地址进行访问。
SimpleStorage的代码如下:
Python
# @title SimpleStorage
storedData: int128
@external
def set(x: int128):
self.storedData = x
@external
def get() -> int128:
return self.storedData
在这个合约中,我们定义了一个公共整数变量storedData,一个用于设置storedData值的公共函数set(x: int128),以及一个用于检索storedData当前值的公共常量函数get() -> int128。
使用Remix部署此合约的详细步骤如下:
打开网络浏览器并进入Remix以太坊IDE。
激活Vyper插件。

在Deploy & Run Transactions界面将环境切换到Injected Web3,将Remix连接到您的MetaMask钱包。
在File Explorer界面,单击+图标创建一个新文件,命名为SimpleStorage.vy。

将SimpleStorage合约代码粘贴到新文件中。

转到 VyperCompile选项卡并选择SimpleStorage合约。
切换到Deploy & Run Transactions选项卡,单击Deploy按钮。

MetaMask将打开一个交易确认弹窗。确认交易。
确认交易后,您可以在Deployed Contracts界面看到部署好的SimpleStorage合约。
完成以上操作后,便可以使用该合约了。例如,要存储一个数字,请在set函数中输入该数字并点击transact。要检索存储的数字,请单击get。
较复杂的SimpleVoting合约
在了解SimpleStorage合约的编码过程后,我们将进一步学习更复杂的SimpleVoting合约的构建。SimpleVoting合约将模拟一个简单的投票系统。我们有一系列候选人,每个候选人都以一个字符串表示。用户可以为这些候选人投票,我们将跟踪每个候选人获得的票数。该合约将提供添加候选人、为候选人投票以及获取候选人获得的总票数的函数。
部署并使用SimpleVoting
SimpleVoting合约比SimpleStorage稍微复杂一些。在SimpleVoting中,我们将拥有多位候选人,每个候选人由一个字符串表示。
SimpleVoting的代码如下:
Python
# Vyper Voting Contract
# Declare a state variable `votes` as a HashMap to store the votes for each candidate.
votes: HashMap[bytes32, uint256]
@external
def vote(candidate: bytes32):
"""
Cast a vote for a candidate.
Arguments:
candidate: bytes32 - The identifier of the candidate to vote for.
"""
# Increment the vote count for the specified candidate.
self.votes[candidate] += 1
@external
@view
def get_votes(candidate: bytes32) -> uint256:
"""
Get the total number of votes for a candidate.
Arguments:
candidate: bytes32 - The identifier of the candidate to retrieve votes for.
Returns:
uint256 - The total number of votes the candidate has received.
"""
return self.votes[candidate]
这份合约非常基础,没有对双重投票或未经授权投票的预防措施。但在实际操作中,您需要包括一些措施(如选民登记和检查)来防止这些问题,确保一个地址只能投一次票。
结语
通过本课程的学习,您已经为使用Vyper进行区块链编程打下了坚实的基础,对以太坊、智能合约以及如何在Remix IDE中使用Vyper创建智能合约有了深入的了解,为您打开了开发去中心化应用和参与区块链生态系统的机会。
要想进一步提高自己的理论知识和实操能力,您还可以思考以下领域:
Solidity高级编程语言:Solidity是开发以太坊智能合约的另一种广泛使用的编程语言。学习Solidity将拓宽你处理现有合约的能力,并为以太坊社区做出贡献。点击这里查看我们的相关课程:[上线时请插入Solidity课程链接]
去中心化应用(DApp)开发:通过使用Web3. js、React或Vue.js等框架将智能合约与前端开发相结合,深入了解如何构建完整的去中心化应用,创建与智能合约交互的交互式用户界面。
安全与审计:探索保护智能合约和进行彻底代码审计的最佳实践。了解潜在漏洞并降低风险,确保您的智能合约足够可靠和安全。
区块链互操作性:研究不同区块链网络和协议的集成。了解跨链通信和可与多个区块链交互的互操作性智能合约的开发。
区块链技术在不断发展,了解这一领域的最新动态非常重要。因此,一定要与区块链社区互动,积极参与讨论,探索新概念和技术,保持信息获得的灵通和及时。