比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 火星幣 > Info

DApp:開發一條龍 測試一條蟲?_DAPP

Author:

Time:1900/1/1 0:00:00

2017年,這一年有點特別,許多先進的技術和新的概念集中在這一年迸發。小程序火了、新零售火了、區塊鏈火了、人工智能火了、物聯網也火了。

它們有的是首次面世,也有的是早已默默發展了很久,等待一個契機走向大眾。

而這當中出現過一個讓人印象深刻的小插曲:

這個回答曾經在網絡上紅極一時,在開懷大笑的同時也不禁發人深思:新的技術若無法落到具體的應用場景解決問題,終究還是紙上談兵。

區塊鏈技術更是如此。雖說目前區塊鏈的一些技術瓶頸還有待突破,但開發者們應該積極去探索、多嘗試,尤其是在應用方面。其中開發DApp就是一個很好的選擇。

不得不提的是,在開發DApp時,大部分開發者都會把重心放在開發的過程中,但實際上,還有同樣值得開發者們注意的重要一環:測試。

接下來,我們就以抽獎合約為例,從抽獎合約的整個測試流程代碼來講解如何對合約與接口進行測試。

做好準備,又要開始我們的干貨時間了。

加密貓開發團隊Dapper Labs與Libra項目建立合作以共享專有技術:加密貓(CryptoKitties)開發團隊Dapper Labs已透露與Facebook的Libra穩定幣項目建立了合作伙伴關系,以共享專有技術。Dapper Labs的CTO Dieter Shirley表示,Dapper的Flow區塊鏈將采用Libra的Move作為其虛擬機(VM),而Libra將利用Dapper的智能合約編程語言Cadence。(Cointelegraph)[2020/4/14]

測試準備

首先我們來看一下項目中,test目錄中文件結構,lib目錄中存放了方便測試調用的封裝函數,以base命名,而test根目錄的cctime文件包含了主要的測試用例。編寫測試用例之前,我們先熟悉一下base文件中的函數,這些函數作為測試工具提供給測試用例調用,封裝了合約和訪問接口代碼。1、初始化函數編寫測試用例之前,需要將常用的方法抽離封裝,放入base文件中,這里我們使用了supertest和chai作為主要的測試框架,大家可以在源碼文件中找到測試文件中的聲明。以下是初始化相關的函數:

分析 | 過去24小時EOS Dapp活躍用戶89361:據DappReview數據,今日dapp新增6個,過去24小時EOS Dapp活躍用戶89361,交易額534.3萬EOS/1.35億元;Tron Dapp活躍用戶58491,交易額3.96億TRX/6616萬元;ETH Dapp活躍用戶11627,交易額1.94萬ETH/1892萬元;Steem Dapp活躍用戶10081,交易額37.9萬Steem/83萬元。[2019/3/1]

我們看init方法中,對DApp的id進行了查詢,根據應用的名稱從主鏈動態獲取當前側鏈應用的ID,為后續測試接口的調用初始化DappId數據。接下來我們看一下測試常用的工具函數。2、區塊等待在發起一筆交易之后,需要等待交易確認之后再執行下一步的操作,調用sleep函數進行等待,之后繼續執行。這個函數在測試流程中會多次使用,因為10秒一個區塊的特性,很多的操作需要在區塊確認之后獲得驗證,不僅是寫操作,讀取的接口依然需要在上一次寫操作之后等待區塊確認才能獲取到最新數據。區塊等待相關函數如下所示:

金色相對論 | DappReviewCEO牛鳳軒:區塊鏈可以改造開發商與玩家之間的協作關系:在本期金色相對論之“Dapp游戲”中,針對金色財經內容合伙人佟揚“除了玩法之外,其他層面是否有促成爆發的原因”的提問,DappReview的CEO牛鳳軒表示,區塊鏈之于游戲,只是多了一個我們可以使用的技術和工具,而并不是說過去的游戲就要完蛋了或者全部被顛覆,主機游戲從上世紀60年代誕生,時至今日依舊競爭激烈、大作頻出,Steam作為端游的分發巨頭根本不需要上市和外部資金支持,桌游這種從圈外人看起來很古老的線下小眾游戲其實早就是一個百億的市場還在不斷增長。

“區塊鏈游戲”這個名詞甚至都是一個偽概念,只是在行業初期,我們用來泛指所有使用了區塊鏈技術的游戲。在最后,這些游戲還是要落地在不同的平臺之上。

所以,說區塊鏈能顛覆整個游戲行業?我是不信的,區塊鏈可以改造開發商與玩家之間的協作關系,可以通過引入通證經濟和資產代幣化增加游戲的經濟屬性和激勵機制,可以讓玩家現擁有一個現實世界中實體物品一樣的擁有游戲中的虛擬資產,這些是革新,是優化,不是舉著一片大旗否定所有傳統游戲。最終的狀態下,對于大部分玩家來說,區塊鏈植入游戲的體驗應該是無感的,游戲只要好玩就可以,至于用沒用區塊鏈,這不重要。[2018/12/3]

