摘要:開發NEO智慧合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼並將原始碼編譯為.avm檔案)以及測試(在測試網上部署、呼叫、檢查結果)。這個工作流需要編譯和部署來除錯任何程式碼的變更。在NEO社群開發的一些最新工具集的幫助下,出現了四步工作流程法,從而進一步加快了開發效率。
在本教程中,我們將首先簡要地討論一下標準的兩步工作流程法,並提供一些有用的參考資料,然後介紹四步工作流程法以及相關的新開發的工具。除非另有說明,否則討論時使用C#作為智慧合約開發語言。
在本教程中,我很有可能會犯錯誤或者遺漏一些要點,非常感謝您的評論。
兩步流程法
傳統上來說,NEO智慧合約開發有兩步開發流程:編碼和測試。這篇官方的教程提供了關於這個工作流程的詳細資訊。
在編碼階段,NEO官方支援C#(示例)。我們也可以使用Java和Python開發智慧合約。你可以輕鬆的在Google和YouTube上找到教程和示例內碼表,以瞭解如何編寫NEO智慧合約。
我們依賴於測試網來進行測試工作。如上圖所示,對於測試網,我們有很多選擇。
公共測試網路
最常見的方法是使用公共的測試網路。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測試。主要的想法是:
- 利用一些新工具將編碼階段拆分成編碼階段和除錯階段。在除錯階段,我們儘可能多地跳過或執行本地測試案例,就像傳統軟體專案那樣,而不與區塊鏈進行互動。
- 將測試階段拆分為私人測試和Beta測試,分別使用privateNet / NeoCompiler Eco進行私人測試以及公共測試網路進行beta測試。 使用這種方法,我們以最小的代價確保最大程度上的靈活性和相容性。
對於編輯和除錯階段,我建議使用兩種方法: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的思路是:
- 引入介面卡層來隔離NeoVM和普通.Net專案之間的差異。 我們有兩個介面卡Neunity.Adapter.NEO和Neunity.Adapter.Unity,它們具有相同的方法簽名的集合,同時具有不同的名稱空間和實現。 它們分別用於NEO智慧合約和Unity專案(實際上也適用於許多其他.Net專案)。 這些方法大多數都與型別轉換,運算子或系統呼叫模擬有關。
- 然後我們可以在介面卡層上編寫應用層邏輯。 顯然,通過簡單地更改名稱空間,這個應用層邏輯可以被智慧合約或普通的.Net專案使用。
- 現在我們可以使用功能級別測試驅動開發(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對本教程提供的幫助。 歡迎任何建議和意見。
翻譯:包子