手把手教你用Michelson编写智能合约

区块链大本营 阅读 48 2020-7-24 17:33
分享至
微信扫一扫,打开网页后点击屏幕右上角分享按钮

手把手教你用Michelson编写智能合约

手把手教你用Michelson编写智能合约

Michelson入门:Tezos的脚本语言

目前,Michelson是智能合约中最令人兴奋的编程语言之一,它是一种基于堆栈的严格类型化语言。编写智能合约可以确保Tezos区块链的安全。Michelson可以和以太坊智能合约的字节码相媲美,但它更具可读性,更安全,更强大。用来为Tezos编写智能合约的所有高级语言——比如SmartPy、Ligo或Lorentz——最终都可以编译成Michelson。

在这第一篇文章中,我们将尝试使用Michelson语言,理解“基于堆栈”的含义,并编写一些非常简单的智能合约。本文主要是为编程或者Tezos开发的初学者编写的,但是想要更多地了解Michelson的中级程序员也可以在这里找到有用的信息。我们将使用Baking Bad开发的Jupyter内核,在Jupyter笔记本中编写Michelson代码。如果你想了解代码的工作原理,可以在每个部分中找到一个链接。

让我们写一些代码。

手把手教你用Michelson编写智能合约

堆栈

要理解Michelson是如何工作的,堆栈是需要正确理解的主要概念之一。每一份Michelson合约都是相互遵循的指令清单。这些指令以准确的顺序排列,并按照写入的顺序执行。

每条指令都会以某种方式操纵堆栈。把它想象成一堆数据。你编写的指令将对堆中的数据产生影响。例如,你可以将堆上两段数据相加,删除顶部的数据,将另一段数据放在顶部,传输一些令牌,等等。该堆栈以后进先出的方式工作 :如果要访问不在堆栈顶部的数据,必须先处理它上面的数据。

使用Michelson进行编码时,你必须记住的三个主要概念:

新数据放在堆栈的顶部。

只有当堆栈中的数据位于堆栈顶部(或某些操作中位于第二个位置,如下所述)时,才可以访问堆栈中的数据。

数据处理的顺序是从堆栈的顶部到底部。

让我们看一个例子。

手把手教你用Michelson编写智能合约

PUSH操作

如果你要在堆栈顶部添加一条数据,你将调用PUSH操作。它是这样工作的:

此时需要注意的是,堆栈中可能已经有数据,在这种情况下,新值会放在它们之上。这是你在Michelson中推送新数据的方式:

PUSH value-type value

例如,如果要推送一个整数,你会写PUSH int 2,对于一个字符串,你会写PUSH string “ Tezos”。

手把手教你用Michelson编写智能合约

Michelson智能合约结构

Michelson中的智能合约展现了一个由三部分组成的简单结构:

预期参数的类型。

存储的类型。

Michelson代码。

转换成代码表示如下:

parameter parameter-type ;

storage storage-type ;

code {

...

}

除此结构外,在Michelson中编写智能合约时,你还必须牢记两条规则:

1、在执行代码时,自动将包含参数和存储器的对推入堆栈中。需要记住的是——如果没有参数,就用单位代替。

2、代码必须始终返回一对,它包含操作列表和(更新的)存储(对列表(操作)存储)。当堆栈中只剩下此类对时,执行就会停止。

手把手教你用Michelson编写智能合约

一个简单的Michelso智能合约

现在我们已经了解了PUSH以及Michelson中智能合约的结构,让我们来写一个。

对于这个合约,我们将写一个“ Hello world”合约,并将一个字符串保存到存储中:

执行这段代码后,会发生以下情况:

1、参数unit表示所传递的参数为unit类型(基本上是无参数)。

2、storage string表示合同的存储类型为string。

3、DROP是一种操作代码,用于删除堆栈顶部的任何内容。我们之前说过,一个带有参数和存储空间的对在开始时会自动包含在栈顶,我们不打算使用它,可以将其删除。

4、PUSH将一个值放到栈顶,这里是字符串“ Hello world”。

5、NIL是一种操作码,它将指定类型的空列表(此处操作)添加到堆栈的顶部。

6、PAIR将两个元素放在堆栈顶部,创建一个包含这两个元素的新对,然后将其推回堆栈中。

注意:每条指令都以分号结尾(最后一条指令是可选的)。

手把手教你用Michelson编写智能合约

添加整数并保存结果

让我们介绍一个新操作:ADD。你可能已经猜到了它的作用——将两个数值相加。

这有一个简单的合约,演示了它是如何工作的:

让我们看一下每个操作,了解堆栈内部发生了什么:

参数unit:同样,我们没有使用任何参数,因此我们传递一个单位。

storage int:这一次,我们将整数类型的值保存到存储器中。

DROP:我们不需要初始对,所以我们可以删除它,为我们实际需要的值腾出空间。

PUSH int 2; PUSH int 3;:这里需要注意一下这个顺序,它非常重要。推入int 3后,int 2就会位于堆栈的底部。在加法的情况下,顺序并不太重要,但如果你要做减法,必须将它们按正确的顺序推入。

ADD和PAIR的原理是一样的。你取堆栈顶部的前两个元素,并从中获得一个值,然后将其推回堆栈。ADD将两个数字相加。需要注意的是,这些数字必须都是相同的数字类型(例如,你不能将integer和nat加在一起)。

NIL:和以前的合同一样,我们将空的操作列表推入。

PAIR:创建一个对,包含操作列表和我们需要停止执行合同的新存储。

手把手教你用Michelson编写智能合约

结论

Michelson语言的复杂性往往被高估了。这可能是由于目前没有适合初学者的教程,并且在线提供的文档技术性很强,对于新手来说也很难阅读。这就是为什么我决定亲自经历学习Michelson的过程,使用困难的文档来创建一系列教程,我希望这些教程更容易理解使用。

理解和欣赏Tezos区块链的独特性,以及使其变得更加安全和有用,关键是要理解Michelson。

在下一部分中,我们将继续深入研究Michelson。我们将编写一些简单的智能合约,探索由Baking Bad团队创建的令人惊叹的Jupyter笔记本,它使我们能够编写Michelson代码,并准确了解正在发生了什么。

原文作者 | Claude Barde

译者 |天道酬勤

图片来源 | CSDN 下载自视觉中国

btcfans公众号

微信扫描关注公众号,及时掌握新动向

来源链接
免责声明:
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
上一篇:经过五年,以太坊采用率超过了比特币 下一篇:恒定函数做市商:DeFi 的真正突破

相关资讯