手把手教你使用Michelso編寫智慧合約

原文作者 | Claude Barde
譯者 |天道酬勤,責編 | 晉兆雨

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程式碼,並準確了解正在發生了什麼。

相關文章

離岸密碼的未來:概述

離岸密碼的未來:概述

加密貨幣和離岸的未來 區塊鏈在發展,數位貨幣也正在發展,有人說,它有望重塑全球經濟基礎設施,從而不僅使交換商品的媒介發生革命性變化, 也可能...

這一週,全世界都興奮麻了

這一週,全世界都興奮麻了

大模型的技術能力,和它影響世界的能力,都在光速進化。 作者 | Founder Park 真是瘋狂的一週。 GPT-4、Microsoft ...