手把手教你使用Michelso编写智能合约
Favorite
Share
Scan with WeChat
Share with Friends or Moments
Michelson入门:Tezos的脚本语言
Michelson肯定是目前智能合约中最令人兴奋的编程语言之一。它是一种基于堆栈的严格类型化语言,编写智能合约可以确保Tezos区块链的安全。Michelson可以和以太坊智能合约的字节码相媲美,但它更具可读性,更安全,更强大。用来为Tezos编写智能合约的所有高级语言——比如SmartPy、Ligo或Lorentz——最终都可以编译成Michelson。
在这第一篇文章中,我们将尝试使用Michelson语言,理解“基于堆栈”的含义,并编写一些非常简单的智能合约。本文主要是为编程或者Tezos开发的初学者编写的,但是想要更多地了解Michelson的中级程序员也可以在这里找到有用的信息。我们将使用Baking Bad开发的Jupyter内核,在Jupyter笔记本中编写Michelson代码。如果你想了解代码的工作原理,可以在每个部分中找到一个链接。
让我们写一些代码。
堆栈
要理解Michelson是如何工作的,堆栈是需要正确理解的主要概念之一。每一份Michelson合约都是相互遵循的指令清单。这些指令以准确的顺序排列,并按照写入的顺序执行。
每条指令都会以某种方式操纵堆栈。把它想象成一堆数据。你编写的指令将对堆中的数据产生影响。例如,你可以将堆上两段数据相加,删除顶部的数据,将另一段数据放在顶部,传输一些令牌,等等。该堆栈以后进先出的方式工作 :如果要访问不在堆栈顶部的数据,必须先处理它上面的数据。
使用Michelson进行编码时,你必须记住的三个主要概念:
新数据放在堆栈的顶部。
只有当堆栈中的数据位于堆栈顶部(或某些操作中位于第二个位置,如下所述)时,才可以访问堆栈中的数据。
数据处理的顺序是从堆栈的顶部到底部。
让我们看一个例子。
PUSH操作
如果你要在堆栈顶部添加一条数据,你将调用PUSH操作。它是这样工作的:
此时需要注意的是,堆栈中可能已经有数据,在这种情况下,新值会放在它们之上。这是你在Michelson中推送新数据的方式:
PUSH value-type value
例如,如果要推送一个整数,你会写PUSH int 2,对于一个字符串,你会写PUSH string “ Tezos”。
Michelson智能合约结构
Michelson中的智能合约展现了一个由三部分组成的简单结构:
· 预期参数的类型。
· 存储的类型。
· Michelson代码。
转换成代码表示如下:
parameter parameter-type ;
storage storage-type ;
code {
...
}
除此结构外,在Michelson中编写智能合约时,你还必须牢记两条规则:
1、在执行代码时,自动将包含参数和存储器的对推入堆栈中。需要记住的是——如果没有参数,就用单位代替。
2、代码必须始终返回一对,它包含操作列表和(更新的)存储(对列表(操作)存储)。当堆栈中只剩下此类对时,执行就会停止。
一个简单的Michelso智能合约
现在我们已经了解了PUSH以及Michelson中智能合约的结构,让我们来写一个。
对于这个合约,我们将写一个“ Hello world”合约,并将一个字符串保存到存储中:
执行这段代码后,会发生以下情况:
1、参数unit表示所传递的参数为unit类型(基本上是无参数)。
2、storage string表示合同的存储类型为string。
3、DROP是一种操作代码,用于删除堆栈顶部的任何内容。我们之前说过,一个带有参数和存储空间的对在开始时会自动包含在栈顶,我们不打算使用它,可以将其删除。
4、PUSH将一个值放到栈顶,这里是字符串“ Hello world”。
5、NIL是一种操作码,它将指定类型的空列表(此处操作)添加到堆栈的顶部。
6、PAIR将两个元素放在堆栈顶部,创建一个包含这两个元素的新对,然后将其推回堆栈中。
注意:每条指令都以分号结尾(最后一条指令是可选的)。
添加整数并保存结果
让我们介绍一个新操作:ADD。你可能已经猜到了它的作用——将两个数值相加。
这有一个简单的合约,演示了它是如何工作的:
让我们看一下每个操作,了解堆栈内部发生了什么:
参数unit:同样,我们没有使用任何参数,因此我们传递一个单位。
storage int:这一次,我们将整数类型的值保存到存储器中。
DROP:我们不需要初始对,所以我们可以删除它,为我们实际需要的值腾出空间。
PUSH int 2; PUSH int 3;:这里需要注意一下这个顺序,它非常重要。推入int 3后,int 2就会位于堆栈的底部。在加法的情况下,顺序并不太重要,但如果你要做减法,必须将它们按正确的顺序推入。
ADD和PAIR的原理是一样的。你取堆栈顶部的前两个元素,并从中获得一个值,然后将其推回堆栈。ADD将两个数字相加。需要注意的是,这些数字必须都是相同的数字类型(例如,你不能将integer和nat加在一起)。
NIL:和以前的合同一样,我们将空的操作列表推入。
PAIR:创建一个对,包含操作列表和我们需要停止执行合同的新存储。
结论
Michelson语言的复杂性往往被高估了。这可能是由于目前没有适合初学者的教程,并且在线提供的文档技术性很强,对于新手来说也很难阅读。这就是为什么我决定亲自经历学习Michelson的过程,使用困难的文档来创建一系列教程,我希望这些教程更容易理解使用。
理解和欣赏Tezos区块链的独特性,以及使其变得更加安全和有用,关键是要理解Michelson。
在下一部分中,我们将继续深入研究Michelson。我们将编写一些简单的智能合约,探索由Baking Bad团队创建的令人惊叹的Jupyter笔记本,它使我们能够编写Michelson代码,并准确了解正在发生了什么。
Michelson肯定是目前智能合约中最令人兴奋的编程语言之一。它是一种基于堆栈的严格类型化语言,编写智能合约可以确保Tezos区块链的安全。Michelson可以和以太坊智能合约的字节码相媲美,但它更具可读性,更安全,更强大。用来为Tezos编写智能合约的所有高级语言——比如SmartPy、Ligo或Lorentz——最终都可以编译成Michelson。
在这第一篇文章中,我们将尝试使用Michelson语言,理解“基于堆栈”的含义,并编写一些非常简单的智能合约。本文主要是为编程或者Tezos开发的初学者编写的,但是想要更多地了解Michelson的中级程序员也可以在这里找到有用的信息。我们将使用Baking Bad开发的Jupyter内核,在Jupyter笔记本中编写Michelson代码。如果你想了解代码的工作原理,可以在每个部分中找到一个链接。
让我们写一些代码。
堆栈
要理解Michelson是如何工作的,堆栈是需要正确理解的主要概念之一。每一份Michelson合约都是相互遵循的指令清单。这些指令以准确的顺序排列,并按照写入的顺序执行。
每条指令都会以某种方式操纵堆栈。把它想象成一堆数据。你编写的指令将对堆中的数据产生影响。例如,你可以将堆上两段数据相加,删除顶部的数据,将另一段数据放在顶部,传输一些令牌,等等。该堆栈以后进先出的方式工作 :如果要访问不在堆栈顶部的数据,必须先处理它上面的数据。
使用Michelson进行编码时,你必须记住的三个主要概念:
新数据放在堆栈的顶部。
只有当堆栈中的数据位于堆栈顶部(或某些操作中位于第二个位置,如下所述)时,才可以访问堆栈中的数据。
数据处理的顺序是从堆栈的顶部到底部。
让我们看一个例子。
PUSH操作
如果你要在堆栈顶部添加一条数据,你将调用PUSH操作。它是这样工作的:
此时需要注意的是,堆栈中可能已经有数据,在这种情况下,新值会放在它们之上。这是你在Michelson中推送新数据的方式:
PUSH value-type value
例如,如果要推送一个整数,你会写PUSH int 2,对于一个字符串,你会写PUSH string “ Tezos”。
Michelson智能合约结构
Michelson中的智能合约展现了一个由三部分组成的简单结构:
· 预期参数的类型。
· 存储的类型。
· Michelson代码。
转换成代码表示如下:
parameter parameter-type ;
storage storage-type ;
code {
...
}
除此结构外,在Michelson中编写智能合约时,你还必须牢记两条规则:
1、在执行代码时,自动将包含参数和存储器的对推入堆栈中。需要记住的是——如果没有参数,就用单位代替。
2、代码必须始终返回一对,它包含操作列表和(更新的)存储(对列表(操作)存储)。当堆栈中只剩下此类对时,执行就会停止。
一个简单的Michelso智能合约
现在我们已经了解了PUSH以及Michelson中智能合约的结构,让我们来写一个。
对于这个合约,我们将写一个“ Hello world”合约,并将一个字符串保存到存储中:
执行这段代码后,会发生以下情况:
1、参数unit表示所传递的参数为unit类型(基本上是无参数)。
2、storage string表示合同的存储类型为string。
3、DROP是一种操作代码,用于删除堆栈顶部的任何内容。我们之前说过,一个带有参数和存储空间的对在开始时会自动包含在栈顶,我们不打算使用它,可以将其删除。
4、PUSH将一个值放到栈顶,这里是字符串“ Hello world”。
5、NIL是一种操作码,它将指定类型的空列表(此处操作)添加到堆栈的顶部。
6、PAIR将两个元素放在堆栈顶部,创建一个包含这两个元素的新对,然后将其推回堆栈中。
注意:每条指令都以分号结尾(最后一条指令是可选的)。
添加整数并保存结果
让我们介绍一个新操作:ADD。你可能已经猜到了它的作用——将两个数值相加。
这有一个简单的合约,演示了它是如何工作的:
让我们看一下每个操作,了解堆栈内部发生了什么:
参数unit:同样,我们没有使用任何参数,因此我们传递一个单位。
storage int:这一次,我们将整数类型的值保存到存储器中。
DROP:我们不需要初始对,所以我们可以删除它,为我们实际需要的值腾出空间。
PUSH int 2; PUSH int 3;:这里需要注意一下这个顺序,它非常重要。推入int 3后,int 2就会位于堆栈的底部。在加法的情况下,顺序并不太重要,但如果你要做减法,必须将它们按正确的顺序推入。
ADD和PAIR的原理是一样的。你取堆栈顶部的前两个元素,并从中获得一个值,然后将其推回堆栈。ADD将两个数字相加。需要注意的是,这些数字必须都是相同的数字类型(例如,你不能将integer和nat加在一起)。
NIL:和以前的合同一样,我们将空的操作列表推入。
PAIR:创建一个对,包含操作列表和我们需要停止执行合同的新存储。
结论
Michelson语言的复杂性往往被高估了。这可能是由于目前没有适合初学者的教程,并且在线提供的文档技术性很强,对于新手来说也很难阅读。这就是为什么我决定亲自经历学习Michelson的过程,使用困难的文档来创建一系列教程,我希望这些教程更容易理解使用。
理解和欣赏Tezos区块链的独特性,以及使其变得更加安全和有用,关键是要理解Michelson。
在下一部分中,我们将继续深入研究Michelson。我们将编写一些简单的智能合约,探索由Baking Bad团队创建的令人惊叹的Jupyter笔记本,它使我们能够编写Michelson代码,并准确了解正在发生了什么。
Disclaimer: This article is copyrighted by the original author and does not represent MyToken’s views and positions. If you have any questions regarding content or copyright, please contact us.(www.mytokencap.com)contact
About MyToken:https://www.mytokencap.com/aboutusArticle Link:https://www.mytokencap.com/news/151820
Previous:FISCO BCOS上使用第三方CA证书底层节点部署实操
Next:被DeFi吞噬的以太坊
Related Reading


Crypto Market News: One Final Dip Before Altseason Explosion, Analyst Predicts
The post Crypto Market News: One Final Dip Before Altseason Explosion, Analyst Predicts appeared fir...
Ethereum Approaches Key Resistance as Momentum Signals Potential Short-Term Reversal
Ethereum ($ETH) nears resistance with slowing momentum while traders monitor signs of a possible tre...
Will Crypto Pump or Dump This Weekend? Analyst Reveals Top Altcoin For 3x Gains
The post Will Crypto Pump or Dump This Weekend? Analyst Reveals Top Altcoin For 3x Gains appeared fi...