NEO 智慧合約基礎知識

買賣虛擬貨幣
智慧合約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議。區塊鏈技術給我們帶來了一個去中心化的,不可篡改的,高可靠性的系統,在這種環境下,智慧合約才大有用武之地。智慧合約是區塊鏈最重要的特性之一,也是區塊鏈能夠被稱為顛覆性技術的主要原因。NEO 智慧合約有哪些特點NEO 智慧合約 2.0包括以下特性:確定性、高效能、拓展性。其合約型別包括:驗證合約、函式合約和應用合約。從效能角度來說,NEO 採用了輕量級的 NeoVM(NEO Virtual Machine)作為其智慧合約的執行環境,其啟動速度非常快,佔用資源也很小,適合像智慧合約這樣短小的程式。透過 JIT(即時編譯器)技術對熱點智慧合約進行靜態編譯和快取可以顯著提升。NEO 虛擬機器的指令集中內建提供了一系列的密碼學指令,以最佳化智慧合約中用到密碼學演算法時的執行效率。此外,資料操作指令直接對陣列及複雜資料結構提供支援。這些都會提升 NEO 智慧合約 2.0的執行效能。NEO 智慧合約 2.0實現可拓展性的方法是透過高併發和動態分割槽的形式,結合其低耦合的設計完成的。低耦合合約程式在一個虛擬機器(NEO 虛擬機器)中執行,並透過互動服務層與外部通訊。因此,對智慧合約功能的絕大部分升級,都可以透過增加互動服務層的 API 來實現。用什麼語言編寫智慧合約
從語言角度看 NEO 智慧合約 2.0與以太坊的區別更為直觀:與以太坊原創的 Solidity 語言不同,NEO 智慧合約開發者可以直接使用幾乎任何他們擅長的高階語言來進行 NEO 智慧合約的開發工作。NEO 提供了這些語言的編譯器和外掛,用於將高階語言編譯成 NEO 虛擬機器所支援的指令集。由於編譯器會針對 MSIL(微軟中間語言)來進行編譯,所以理論上任何.Net 中的語言或者可被轉譯成 MSIL 的語言都可以直接支援。當前已經支援的語言有:· C#、VB.Net、F#· Java、Kotlin· Python未來計劃陸續加入的高階語言還包括:
· C、C++、GO· JavaScript多種高階語言的支援,使得 90% 以上的開發者無需學習新的語言即可參與到 NEO 智慧合約的開發中來,甚至可將現有業務系統中的程式碼直接移植到區塊鏈上。這將大大增加未來區塊鏈的全面普及。最後從除錯角度看,通常智慧合約的開發過程是非常困難的,重要的原因之一是此前的智慧合約缺乏良好的除錯和測試方法。NEO 在 NeoVM 層面提供了程式除錯功能的支援,使得開發 NEO 智慧合約 2.0變得更方便快捷。智慧合約的觸發NEO 的智慧合約有兩種觸發方式:
· 合約使用者的鑑權:智慧合約作為一個合約賬戶,當使用者使用該合約賬戶裡的一筆資產時,會觸發該智慧合約。· 手動傳送交易呼叫智慧合約:使用者傳送一筆交易(Invocation Transaction )來觸發一段智慧合約的執行。一個合約可以同時由以上兩種方式觸發。由於鑑權觸發的合約是UTXO模型的鑑證過程,是在交易被寫入區塊之前執行。如果合約返回false或者發生異常,則交易不會被寫入區塊。而由交易呼叫觸發的合約,它的呼叫時機是交易被寫入區塊以後,此時無論應用合約返回為何以及是否失敗,交易都已經發生,無法影響交易中的 UTXO 資產狀態。NeoVM 虛擬機器NeoVM 是執行 NEO 智慧合約程式碼的虛擬機器。這裡所講述的虛擬機器概念比較狹義,並非是藉助於作業系統對物理機器的一種模擬,這裡的虛擬機器與 vmware 或者 Hyper-V 不同,是針對具體語言所實現的虛擬機器。
例如在 java 的 JVM 或者 .Net 的 CLR 中,java 或者 .Net 原始碼會被編譯成相關位元組碼,然後在對應虛擬機器上執行, JVM 或 CLR 會對這些位元組碼進行取指令,譯碼,執行,結果回寫等操作,這些步驟和真實物理機器上的概念都很相似。相對應的二進位制指令仍然是在物理機器上執行,物理機器從記憶體中取指令,透過匯流排傳輸到 CPU,然後譯碼、執行、結果儲存。

