Пошаговое руководство по началу работы

Каждый компьютерный язык, написанный на сегодняшний день, имеет общий набор логических конструкций. Какими бы разными они ни были, все они позволяют программистам создавать условные выражения и циклы для выполнения действий на основе некоторой оценки.

В этой третьей части нашей серии статей о программировании смарт-контрактов на блокчейне на Python будет показано, как использовать условные выражения и циклы на языке SmartPy.

Начнем с открытия онлайн-редактора SmartPy, указав в нашем браузере https://smartpy.io/demo

Затем скопируйте и вставьте приведенный ниже код (из нашей последней статьи) на экран редактора:

# Imports the SmartPy library.
import smartpy as sp
# Defines the class MyClass and its constructor.
class MyClass(sp.Contract):
    def __init__(self):
        self.init(result = 0)
        
    # Defines the Smart Contract entry point.
    @sp.entryPoint
    def myEntryPoint(self, params):       
        self.data.result = params.op1 + params.op2
        
# Creates the "test" to simulate the Smart Contract call.
@addTest(name = "myFirstSmartContractTest")
def mySmartContractTest():
    # Creates a string variable to build the output.
    html = ""
    
    # Instantiates an object of class "MyClass".
    mySmartContract = MyClass()
    
    # Calls the "myEntryPoint" method passing parameters.
    html += mySmartContract.myEntryPoint(op1 = 1, op2 = 2).html()
    
    # Outputs the result to screen.
    setOutput(html)

Прежде чем мы начнем, нажмите кнопку «Оценить сценарий и запустить тесты», чтобы проверить, все ли работает нормально.

Ok. Теперь предположим (для дидатических целей), что мы должны добавить правило в наш скрипт суммирования. Учтите, что мы не можем позволить пользователю передавать ноль в качестве значения параметра нашему смарт-контракту. Поэтому нам нужно будет добавить в наш код условие. На большинстве компьютерных языков это можно сделать, добавив оператор «ЕСЛИ». В SmartPy все не иначе:

    sp.if (params.op1 == 0):
        self.data.result = -1
    sp.else:
        self.data.result = params.op1 + params.op2

Приведенный выше фрагмент кода просто проверяет, равен ли первый переданный параметр (op1) нулю. Если это правда, сценарий помещает -1 в переменную результата хранения контракта и не будет выполнять операцию суммы (поскольку она находится внутри оператора «else»). Скопируйте и вставьте код сразу после определения «myEntryPoint». Обратите внимание на отступ (должен быть 4 символа или TAB). Измените первый переданный параметр в вызове для «myEntryPoint» на 0. Запустите контракт, щелкнув «Оценить сценарий и запустить тесты». У вас должен получиться такой результат:

Теперь верните переданный параметр обратно на 1. Выполнить снова. Вы увидите, что теперь сумма была сделана, потому что код внутри оператора «else» был выполнен.

Другой способ проверки условий - использование оператора «verify»:

sp.verify(params.op1 != 0)
self.data.result = params.op1 + params.op2

Здесь два отличия. Во-первых, обратите внимание, что теперь вы проверяете условие, которому хотите соответствовать (op1 отличен от нуля). Во-вторых (и это наиболее важно), этот оператор «verify» остановит выполнение скрипта и выйдет с «исключением» (ошибкой). Скопируйте и вставьте приведенный выше код в редактор (заменив структуру sp.if-sp.else). Затем измените параметр op1 на 0. Запустите сценарий. Посмотрите, что вы получите:

ПЕТЛИ

В компьютерном программировании циклы - это повторение выполнения кода определенное количество раз или при известном условии. Предположим, мы хотим выполнить 5-кратную операцию суммирования. Мы должны использовать условный цикл, обычно известный как «for-next» или «do-while». В SmartPy мы делаем это так:

sp.for i in sp.range(0, 5):
    self.data.result += params.op1 + params.op2

Поместите приведенный выше код в свой редактор и запустите свой скрипт. Используя op1 = 1 и op2 = 2, вы должны получить в результате «15» (сумма будет 1 + 2 = 3, а затем накопить результат 5 раз = 15):

Другой способ перебрать условие - использовать конструкцию «whileBlock»:

@sp.entryPoint
    def myEntryPoint(self, params):
       self.data.i = 0
       with sp.whileBlock(self.data.i <= 30):
          self.data.i += params.op1 + params.op2

Это будет зацикливать операцию суммирования до тех пор, пока наша переменная «i» не будет иметь значение выше 30:

На сегодня все! Поэкспериментируйте с различными типами условных выражений, показанными здесь. Помните, что практика ведет к совершенству. Цель этих крошечных уроков - познакомить вас с IDE SmartPy и синтаксисом команд, чтобы в будущем мы могли делать более сложные вещи. Я также рекомендую просмотреть шаблоны, которые поставляются с онлайн-редактором, так как это хороший способ заранее открывать для себя что-то новое.

Увидимся в Части 4!

Пропустили Часть 2? Прочтите здесь: https://medium.com/@lmilfont/how-to-write-smart-contracts-for-blockchain-using-python-part-2-99fc0cd43c37