迈克尔逊干涉仪仿真程序
这是(第1部分):迈克尔逊入门:Tezos的脚本语言
迈克尔逊必须是目前智能合约中最令人兴奋的编程语言之一。 这是一种基于堆栈的严格类型化语言,其中编写了智能合约以确保Tezos区块链的安全。 迈克尔逊可与以太坊智能合约的字节码相提并论,但它更具可读性,更安全且更强大。 您可以用来为Tezos编写智能合约的所有高级语言(例如SmartPy,Ligo或Lorentz)最终都可以编译成Michelson。
在第一篇文章中,我们将全神贯注于迈克尔逊语言,了解“基于堆栈”的含义,并编写一些非常简单的智能合约。 本文主要是为编程和/或Tezos开发的初学者撰写的,但是想要进一步了解Michelson的中级程序员也可以在此处找到有用的信息。 我们将使用Baking Bad开发的Jupyter内核在Jupyter笔记本中编写Michelson代码。 如果您想查看工作中的代码,可以在每个部分中找到一个链接。
让我们写一些代码!
堆栈
要了解迈克尔逊的工作原理,可以正确理解的主要概念之一就是堆栈 。 每个迈克尔逊合同都是相互遵循的说明列表。 这些指令以精确的顺序执行,并按照其写入顺序执行。
每条指令都会以某种方式操纵堆栈。 可以将其想象成一堆数据。 您编写的指令将对堆中存在的数据产生影响。 例如,您可以将两个数据加到堆的顶部,将一个数据移到顶部,将另一块数据放在顶部,转移一些令牌,等等。堆栈以后进先出的方式工作:如果要访问不在堆栈顶部的数据,则必须先处理其上方的数据。
使用Michelson进行编码时,您必须记住三个主要概念:
- 新数据位于堆栈顶部。
- 仅当堆栈中的数据位于堆栈顶部(或某些操作的第二位置,如下所述)时,才可以访问堆栈中的数据。
- 数据的处理顺序从堆栈的顶部到底部。
让我们来看一个例子。
PUSH操作
如果要在堆栈顶部添加一条数据,则将调用PUSH操作。 它是这样工作的:
请注意,堆栈中可能已经有数据,在这种情况下,新值将放在它们之上。 这是您在Michelson中推送新数据的方式:
PUSH value-type value
例如,如果要推送整数,则将写入PUSH int 2
,对于字符串,将写入PUSH string "Tezos"
。
迈克尔逊智能合约结构
迈克尔逊(Michelson)中的智能合约显示了一个由三部分组成的简单结构:
- 预期参数的类型。
- 存储的类型。
- 迈克尔逊代码。
这将转换为以下代码:
parameter parameter-type ;
storage storage-type ;
code {
...
}
除此结构外,在Michelson中编写智能合约时还必须牢记两个规则:
- 执行代码时,包含参数和存储器
(pair parameter storage)
总是自动推入堆栈。 请记住-如果没有参数,则使用Unit
代替。 - 代码必须始终返回包含操作列表和(更新的)存储
(pair list(operation) storage)
。 当此类对是堆栈中剩余的最后一件事时,执行将停止。
一个简单的迈克尔逊智能合约
既然我们已经了解了PUSH和Michelson中智能合约的结构,那么让我们来写一个!
对于此合同,我们将编写一个“ Hello world”合同并将一个字符串保存到存储中:
执行此代码后,将发生以下情况:
-
parameter unit
表示所传递的参数属于unit
类型(基本上,没有参数)。 -
storage string
表示合同的存储类型为string
。 -
DROP
是一种操作代码,可删除堆栈顶部的所有内容。 记住,我们之前说过,带有参数和存储空间的对在开始时会自动包含在堆栈的顶部,我们不会使用它,我们可以将其删除。 -
PUSH
将一个值带到栈顶,这里是字符串“ Hello world”。 -
NIL
是一种操作码,可在堆栈顶部添加指定类型的空列表(此处为operation
)。 -
PAIR
将两个元素放在堆栈顶部,创建一个包含这两个元素的新对,然后将其推回堆栈中。
注意:每条指令都以分号结尾(尽管最后一条指令是可选的)。
添加整数并保存结果
让我们介绍一个新操作: ADD
。 您可能已经猜到了它的作用-将两个数值加在一起。
这是一个简单的合同,演示了它是如何工作的:
让我们通过每个操作来了解堆栈中正在发生的事情:
parameter unit
:再次,我们没有使用任何参数,因此我们传递了一个单位。
storage int
:这次,我们将整数类型的值保存到存储器中。
DROP
:我们不需要初始对,所以我们可以摆脱它来为我们实际需要的值腾出空间。
PUSH int 2 ; PUSH int 3 ;
:请注意,顺序至关重要。 按下int 3
int 2
将位于堆栈的底部。 对于加法,顺序没有太大关系,但是,例如,如果您减去两个数字,则必须按正确的顺序推入它们。
ADD
工作原理与PAIR
相同。 您将前两个元素放在堆栈顶部,并从中获得一个值,然后将其推回堆栈。 ADD
将两个数字加在一起。 请注意,数字必须都是相同的数字类型(例如,您不能将整数和nat加在一起)。
NIL
:与上一个合同一样,我们将空操作列表推送到。
PAIR
:创建一个包含操作列表和新存储的对,我们需要停止执行合同。
结论
迈克尔逊语言的复杂性经常被高估。 这可能是由于这样的事实,即那里没有适合初学者的教程,并且在线提供的稀有文档非常技术性强,对于新手来说很难阅读。 这就是为什么我决定亲自学习迈克尔逊的过程,使用困难的文档来创建一系列教程,希望它们可以更容易地使用。
理解迈克尔逊是理解和欣赏Tezos区块链的独特性以及使其变得更加安全和有用的关键。
在下一部分中,我们将继续深入研究Michelson。 我们将编写一些简单的智能合约,并探索由Baking Bad团队创建的惊人的Jupyter笔记本 ,这将使我们能够编写Michelson代码并准确了解正在发生的事情。
敬请关注!
迈克尔逊干涉仪仿真程序