Компьютеры, как и люди, общаются на различных языках. Solidity и Vyper - два заметных языка в сфере блокчейна Ethereum. В уроке 1 мы представили Vyper, язык программирования смарт-контрактов Ethereum, и сравнили его с Solidity. В этом разделе вместо этого мы углубимся в синтаксис Vyper, который поразительно похож на синтаксис Python. Одна из целей Vyper - сделать кодирование смарт-контрактов проще, сохранив при этом хорошую безопасность. Его синтаксис должен быть максимально простым и понятным. Вы будете чувствовать себя как дома, если Вы программист на Python. Даже если это не так, синтаксис Vyper, похожий на Python, прост для изучения. Давайте рассмотрим основные синтаксические компоненты Vyper.
Python
@external def greet(name: string[10]) -> string[30]: return concat("Hello, ", name, "!")
Типы данных - это строительные блоки любого языка программирования. Они определяют, какого рода данные можно хранить и манипулировать ими в рамках программы. Давайте рассмотрим некоторые основные типы данных, которые предлагает Vyper:
Булево: Это двоичный тип данных, который может иметь одно из двух возможных значений - true или false. Пример: flag: bool = True
Целые числа: Vyper поддерживает целые числа, которые представляют собой целые числа, которые могут быть либо положительными, либо отрицательными, либо нулевыми. Они бывают различных размеров - от 8 до 256 бит, наиболее распространенным является int128. Пример: count: int128 = 10
Десятичный: Используется для представления чисел с плавающей запятой, т.е. чисел, имеющих десятичную точку. Пример: цена: десятичная = 123.45
Байты и строки: Байты - это последовательности байтовых данных, а строки - последовательности символов Юникода. Пример: name: string[20] = 'Alice'.
Списки и массивы: Списки - это коллекция элементов одного типа данных. Массивы, с другой стороны, представляют собой особый тип списка, в котором длина фиксирована. Пример: числа: int128[5] = [1, 2, 3, 4, 5].
Каждый из этих типов данных имеет свое место в написании смарт-контрактов. Вам необходимо выбрать правильный тип данных для каждой части данных, которые Вы хотите хранить, исходя из того, какие операции Вы хотите выполнять с этими данными.
Напомним, что некоторые значения, доступные в Vyper:
bool
int128
uint256
Десятичные числа
адрес
байт32
Байты
String
Python
b: public(bool) i: public(int128) # от -2 ** 127 до (2 ** 127 - 1) u: public(uint256) # от 0 до 2 ** 256 - 1 dec: public(decimal) # от -2 ** 127 до (2 ** 127 - 1), 10 десятичных знаков 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 = 0xada1b75f8ae9a65dcc16f95678ac2030505c6b465c8206e26ae84b525cdacb self.bs = b"\x01" self.s = "Hello Vyper"
Функции в Vyper, как и во многих других языках, представляют собой блоки многократно используемого кода, которые выполняют определенную задачу. Они обеспечивают лучшую модульность Вашего приложения и позволяют повторно использовать код.
В Vyper Вы можете определить функцию, используя ключевое слово def, как и в Python. Функции также имеют список параметров и возвращаемый тип. Вот простая функция Vyper:
Python
@external
def add(a: int128, b: int128) -> int128:
return a + b
[Декоратор @externaldecorator](https://github.com/external)делает эту функцию вызываемой извне контракта (транзакцией или другим контрактом). Без этого декоратора функция была бы доступна для вызова только в рамках контракта, в котором она определена.
[@внутренние](https://github.com/internal) функции могут быть вызваны только внутри контракта.
[@внешние](https://github.com/external) функции могут быть вызваны только извне контракта.
Пример:
Python
@internal @pure def _add(x: uint256, y: uint256) -> uint256: return x + y
@external @view def extFunc() -> bool: return True
@external @view def avg(x: uint256, y: uint256) -> uint256:
# может вызывать внутренние функции
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 предлагает несколько управляющих структур, включая if, цикл for и цикл while.
Оператор if - это самая базовая управляющая структура. Он выполняет блок кода только в том случае, если заданное условие истинно.
Python
@external
def is_greater_than_ten(a: int128) -> bool:
if a > 10:
return True
else:
return False
Цикл for в Vyper имеет тот же синтаксис, что и в 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]
возврат суммы
Цикл while в Vyper многократно выполняет целевой оператор до тех пор, пока заданное условие истинно.
Python
@external
def count_to_ten() -> int128:
count: int128 = 0
while count ## Обработка ошибок в Vyper
В программировании обработка ошибок имеет решающее значение для устранения ошибок во время выполнения программы и предоставления пользователю значимых сообщений об ошибках. Vyper использует оператор assert для обработки ошибок.
Python
@external
def divide(a: decimal, b: decimal) -> decimal:
assert b != 0, "Невозможно делить на ноль"
return a / b
В приведенном выше коде, если b равно нулю, будет выдано сообщение об ошибке "Cannot divide by zero", и транзакция будет отменена. В противном случае он перейдет к операции деления.
Vyper также предоставляет оператор revert, который может быть использован для остановки выполнения текущего вызова и возврата изменений состояния, а также для выдачи сообщения об ошибке.
Это краткое описание синтаксиса и основных принципов работы Vyper. Ключом к освоению Vyper, как и любого другого языка программирования, является практика. Я рекомендую использовать эти техники для написания простых приложений. В следующей сессии мы рассмотрим, как использовать Vyper для построения и сопровождения смарт-контрактов. Будьте начеку!
Поздравляем Вас с успешным завершением Урока 2! Вы достигли огромного прогресса в освоении синтаксиса Vyper и фундаментальных конструкций. Мы рассмотрели введение в синтаксис Vyper, основные типы данных, а также функции, управляющие структуры и обработку ошибок в Vyper. Напомним, что каждый из этих компонентов является основой любой программы Vyper. Очень важно иметь твердое понимание этих основных компонентов, и лучший способ добиться этого - практиковаться и изучать. Создавайте простые программы, включающие в себя то, чему Вы научились сегодня. Нет альтернативы практическому опыту, когда речь идет о кодировании.
Приготовьтесь в будущем еще глубже погрузиться в мир смарт-контрактов Ethereum с помощью Vyper. В Уроке 3 мы рассмотрим более сложные принципы работы с Vyper. Мы будем использовать более практический подход, сосредоточившись на разработке, реализации и взаимодействии со смарт-контрактами в сети Ethereum. Поймите, что мир технологии блокчейн широк и постоянно меняется. Как инженер по блокчейну, Ваш путь открытий и обучения никогда по-настоящему не заканчивается. Вы находитесь на пути к мастерству, и каждый шаг вперед, каким бы крошечным он ни был, является шагом вперед. Продолжайте свои прекрасные усилия, и до встречи на Уроке 3!
Отказ от ответственности
* Криптоинвестирование сопряжено со значительными рисками. Будьте осторожны. Курс не является инвестиционным советом.
* Курс создан автором, который присоединился к Gate Learn. Мнение автора может не совпадать с мнением Gate Learn.