3、賬戶生成與轉賬生成隨機賬戶與轉賬接口也需要測試,我們留意到了在base文件頭部定義了創世賬戶的地址和秘鑰,創世賬戶可以通過asch-js中的合約接口向新生成的賬戶轉賬,隨機賬戶有了余額就能夠繼續調用應用中的自定義合約,進行合約相關的功能測試。賬戶及轉賬相關的函數如下:

公告 | EOSflytoMARS節點和支持者捐贈2000EOS支持DAPP早期上鏈項目:據IMEOS消息,EOSflytoMARS在節點網站發布捐贈信息,近期社區對于RAM價格的上漲產生疑慮,擔心價格投機和炒作會影響到生態的發展,社區正在就這一問題進行深入的討論,我們相信會很快形成共識解決這一問題。在此之前,我們希望通過節點和社區的努力來為這一問題提供支持,并加速DAPP的上鏈。EOSflytoMARS的一位投票支持者愿意捐贈1000EOS來支持有RAM需求并計劃近期上鏈的項目并委托EOSflytoMARS節點進行遴選,節點也決定按照1:1配比捐贈詳情可在官網查看。[2018/7/1]

a.隨機賬戶randomSecret調用randomSecret生成隨機字符串作為賬戶秘鑰,我們可以看到AschJS.crypto.getKeys函數能夠將字符串格式的秘鑰通過非對稱加密得出一個包含公鑰和私鑰的秘鑰對,AschJS.crypto.getAddress通過公鑰算出賬戶的地址。randomSecret返回的是一個隨機生成但被截取之后的字符串。通常情況下,Asch只支持符合BIP39規范的密鑰字符,也就是我們熟悉的“助記詞”格式的密碼,但這里為了測試方便,直接使用隨機的七位字符串,同樣可以算出符合規則的公鑰,也能計算出地址。當然,隨機賬戶也支持通過指定助記詞的方式獲取公鑰與地址。b.轉賬轉賬在DApp以類型2的合約實現,所以這里的轉賬就是在調用DApp內部的合約,我們可以在giveMoney函數中看到合約調用的格式。合約參數結構如下:

BM:對代理如何運作和“dApp開發者”如何計費的理解可能需要調整:北京時間今日凌晨,BM在開發者群發表對代理如何運作和“dApp開發者”如何計費的理解:

??1)所有CPU/帶寬都是“執行操作的用戶”;

??2)所有存儲都按照dApp的選擇向用戶或dApp付費;

??3)dApp開發人員希望授權用戶將帶寬委托給用戶;

??4)授權帶寬理論上可以用于任何dApp。

現在想象一下,你是一個社交媒體公司,希望為用戶提供免費賬戶。用戶在您的網站上注冊,您為他們創建一個區塊鏈賬戶,然后將一些帶寬委托給他們。您的應用可以選擇為每個授權用戶支付有限的存儲空間,這使他們能夠在他們需要攜帶自己的存儲空間之前,擁有N份杰出的帖子和V張投票。如果您的應用不想為用戶支付存儲費用,則該應用可能完全是BYOS(注:Bring your own storage,使用你自己的存儲)和BYOB(注:Bring your own Bandwith,使用你自己的帶寬)應用。如果用戶不繼續他們的訂閱或停止使用您的服務,那么您可以將帶寬重新分配給其他用戶。[2018/4/30]

secret為合約調用者的秘鑰,String類型。

fee為合約調用手續費,bigNumber類型。

type為合約類型,Number類型,與自定義合約數據對應。

args為合約參數,Array類型。

注意:

我們看到giveMoney調用合約時請求了/transactions/unsigned接口,這個接口可以接受未簽名的參數和密鑰執行合約,這樣做在測試環境雖然沒有問題,但是在正式的生產環境中會有很大的風險,我們的私鑰內容會有被網絡劫持的風險,所以在調用合約時,盡可能避免通過網絡傳輸自己的密鑰,而是用本地簽名的方式加密參數,然后請求/transactions/signed,這點一定要十分注意。

上面的代碼通過接收簽名參數調用合約的接口,這個函數發送了命名為transaction的參數,trs是用asch-js前端JavaScript工具庫進行簽名返回的transaction對象。我們來看一個例子:

使用AschJS.dapp.createInnerTransaction將合約參數通過秘鑰secret簽名之后傳入submitInnerTransaction函數,完成合約調用。與上面giveMoney函數不同的是,createInnerTransaction返回的是通過秘鑰簽名的內容,將簽名后的數據通過網絡發送,這樣提高了整個傳輸過程秘鑰的安全性。我們來看簽名后的transaction參數是什么樣子:

與上面未簽名調用轉賬接口的參數對比,本地簽名后得出的參數中少了secret屬性,多了signature屬性,而這個屬性把通過sha256算法得出的私鑰與整個transaction參數經過哈希計算之后得出,用于后端接口對參數驗證。其他的合約調用基本上都按照發布文章合約的結構組織參數,完成合約調用的封裝。這樣,我們就可以著手編寫測試了。合約流程測試

