開發NEO智能合約的步驟流程

摘要:開發NEO智能合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼並將源碼編譯爲.avm文件)以及測試(在測試網上部署、調用、檢查結果)。這個工做流須要編譯和部署來調試任何代碼的變動。在NEO社區開發的一些最新工具集的幫助下,出現了四步流程法,從而進一步加快了開發效率。git

在本教程中,咱們將首先簡要地討論一下標準的兩步流程法,並提供一些有用的參考資料,而後介紹四步流程法以及相關的新開發的工具。除非另有說明,不然討論時使用C#做爲智能合約開發語言。docker

在本教程中,我頗有可能會犯錯誤或者遺漏一些要點,很是感謝您的評論。json

兩步流程法

傳統上來講,NEO智能合約開發有兩步開發流程:編碼和測試。這篇官方的教程提供了關於這個工做流程的詳細信息。數組

在編碼階段,NEO官方支持C#(示例)。咱們也可使用Java和Python開發智能合約。你能夠輕鬆的在Google和YouTube上找到教程和示例代碼頁,以瞭解如何編寫NEO智能合約。服務器

圖片描述

咱們依賴於測試網來進行測試工做。如上圖所示,對於測試網,咱們有不少選擇。網絡

公共測試網絡app

最多見的方法是使用公共的測試網絡。NEO智能經濟、CoZ和NEL分別維護了三個主要的公共測試網絡。Alex Guba的教程詳細闡述瞭如何在NEO和CoZ測試網絡上進行測試以前,同步區塊並申請GAS,不過NEL的測試網絡對支持本地化的中國開發者更加友好。框架

在大多數狀況下,你能夠經過NEO API(完整引用)運行RPC調用來與區塊鏈進行交互。部分APIs只有當你運行了一個具備開放錢包的NEO.CLI節點時,纔可以使用。可是若是NEO.Scan賦予了測試網權限,則能夠在不運行節點的狀況下調用相似的服務。例如,API getBalance須要一個正在運行的節點,可是你可使用Neo-Scan提供的get_balance接口來得到相似的功能。我創建了一個Postman集合來幫助測試這些遠程調用。你只需更改測試網絡(或Neo-Scan)的值便可使用它。工具

NeoCompile Eco有一個新的特殊的公共測試網絡,這激發了咱們轉向四步工做流程的靈感。咱們將在下一節詳細討論它。單元測試

私人測試網絡

另外一個好的方法是創建你本身的私人測試網絡。與公共測試網絡相比,私人測試網絡的優點在於你能夠得到徹底的控制權。使用私人測試網絡的第一個緣由是,它真的很是有用,也很鼓舞人心,由於它會讓人產生錢包中持有數百萬的NEO和GAS的錯覺。與此同時,與公共測試網絡相比,咱們不須要擔憂鏈再生,鏈接失敗,或者由於其餘開發者錯誤致使的網絡擁堵。

NEO官網提供了一個在雲服務器上設置私人網絡的逐步指南。不過查看了我在Azure上的帳單後,我不建議你這麼作,除非你不得不和其餘人共享鏈數據。Neo-privatenet-docker很是適合在本地計算機上構建私人的測試網絡,同時能夠幫你節省大量配置和執行指令的時間。若是你在筆記本電腦上運行它,它還能幫助你在加拿大的冬天保持你的體溫。

兩步流程法的侷限性

這個兩步工做流程法已經成熟,而且被大多數現有的項目所採用。然而,與傳統的軟件項目相比,它仍有一些侷限性。主要的一點是調試的代價很是高昂,要監視變量的運行時值,最好的選擇是使用運行時通知,如如下代碼段所示:

byte[] ba0 = CallSomeFunction();
byte[] ba1 = CallAnotherFunction();

//Print out the value of ba0 and ba1 to ApplicationhLog
Runtime.Notify(ba0, ba1);

咱們須要使用neon從新編譯項目,確保有足夠的GAS並進行從新部署,使用正確的格式組成適當的參數,而後調用它,並等待20-30秒的時間等待下一個區塊的出現,調用API getapplicationlog來獲取JSON格式的日誌,使用pretty format格式打印響應的內容來查找日誌值(查看如下示例中高亮的部分)。日誌值一般表示爲字節數組,所以咱們須要將它們轉換爲字符串或者大整數類型…總共7個步驟。

[
  {
    "jsonrpc": "2.0",
    "id": 5,
    "result": {
      "txid": "0x7e3f08a8af4290693184b413ba1d58bede8462cb565baba8ffcc380bf947e317",
      "executions": [
        {
          "trigger": "Application",
          "contract": "0x32682404d4313ecf80b70e1323ccf908a80fdfc0",
          "vmstate": "HALT, BREAK",
          "gas_consumed": "0.039",
          "stack": [],
          "notifications": [
            {
              "contract": "0xaeccdcf6d7ecf827e7e6baec3c233eca08c27ee3",
              "state": {
                "type": "Array",
                "value": [
                  {
                    "type": "ByteArray",
                    "value": "010203"
                  },
                  {
                    "type": "ByteArray",
                    "value": "04090d"
                  }
                ]
              }
            }
          ]
        }
      ]
    }
  }
]

官方文檔中有介紹單元測試的章節,可是其中的示例仍然須要提早編譯和/或部署.avm文件。

當咱們在開發基於NEO的區塊鏈遊戲CarryBattle時,個人團隊norchain.io強烈地感覺到了這種限制。在社區的幫助下,咱們開始嘗試4階段工做流程,這大大提升了開發效率。

四步流程法

