手把手教你用NeoRay開發智慧合約

買賣虛擬貨幣
作為專為 Neo 關注者打造的影片欄目,Neo Talk 將邀請來自 Neo 團隊或 Neo 生態中的各位小哥哥小姐姐,透過影片為大家帶來 Neo 入門開發指南、科普最新 Neo 技術知識點、以及分享各類有趣的生態專案。本期重點第二期 Neo Talk,我們邀請到了來自 NEL 社羣的開發者 印煒,詳細介紹了什麼是智慧合約、Neo 上智慧合約的特性,並線上演示瞭如何使用 NeoRay 開發除錯智慧合約。希望對區塊鏈開發有興趣的技術愛好者們,可以透過本期影片學習使用 NeoRay,開啟新世界的大門。本期內容可以大致分為兩個部分:Neo 上的智慧合約
- 智慧合約 VS 傳統合約- Neo 上智慧合約的執行邏輯- Neo3 關於合約部分的改動透過 NeoRay 開發除錯智慧合約- NEP5 合約介紹- 詳解線上合約開發工具 NeoRay
- 教程演示智慧合約智慧合約這個概念其實在 20 世紀 90 年代就已經誕生,但遲遲沒有具體被應用,很重要的原因就是缺乏能夠支援可程式設計合約的數字系統和技術。

但區塊鏈的出現解決了這個問題。它不僅可以支援程式設計合約,而且具有去中心化、不可篡改、過程透明可追蹤等優點,天然適合智慧合約。因此,智慧合約有了飛速的發展。那麼智慧合約是什麼,就先要對照著傳統合約來看。

傳統協議是指雙方透過協議來進行價值物互換,雙方之間需要信任才能讓交易順利地進行下去。一旦一方違背了協議內容,另一方就會面臨利益的損失。所以一般協議的簽訂都需要一個強有力的第三方來監督或者擔保,確保協議裡的條款能夠正常執行下去。而第三方的介入一方面會帶來一個成本的增加,另一方面第三方在處理違約的的過程也是耗時耗力耗材的。

舉一個比較普遍的例子,網購。在網上買東西會遇到一個很現實的問題,先發貨還是先打款。如果先發貨但是使用者沒有付錢怎麼辦,又或是買家付了錢但是店家不發貨怎麼辦。所以這個購買協議就存在較高的風險。因此,買賣雙方就需要類似支付寶這樣的第三方來做一個擔保。但支付寶的擔保也不是與生俱來就免費的,他無形中提高了這次買賣的成本。

什麼是「智慧合約」

智慧合約本質上也是一份提前訂好的協議。之所以有智慧這個頭銜,是因為智慧合約的條款是以程式碼的形式儲存在區塊鏈上。當滿足條款的執行條件時,程式碼會強制執行,完全自動且無法干預。能夠有效地減少傳統協議中第三方所帶來的的監督和執行成本。

智慧合約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議。因此,智慧合約對比傳統合約來看,合約內容不可以篡改,減少了人為的干預,可以十分準確地執行合約。不需要第三方的參與,節約成本且效率很高。

這是智慧合約的一個執行流程,我們預先制定好一些規則和觸發條件,將他們編寫成程式碼,並部署上鍊。如果滿足了某些條件,就會去觸發相應的規則,產生結果並記錄在鏈上。整個過程是公開透明可追溯的。

Neo 上的智慧合約

Neo 上的智慧合約,將分為三部分來介紹。第一部分是智慧合約的入口函式和輸入引數,第二部分是合約的觸發器,第三部分是 Neo3 關於合約相關的改動。

● 入口函式

首先我們先介紹入口函式。這個是 Neo 智慧合約的一個簡單事例。就是往儲存區寫入一個 hello world。我們透過呼叫合約的 main 方法,傳入引數來實現功能。這個 main 函式就是合約的入口函式。

需要注意的是,在 Neo 智慧合約裡只有唯一一個入口函式,就是 main 函式。你在智慧合約中寫的其他方法,無論定義公有還是私有,外部都不能直接呼叫。

如果合約相對複雜一點,需要呼叫合約內的其他方法應該怎麼去處理呢。這裡我們可以透過傳入的引數來區別呼叫不同的方法,就像圖中顯示的一樣,透過判斷不同 operation 的值,來呼叫 get 方法或者是呼叫 put 方法。Object array 中包含了各個方法所需要的引數。這樣就能夠做到呼叫同一個入口函式方法,來實現不同的功能。

