最近一段時間,除了上班加班以外,基本上都在忙着開發 DApp,也就是所謂的去中心化應用(Decentralized Applications)啦,爲何忽然就搞起這個了呢?事情是這樣的……html
就在前不久,很偶然地瞭解到了 Loom Network 這家公司和 DApp 這個概念,而後花了兩天業餘時間(合着也就幾個小時吧)跟着 Loom 的基礎教程「Learn to Code Ethereum DApps By Building Your Own Game」學習瞭如何編寫以太坊的智能合約,以爲十分有趣,就開始關注起了 DApp 和區塊鏈智能合約開發相關的信息。前端
恰好又過了一段時間,看到了星雲(Nebulas)發佈的「星雲激勵計劃第一季」活動,就是鼓勵開發者們基於星雲鏈主網開發去中心化應用(DApp)的活動,裏面也包含了不小的獎勵。一開始我並無打算參與的,而後有一點沒一點地看了些官方文檔什麼的,而後發現好像難度並不高,並且恰好有了 idea 能夠實現,因而乎就從畫腦圖開始了第一次基於區塊鏈的去中心化應用開發之旅。git
在兩週不到的時間裏,我成功開發並提交了兩個 DApp,分別是「星雲寵物卡」和「星雲打卡」這兩款小應用,這兩個 DApp 的合約以及前端代碼均已開源在了個人 GitHub 倉庫中,但願能夠給各位一點幫助,雖然代碼寫得並不漂亮。你能夠發如今「星雲寵物卡」和「星雲打卡」這兩個項目裏,相同的功能邏輯會有些不同的處理方式,後者應該是優於前者的。github
兩個 DApp 的倉庫傳送門:web
若是這兩個小項目能給到你一點啓發,請在我開發的兩個 DApp 中使用試試,同時給個人兩個項目 Star 一個🌟瀏覽器
在這篇文章裏我不會手把手地寫一篇如何基於星雲鏈開發 DApp 的教程,我會把一些有用的資料以及踩到的坑進行記錄和整理,以方便讀者們查閱和學習。若是你對這個開發活動感興趣,歡迎使用個人邀請連接進行註冊「點我註冊」,這樣當你的應用經過官方審覈以後,我會得到 40 NAS 的獎勵,而你除了得到審覈經過以後的 100 NAS 獎勵外還會額外得到 10 NAS(僅經過個人邀請連接註冊且經過應用審覈)的獎勵。安全
在你即將開始開發以前,個人建議是先看一下官方博客發佈的幾篇文章,這些文章我會在後文中的「開發教程」下列出。除了看官方教程學習以外,你還應該準備好開發相關的工具,其中最重要的就是「星雲 Web 錢包」了,由於它是用來建立錢包、部署合約、執行合約函數進行調試的工具。app
開發的基本流程能夠大體分爲「編寫合約」——「部署合約」——「測試合約」——「編寫前端頁面」——「修改合約」這五個步驟。ide
在編寫合約以前,請大體過一遍星雲的「智能合約」相關 API,以便更好地熟悉相關接口進行合約的編寫,合約的編寫難度不高,須要注意的是,在合約中和轉帳數值相關的,都是使用的基本單位 Wei,而且都是整數,不少人會以 NAS 做爲單位編寫相關邏輯致使出現一些錯誤。函數
合約編寫完成以後,使用 Web 錢包,將右上角的「Mainnet」改成「Testnet」,而後選擇「合約」——「部署」將你的合約部署到測試網中進行測試,部署合約須要花費必定的 Gas,你能夠在官網領取測試用的 NAS 到你的錢包中用於部署測試。
在你要編寫前端頁面和你部署的合約進行交互前,你可能會用到如下兩個庫:
這兩個庫分別是對星雲 API 的封裝以及專門用於發起交易的庫,其中後者能夠和瀏覽器錢包插件進行交互,能夠喚起錢包發起交易等。
關於 nebPay.js 和瀏覽器錢包插件的交互,這裏給你們劃一個重點,要好好看一下瀏覽器錢包插件的例子,特別是「這一個例子」裏的第 85 ~ 97 行,getAccount
這個方法是用於直接從錢包插件中獲取當前用戶的,由於當時沒有好好看例子,不知道有這個方法,因而乎在我開發的第一個應用時就用了個蹩腳的實現方式,就是在合約中編寫一個 getAccount
的方法,而後在須要直接獲取用戶當前錢包插件中解鎖的錢包地址時,經過 nebPay.js 的 simulateCall
方法模擬調用,從而獲取到當前用戶的地址。這個教訓告訴咱們,要好好地看文檔和例子!
若是你的合約中有一些管理員專屬的管理用接口,建議不要將管理員的地址硬編碼在合約中,這是爲了應對錢包私鑰泄露的意外狀況下在出問題前將管理員地址及時修改,保證合約和相關內容的安全,推薦的作法是定義一個管理員地址的屬性 superuserAddress
在合約中,而後再定義一個修改管理員地址的函數 setSuperuser
:
var YourContract = function () { LocalContractStorage.defineProperties(this, { superuserAddress: null, otherProperty: null }); }; YourContract.prototype = { init: function () { this.superuserAddress = Blockchain.transaction.from; this.otherProperty = 'xxx'; }, setSuperuser: function(address) { if (Blockchain.transaction.from === this.superuserAddress) { this.superuserAddress = address; } else { throw new Error("Permission Denied"); } } }; module.exports = YourContract;
合約開發中不免會趕上須要轉入和轉出代幣的需求,在這種時候尤爲要注意作好相關的記錄和判斷,一個用戶往合約中轉入多少代幣,知足何種條件後他能夠從中取走多少代幣,在合約中都應該有相關的屬性去記錄,以及在轉出時判斷轉出的金額是不是其所應得的,不然會出現用戶盜刷合約中的代幣的狀況,請緊緊地記住一條編碼原則:永遠不要相信用戶的輸入。
另外要提醒你們,若是你的應用有轉帳到合約中去的相關功能,請務必必定要留一個轉出的方法,防止出現轉入的代幣沒法取出的狀況出現。
這裏暫時先寫這麼多,若是你有什麼疑惑,歡迎留言,我將會傾囊相授,知無不言。最後再多說一句,請必定好仔細翻看官方文檔和例子,但願各位可以開發出優秀的應用拿到大獎😆