第2课

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原则,以实践为基础,专注于在以太坊网络上设计、实施和使用智能合约。区块链技术是一个非常广阔的世界,处于不断发展变化中。作为区块链工程师,我们应该有着持续的发现和学习精神。您前进的每一小步,都将成为通往精通编程路上的重要一步。请大家继续加油,我们在第3课中见!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第2课

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原则,以实践为基础,专注于在以太坊网络上设计、实施和使用智能合约。区块链技术是一个非常广阔的世界,处于不断发展变化中。作为区块链工程师,我们应该有着持续的发现和学习精神。您前进的每一小步,都将成为通往精通编程路上的重要一步。请大家继续加油,我们在第3课中见!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。