這個工做流程的四個階段是:編輯、調試、私人測試以及Beta測試。主要的想法是:

  1. 利用一些新工具將編碼階段拆分紅編碼階段和調試階段。在調試階段,咱們儘量多地跳過或運行本地測試案例,就像傳統軟件項目那樣,而不與區塊鏈進行交互。
  2. 將測試階段拆分爲私人測試和Beta測試,分別使用privateNet / NeoCompiler
    Eco進行私人測試以及公共測試網絡進行beta測試。 使用這種方法,咱們以最小的代價確保最大程度上的靈活性和兼容性。

    圖片描述

四步工做流程法開發NEO智能合約(C#)
對於編輯和調試階段,我建議使用兩種方法:Neo-Debugger和Neunity。

Neo-Debugger

Neo-Debugger的項目是由Relfos公司開發的。使用特殊版本的Neon和調試json文件,你能夠編寫調用級別的測試用例,並在IDE中逐步運行源代碼,跟蹤GAS使用狀況和應用程序日誌,而無需與區塊鏈交互。Neo-Debugger的另外一個不錯的功能是,它能夠在檢查堆棧時跳過OpCode(操做碼)。Nikolaj- k製做過一個針對Neo-Debugger的視頻教程。

Fabio也用相似的想法作了一個不錯的項目SCTracker,可是當他知道Neo-Debugger的存在的時候,他決定跳過這個項目。但仍是要感謝他的貢獻。

Neunity.Adapter

Neo-Debugger在NeoVM級別的調試方面作得很好,可是它仍然有一些侷限性。例如,它還不支持變量監視、斷點或功能級別的測試用例。

由Norchain.io建立的框架Neunity的Adapter層正在採用了不一樣的本地調試方式。 Neunity.Adapter的思路是:

  1. 引入適配器層來隔離NeoVM和普通.Net項目之間的差別。
    咱們有兩個適配器Neunity.Adapter.NEO和Neunity.Adapter.Unity,它們具備相同的方法簽名的集合,同時具備不一樣的命名空間和實現。
    它們分別用於NEO智能合約和Unity項目(實際上也適用於許多其餘.Net項目)。
    這些方法大多數都與類型轉換,運算符或系統調用模擬有關。
  2. 而後咱們能夠在適配器層上編寫應用層邏輯。 顯然,經過簡單地更改命名空間,這個應用層邏輯能夠被智能合約或普通的.Net項目使用。
  3. 如今咱們可使用功能級別測試驅動開發(TDD),甚至能夠與C#Dapp客戶端共享邏輯。

我製做了一個視頻教程來演示如何使用Neunity.Adapter來執行功能級別的TDD,執行測試步驟,同時監視變量和調用堆棧。

圖片描述

與下表相比,咱們能夠相應看到Neo-Debugger和Neunity.Adapter的優點。根據咱們的經驗,Neo-Debugger更適合小規模項目,由於它不消耗GAS,而Neunity.Adapter更適合較大規模或更復雜的項目,由於它更好地支持TDD,多類,斷點,變量跟蹤等。

圖片描述

Neunity的設計實踐了大規模軟件的項目方法學(我指的是系統邏輯的規模,並不意味着單個調用必須複雜或者昂貴的)。經過適配器層的使用邁出了縮小.Net開發者和NEO開發者之間差距的重要的一步。與此同時,Neunity還提供了一個Neunity.Tools層,它具備靈活的序列化工具(NuSD),類HTTP的通訊協議(NuTP),類URI的存儲管理器(NuIO)等。咱們但願可以助力更多的NEO區塊鏈Dapps的落地。

私人測試

經過迭代編碼和調試階段完成邏輯後,咱們能夠轉到私人測試階段並開始與區塊鏈進行交互。咱們建議使用私人測試網絡或NeoCompiler Eco進行私人測試,由於它們的環境簡單且易於交互和管理。

NeoResearch公司開發的NeoCompiler Eco公共測試網絡是新的、特殊的。它不須要使用GAS,同時提供了一整套基於Web的GUI工具,包括編譯,導入OpCode,部署,調用,交易,轉換等.NeoResearch最近還集成了gitter.im用於即時聊天,以便更好地與開發者溝通。 Igor有一個很好的教程來介紹它的基本功能。

這個測試網絡的另外一個優勢是,區塊生成的時間間隔是5-7秒,幾乎比正常狀況快5倍。它縮短了等待時間,幾乎不會出現開發者在同一個區塊發生調用衝突的狀況,這使得測試幾乎與私人測試網絡同樣簡單。這就是爲何咱們建議將其視爲私人測試選項的緣由。

Beta測試

若是成功完成了在私人測試階段的全部功能測試,咱們就能夠進入最後的一個階段,以後就可上線Dapp。 公共測試網絡是最適合於Beta測試的地方,由於它相似於主網環境。 另外一個好處是你還能夠邀請你的朋友來幫忙測試。 你的智能合約還要能沉着地面對來自並行調用、潛在盲區或者無效輸入等的挑戰。

總結

與許多其餘公有鏈項目相比,NEO具備許多優點:諸如高交易速度,相對友好的開發語言(C#,Python),國際化且活躍的社區氛圍。

改進開發工做流程有助於提升NEO的語言優點,同時能夠將出色的想法與有生命力的項目相結合,而無需花費太多時間來解決瑣碎的問題。

本人知識有限,但願本教程能夠給你們提供些許幫助。感謝Fabio和Relfos對本教程提供的幫助。 歡迎任何建議和意見。


NEOFANS:neofans.org
NEOFANS 微博:https://www.weibo.com/neofans...
NEOFANS telegram羣:https://t.me/NEOfansCN

相關文章
相關標籤/搜索