我們現在開始以一個發布文章、用戶打賞、結算抽獎和用戶領獎整個應用的核心流程進行測試,相關代碼如下:

首先,在測試用例before函數中初始化測試變量、DApp數據和創始賬戶信息作為后續測試函數的基礎,然后執行獲取頻道列表的測試用例。我們使用awaitbase.dappApiGetAsync('/channels')請求一個API,獲取到頻道列表信息,并用斷言庫校驗結果。下面我們對核心的業務流程進行測試,測試的思路如下:1)創建頻道。2)初始化賬戶。3)在頻道里創建包含抽獎模式的文章。4)模擬三個用戶各打賞兩筆。5)文章結算。6)獲獎用戶領獎。7)檢查各自賬戶的余額。核心業務流程的代碼如下:

上面的代碼使用受托人創建了一個新頻道,并通過頻道查詢接口通過交易ID獲取到了頻道的ID,完成了基本的測試邏輯,同時保存了channelId作為后續創建文章的數據。

注意:awaitbase.onNewBlockAsync()是在等待區塊確認之后再繼續執行。我們看到最初先給賬戶轉入10500的Token,用于創建頻道和更新頻道的消耗。打賞文章測試代碼如下:

在上面代碼中,首先進行賬戶的初始化,生成了四個賬戶,一個賬戶負責創建文章和結算獎勵,另外三個作為打賞用戶。然后對創建的文章執行兩次打賞,為了驗證方便,新創建的賬戶兩次打賞的總額為5個Token,創建文章的賬戶擁有0.2個Token,操作之后扣掉手續費保證在結算之前賬戶余額都是零,方便驗證。另外,我們為了測試需要,將后端關于區塊高度的限制暫時去掉,并設置結算區塊高度為當前的高度加2,這樣,在用戶投票之后直接執行結算。提示:測試代碼中,創建頻道或文章之后,因為需要區塊確認,所以我們沒有辦法立即獲取到數據的ID,只能先拿到transactionId,待區塊打包之后,再通過查詢接口用tid獲取實際的數據ID,再進行下一步的操作,測試文件中,會出現很多這樣的處理,這也是區塊特性所決定的。用戶打賞測試代碼如下:

上面代碼中,用另外三個賬戶對文章進行了打賞,每個賬戶打賞兩次不同的金額,但總額是5XCT,所以最終文章的抽獎池中,應該是15個XCT,結算結果根據15XCT的總額進行驗證,然后驗證文章投票額與投票者的余額是否正確,代碼如下:

合約中對抽獎模式的結算規則是受托人10%,作者30%,獲獎者60%,因為受托人的獎勵是平均分給三個賬戶,所以驗證不是那么方便,不過我們只要驗證作者和獲獎者的獎勵額就能確定結算是否正確,那么最終的結果是作者獲得4.5個XCT,抽獎人獲得9個XCT。驗證獎勵測試代碼如下:

最終,在根目錄執行npmtest,等測試運行結束,就能看到應用測試執行的結果了。

總結

上述提及的測試代碼也只是完成了核心功能驗證,并沒有完全覆蓋到每一個合約和操作場景,如果讀者感興趣可以嘗試在此基礎上補充或重構,也歡迎對項目提出改進建議。

Tags:DAPPDAPAPPRAN區塊鏈dapp開發合法嗎DAPS TokenWrapped Staked USDTPiranhas Finance

火星幣
李笑來、孫宇晨隔空“開撕”,巴菲特午餐或將于2020年進行_穩定幣

本文由小蔥APP原創,轉載請注明出處,閱讀更多請登陸https://xcong.com/或下載小蔥APP.

1900/1/1 0:00:00
隱私幣危機 OKEx韓國交易所將退市Monero等五種隱私幣_加密貨幣

主要加密貨幣交易所OKEx的韓國分支機構周一宣布,其將不再支持Monero、Zcash、Dash、horizen和superbitcoin五種隱私幣.

1900/1/1 0:00:00
BiKi交易平臺工作周報(9.2—9.8)_BIKI

一、產品方面 1、優化BiKiLab專區的搶購機制。2、優化BiKiAPP下載界面,使用將更加快速流暢.

1900/1/1 0:00:00
ZZEX Global將于9月30日15:00首發上線Star block chain(STBC)

尊敬的用戶: ZZEX交易所將于2019年9月30日15:00首發上線Starblockchain(STBC),支持STBC/USDT交易對.

1900/1/1 0:00:00
Amino Network9月10日上線KuCoin開啟國際化擴張_EOS

Amino自4月29日IEO上線至今,漲幅10倍,最高漲幅20倍。Amino的成功證明了具備長期商業化價值的項目也能在幣圈獲得大量青睞.

1900/1/1 0:00:00
LOEx國際站即將首發上線LLCB_EOS

尊敬的LOEx用戶:LOEx國際站即將首發上線LLCB,敬請期待。幣種介紹英文全稱:LLCB英文縮寫:LLCB發行總量:8億流通總量:1億官網鏈接:llcbcoin.us合約地址:https:/.

1900/1/1 0:00:00
ads