當然,這裡的傳入引數並不限制於(string,object【】)這種形式。你可以定義任意的傳入格式,只是為了格式的統一,強烈介意你寫的合約都採用這一種格式。

● 觸發器

Neo 智慧合約中的觸發器,總共有四種型別:系統觸發器、驗證觸發器、應用觸發器和全面觸發器(包含前面三種)。常用的是驗證觸發器和應用觸發器。

以上兩種常用的觸發器型別決定了 Neo 智慧合約的兩種觸發方式:

驗證觸發器,表明該合約被當作一個驗證函式而呼叫,此驗證函式可以接收多個引數並且返回一個布林值來表明所驗證交易或區塊的有效性。比如合約使用者的鑑權:智慧合約作為一個合約賬戶,當使用者使用該合約賬戶裡的一筆資產時,會觸發該智慧合約驗證使用者的有效性。

應用觸發器,表明該合約被當作一個應用函式而呼叫,此應用函式可以接收多個引數,可以改變區塊鏈狀態並且返回任意型別的值。比如手動傳送交易呼叫智慧合約:使用者傳送一筆交易來觸發一段智慧合約的執行。

一個合約可以同時由以上兩種方式觸發。由於驗證觸發的合約是在交易被寫入區塊之前執行。如果合約返回 false 或者發生異常,則交易不會被寫入區塊。而由交易呼叫觸發的合約,它的呼叫時機是交易被寫入區塊以後,此時無論應用合約返回為何以及是否失敗,交易都已經發生。

● Neo3 的改動

相比 Neo2,Neo3 在智慧合約部分有很多的修改。Neo3 加入了原生合約的概念。原先 Neo2 有兩種性質的資產,一種是 UTXO 模型的全域性資產,例如 Neo 的原生資產 NEO 和 GAS 都是全域性資產。第二種就是 合約資產 NEP5 資產。在 Neo3 版本里,精簡了架構,刪除了全域性資產,只留下了合約資產。並且,NEO 和 GAS 作為原生合約寫在了區塊裡。

在 Neo3 上,引入了合約許可權控制機制,賦予了開發者更加精細的控制力度,劃分為兩類:

Call 級別

內部合約在呼叫其他合約時,尤其是第三方提供的服務合約,可以對其加許可權控制,限制其訪問級別,如不允許修改狀態,防止潛藏的第三方合約攻擊漏洞等。

Manifest 級別

部署合約的時候,可以配置合約只允許被那些合約訪問,以及訪問什麼方法。防止惡意使用者透過其他合約繞過許可權檢查。

我們推薦使用者在設定合約許可權時,儘量嚴進寬出,後續涉及到許可權變更時,可透過升級合約配置檔案,來動態更改合約許可權。

內部新增了合約計數器,給每個合約賦予 ID 編號,並用其繫結合約的資料儲存區域,當合約升級時,只需要保留該合約 ID,實現了一種無須資料遷移就能完成合約的新升級方式。

利用 NeoRay 開發編譯智慧合約

這裡我們分為兩個部分。第一個部分,我們先來了解 Neo 上比較經典和普遍的一種合約,叫做 NEP5 合約。第二部分,我們學習一下如何在 NeoRay 上編寫、釋出、呼叫並除錯合約。

首先,我們先來了解一下 NEP5 合約。那 NEP5 是什麼意思呢,這個需要拆開解釋。NEP 是“Neo 改進協議”的英文縮寫,“5” 則是大家一致同意的修訂版本,同時也是 Neo 平臺改進版本編號。這次修訂新增了對基於 Neo 平臺虛擬代幣的支援,與以太坊之前的做法類似。它管理的是代幣應該實現的關鍵功能,這些功能可以在網路內使用。例如,任何基於 Neo 的代幣都應該是 NEP5 代幣,這樣才能與其他交易方或在交易所進行交易,此外還有餘額查詢、代幣批准、轉賬等必要功能。當然代幣合約除了要實現最基礎的 NEP5 規定的方法和事件之外,還可以自己按照需求拓展一些方法,例如代幣的發行方式或者銷燬方式等。

免責聲明:

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

推荐阅读

;