摘要:開發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測試。主要的想法是:
四步工做流程法開發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的思路是:
我製做了一個視頻教程來演示如何使用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