如何使用Python为区块链编写智能合约-第二部分

在本系列教程中,我们将使用Smart Chain Arena中的SmartPy语言。 SmartPy提供了一个完整的集成开发环境,可以在线编写智能合约,对其进行测试,调试并将其部署在区块链中。
要求
计算机编程经验
基本的Python编程知识
熟悉区块链技术
网络浏览器
欢迎使用SmartPy
SmartPy基于Python 3语言,并且需要Python代码语法。 开始使用SmartPy编写智能合约时,Python开发人员会感到宾至如归。
但是,请注意,尽管可以通过import指令导入Python库,但是某些功能仅在开发环境中有效。 例如,当部署到区块链时,存在环境变化的细节。
第一件事
对于那些不太了解Python的人来说,记住缩进非常重要。它影响代码的正确性。
对于智能合约编程的新手,请注意,智能合约将始终具有一个入口点,通过交易将其从外部世界调用。
智能合约发布后,存储在区块链中,并分布在每个计算机节点网络上。每个节点上都有智能合约的副本。
第一课

让我们从满足开发环境开始。您将被授予访问SmartPy IDE的权限:

如何使用Python为区块链编写智能合约-第二部分

再简单不过了。屏幕左侧是编辑器,您将在其中键入智能合约源代码。右边是输出面板;它将显示编程的结果输出。
Hello World!
有句古希腊语说,如果您用新语言编写的第一个程序不是“ Hello World!”, 那么将来在编程方面会遇到很多麻烦。 所以…
我们的第一次SmartPy体验
单击屏幕的编辑器部分,然后键入:
alert(“Hello World!”)
现在,只需单击“Evaluate Script&Run Tests(”(输出面板上的按钮)。 瞧! 出现一个框,显示“ Hello World!” 在屏幕上。 这是一个好的开始,只是为了打破僵局。
再往前走一点
好的,很高兴在屏幕上看到该消息警报。但是,让我们稍微修改一下代码,通过在智能合约脚本中添加测试来改变消息的显示方式。
只需将下面的代码复制并粘贴到编辑器中即可。注意缩进,因为它很重要:
@addTest(name = “testHelloWorld”)
def myTest():
   setOutput(“Hello World!”)
现在,再次单击按钮Evaluate Script&Run Tests。您将在输出面板上看到结果,并且还将注意到在其上方出现了一个名为testHelloWorld的新按钮:

如何使用Python为区块链编写智能合约-第二部分

该测试很重要,因为我们需要在将智能合约发布到区块链上之前对其进行模拟。
到目前为止,一切都很好。 尽管如此,与智能合约相关的东西还不多。
创建我们的第一个智能合约
所以,让我们认真一点。现在,我们将创建我们的第一个智能合约。首先我们将导入smartpy库。清除编辑器,然后将以下代码粘贴到其中:
import smartpy as sp
现在我们已经导入了库,我们将能够基于继承的智能合约定义一个类。将此添加到您的代码:
class MyClass(sp.Contract):
    def __init__(self):
        self.init(result = 0)
我们在这里要做的是定义一个新类并声明它的constructor方法(init)。 这就是初始化此类的新实例(objects)的方式。
定义智能合约入口点
智能合约至少具有一个入口点。 因此,让我们声明智能合约的切入点。将以下文本添加到您的代码中:
 @sp.entryPoint
    def myEntryPoint(self, params):
        self.data.result = params.op1 + params.op2
如果现在通过单击Evaluate Scripts&run Tests按钮来运行代码,则不会发生任何事情。那是因为我们需要在代码中添加一个测试。
因此,让我们开始吧。 复制下面的文本并粘贴您的代码:
@addTest(name = “myFirstSmartContractTest”)
def mySmartContractTest():
   html = “”
   mySmartContract = MyClass()
   html += mySmartContract.myEntryPoint(op1 = 1, op2 = 2).html()
   setOutput(html)
让我们分解一下添加的测试。在这里做什么?
我们正在定义一个名为html的字符串,该字符串将用于在屏幕上呈现输出。然后,我们创建类MyClass的对象mySmartContract实例,该实例派生自sp.Contract类型。 这就是我们如何在Tezos智能合约中有效地转换类。此派生构造以及构造函数和初始化都是纯标准的Python语法。
同样,上述@方法/函数声明是Python装饰器,用于指导编译器执行某些操作。 它们就是所谓的语法糖,它提供了一种方便的方法,可以在函数定义中添加一点魔力。 您可以将其视为将您编写的Python函数转换为另一个Python函数的函数。
例如,sp.entryPoint是一个采用Python函数并将其转换为将成为实际的Michelson入口点的函数。
现在试着再次运行代码,看看会发生什么。结果如下:
如何使用Python为区块链编写智能合约-第二部分

如果遇到错误,请先检查代码是否缩进不正确。通常您必须使用四个空格或TAB缩进代码。同样检查逻辑缩进,即哪个定义属于每个父声明。
第一个示例是智能合约,该合约将参数传递给类myClass的方法myEntryPoint的两个数字相加,并将结果放在智能合约的存储result中。
为了更易于理解和测试,下面是完整的注释代码:
# 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)
这是与SmartPy环境的第一次非常简短的联系,以使您熟悉它。 随着我们对未来作品的发展,我们将致力于更多实际的用例。