虛擬機器架構

上圖是 NEO 虛擬機器(NeoVM)的系統架構圖,其中虛線框中的部署是虛擬機器的核心。

執行引擎

左側綠色的是虛擬機器執行引擎(相當於 CPU),它可以執行常見的指令,例如流程控制、棧操作、位操作、算數運算、邏輯運算、密碼學方法等,還可以透過系統呼叫,與互操作服務層(下文會介紹)進行互動。

計算棧

中間灰色的部分是虛擬機器的計算棧(相當於記憶體),如今虛擬機器的實現方式有兩種,基於棧的和基於暫存器的,這兩種實現方式各有優劣,也都有標誌性的產品。基於棧的虛擬機器,有 JVM,CPython 以及 .Net CLR。基於暫存器的,有 Dalvik 以及 Lua5.0。基於棧的虛擬機器有一個計算棧的概念,虛擬機器在進行真正的運算時都是直接與計算棧(Evaluation Stack)進行互動。

由於執行時預設都是從運算元棧上取資料,那麼就無需指定運算元。例如,x86 彙編 ”ADD EAX, EBX”,就需要指定這次運算需要從什麼地方取運算元,執行完結果存放在何處。但是基於棧的虛擬機器的指令就無需指定,例如加法操作就一個簡單的 ”Add” 就可以了,因為預設運算元存放在運算元棧上,直接從運算元棧上 pop 出兩條資料直接執行加法運算,運算後的結果預設存放在棧頂。

互操作服務層

右側藍色的部分是虛擬機器的互操作服務層(相當於外設)。目前互操作服務層提供了智慧合約所能訪問區塊鏈資料的一些 API,利用這些 API,可以訪問區塊資訊、交易資訊、合約資訊、資產資訊等。

除此之外互操作服務層還為每個合約提供了一個持久化儲存區的功能。NEO 的每個智慧合約在建立的時候都可選地啟用一個私有儲存區,儲存區是 key-value 形式的,NEO 智慧合約由合約的被呼叫者決定持久化儲存區的上下文,而非呼叫者來決定。當然,呼叫者需要將自己的儲存上下文傳給被呼叫者(即完成授權)後,被呼叫者才可以執行讀寫操作。


收費模式

NEO 智慧合約在部署或者執行的時候都要繳納一定的手續費,分為部署費用和執行費用。

部署費用是指開發者將一個智慧合約部署到區塊鏈上需要向區塊鏈系統支付一定的費用(目前是 500 Gas)。

執行費用是指每執行一條智慧合約的指令都會向 NEO 系統支付一定的執行費用。

一些簡單的智慧合約

下面是一些簡單的智慧合約:

public static bool Main()
{
    return true;
}

該合約的返回值永遠為 true,表示任何人都可以花費這個合約地址裡的資產(可以理解為撒錢)。

NEO 錢包客戶端有刪除資產功能,當你刪除了一個資產,這個資產實際上傳送到了一個指定地址中,這個地址就是上述智慧合約所生成的合約地址,任何人都可以花費這個地址裡的資產,當然這個地址裡的資產都是別人不想要的資產。

public static bool Main()
{
    return false;
}

該合約的返回值永遠為 false,表示這個合約裡的資產無人能使用(可以理解為燒錢或銷燬一筆資產),比如裡面可以儲存一些已登出的公司的股權。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;