目錄
- 1-從零開(kāi)發(fā)EOS區(qū)塊鏈小游戲系列 - 使用EOS Studio
- 2-從零開(kāi)發(fā)EOS區(qū)塊鏈小游戲系列 - 智能合約設(shè)計(jì)與實(shí)現(xiàn)
- 3-從零開(kāi)發(fā)EOS區(qū)塊鏈小游戲系列 - 游戲公平性及安全性
- 4-從零開(kāi)發(fā)EOS區(qū)塊鏈小游戲系列 - 加入Token體系
- 5-從零開(kāi)發(fā)EOS區(qū)塊鏈小游戲系列 - 實(shí)現(xiàn)玩家免CPU玩游戲(終)
前言
?記得EOS主網(wǎng)是去年6月底上線的,號(hào)稱區(qū)塊鏈3.0,因?yàn)楫?dāng)時(shí)ETH(以太坊)平均出塊時(shí)間10幾秒,而EOS是每秒2個(gè),試想如果一個(gè)系統(tǒng)你去請(qǐng)求,然后他10幾秒才告訴你結(jié)果是什么感覺(jué)。因此導(dǎo)致很多項(xiàng)目不適用。當(dāng)然并不代表EOS比ETH強(qiáng),只是大家取舍不一樣。
?EOS發(fā)展是非??斓?,記得很短時(shí)間注冊(cè)賬號(hào)就過(guò)百萬(wàn)了,第一批涌現(xiàn)的應(yīng)該是“菠菜”類的Dapp,那時(shí)候可以說(shuō)是每隔兩三天就會(huì)出現(xiàn)一款,因?yàn)殚_(kāi)發(fā)成本相當(dāng)?shù)?,?dāng)然體驗(yàn)也是非常差的。知道大概年底的時(shí)候,出現(xiàn)了一款放置型的去中心化游戲EOS Knight,是韓國(guó)公司開(kāi)發(fā)的一款游戲,智能合約代碼完全開(kāi)源,日活一直占據(jù)EOS前幾名,游戲內(nèi)有自由交易市場(chǎng),購(gòu)買(mǎi)裝備或者素材,可以升級(jí)和合成裝備,BOSS戰(zhàn),定時(shí)挑戰(zhàn)任務(wù)等,當(dāng)年我也是他們的氪金玩家,當(dāng)然氪的是EOS[微笑]。
?EOS游戲大致可分為[僅資產(chǎn)上鏈]和[邏輯和資產(chǎn)上鏈]兩類,這里資產(chǎn)指游戲中的金幣、裝備等。邏輯指游戲的執(zhí)行邏輯,如玩家砍BOSS一刀,扣血、暴擊、傷害計(jì)算等這些就算是執(zhí)行邏輯。
?怎么定義一款游戲?qū)儆谀念??首先我們要了解的是在區(qū)塊鏈游戲中,每做一個(gè)決策,理論上都是需要玩家輸入密碼確認(rèn)的,當(dāng)然可以通過(guò)設(shè)置白名單解決,但仍然是一個(gè)非常重的操作。所以一般博弈類的游戲,如五子棋,只能選擇僅資產(chǎn)上鏈,否則玩家每下一步棋,都需要輸入密碼確認(rèn),這體驗(yàn)顯然無(wú)法接受。一些放置型的游戲是可以考慮邏輯和資產(chǎn)都上鏈的,所以Knight就是屬于后者那類。戰(zhàn)斗玩法是:玩家只需要做一次開(kāi)始戰(zhàn)斗的決策,人物就會(huì)自動(dòng)一直打怪,知道人物陣亡,再做一次結(jié)束戰(zhàn)斗決策,就可以獲取經(jīng)驗(yàn)和裝備。
?這兩類游戲去年自己都開(kāi)發(fā)過(guò),現(xiàn)在都還在主網(wǎng)跑,但都是半年前的事了。 當(dāng)時(shí)EOSIO版本還是1.2+,連EOSIO.CDT(Contract Development Toolkit)都還沒(méi)有。EOS智能合約使用的開(kāi)發(fā)語(yǔ)言是C++,在1.3版本之后,語(yǔ)法發(fā)生了很大的變化,現(xiàn)在最新版本好像是1.8了,而且生態(tài)也已經(jīng)慢慢形成。為什么又想繼續(xù)撿回?一方面想熟悉1.3后的新語(yǔ)法,更重要的是最近發(fā)現(xiàn)有一款EOS開(kāi)發(fā)集成工具EOS Studio面世了,開(kāi)發(fā)到測(cè)試到部署一條龍服務(wù)。想想當(dāng)初只能靠CLION來(lái)寫(xiě)合約代碼,然后來(lái)回切節(jié)點(diǎn)調(diào)式的艱苦日子即將過(guò)去,前路又充滿了陽(yáng)光。
從零開(kāi)發(fā)一款區(qū)塊鏈小游戲
?本系列的目的是想深入了解EOS Stuio的使用,并熟悉EOSIO1.8新語(yǔ)法,看看與舊的區(qū)別,所以實(shí)際去開(kāi)發(fā)一個(gè)Dapp是最有效的學(xué)習(xí)方式。
?下面我們來(lái)開(kāi)發(fā)一款邏輯和資產(chǎn)都上鏈的小游戲,設(shè)想的游戲大概是這樣的:
- 玩家需要注冊(cè)賬號(hào),同時(shí)獲得1000個(gè)SJ幣(水晶),并得到一個(gè)人物用于戰(zhàn)斗,人物有攻擊力和血量2個(gè)屬性,攻擊力初始35-70,血量初始500。
- 玩家獲得人物后,點(diǎn)擊戰(zhàn)斗(做一次決策),挑戰(zhàn)一個(gè)BOSS(攻擊力50-70,血量700)。
- 玩家先開(kāi)始攻擊,然后BOSS攻擊,一直重復(fù),直到任何一方血量<=0,戰(zhàn)斗結(jié)束。
- 玩家每一次攻擊,有25%的概率觸發(fā)暴擊,暴擊增加100點(diǎn)傷害,僅在一回合有效。
- 玩家勝利,可以隨機(jī)獲得一個(gè)金、銀、銅寶箱。玩家戰(zhàn)敗,減少100SJ幣。
環(huán)境配置
開(kāi)發(fā)環(huán)境:MacOS 10.13.6、Python3.6
區(qū)塊鏈環(huán)境:kylin測(cè)試鏈
工具:EOS Studio、Docker、Scatter、Atom、PyCharm、EOSIO v1.8
架構(gòu)圖

EOS Studio: EOS開(kāi)發(fā)集成工具
Docker: EOS studio必須依賴docker,已達(dá)到切換環(huán)境需求
Scatter:是一個(gè)EOS賬號(hào)管理工具
Atom: 用來(lái)編寫(xiě)前端代碼,也可以使用sublime代替
PyCharm: 使用Python開(kāi)發(fā)上圖中鏈接器程序
EOSIO:EOS客戶端程序,后面用來(lái)可以執(zhí)行cleos命令
以上工具需要用到的時(shí)候再下載也可以
熟悉EOS Studio
?先是下載并安裝好Docker和EOS Studio,啟動(dòng)玩Docker后,再啟動(dòng)EOS Studio,此時(shí)界面應(yīng)該是這樣的:

?因?yàn)槲蚁惹耙呀?jīng)把需要的都裝好了,所以可以直接下一步。
?首先在你本地創(chuàng)建一個(gè)目錄,我這里就叫kof(king of fighter)也就是拳皇。
mkdir kof
?進(jìn)入到開(kāi)發(fā)界面,中間展示的是配置信息,然后左邊是目錄結(jié)構(gòu),往上有幾個(gè)按鈕,分別是新建合約、構(gòu)建、部署、測(cè)試和設(shè)置。然后右上角那三個(gè)模塊是環(huán)境和賬號(hào)相關(guān)的??梢钥闯銎鋵?shí)功能還是比較少的,畢竟剛發(fā)布的工具。
?在創(chuàng)建項(xiàng)目之前,我們先為合約創(chuàng)建一個(gè)EOS賬戶,這里直接使用kylin(麒麟)測(cè)試鏈:右上角-Network-kylin。然后再點(diǎn)擊Account-Create Account,再?gòu)棿拜斎胍粋€(gè)合法的賬號(hào),所謂EOS合法賬號(hào)格式就是長(zhǎng)度12位:a-z 、1-5和.?,這里我們注冊(cè)一個(gè)賬號(hào):kingofighter。然后右上角選中該賬號(hào)后,可以看到展示出一個(gè)界面:

?這個(gè)就是與你賬號(hào)相關(guān)的信息:
- Account:可以看到你的總余額,也就是EOS,可用余額,CPU和NET抵押的金額、返回的金額。
- Resources:資源。第一個(gè)是RAM是內(nèi)存,每一個(gè)賬號(hào)都需要內(nèi)存來(lái)保存數(shù)據(jù),而部署了智能合約的賬號(hào),RAM用于存放合約代碼和日后產(chǎn)生的數(shù)據(jù)。CPU用于發(fā)生交易時(shí)消耗,NET用于交易時(shí)打包數(shù)據(jù)消耗。這些資源都需要抵押EOS來(lái)獲得,這就是為什么會(huì)有Staked、Refund的存在。這里只是抵押你的EOS,可以贖回。注意:這里有點(diǎn)差別的是,RAM是購(gòu)買(mǎi),所以都叫buy ram,你也可以將你多余的RAM賣(mài)出去。二CPU和NET是抵押,也可以贖回。
- Permission Keys:權(quán)限。兩個(gè)EOSxxx開(kāi)頭的都是這個(gè)賬號(hào)關(guān)聯(lián)的公鑰,關(guān)于EOS的賬戶與公鑰權(quán)限設(shè)計(jì)已經(jīng)有好多文章說(shuō)過(guò)了,有興趣可以自行搜索。owner是一些較敏感的操作需要用到,如修改公鑰,active是一些普通操作如發(fā)送交易、部署合約、抵押資源等。
?現(xiàn)在我們已經(jīng)有了EOS賬號(hào),我們把這個(gè)作為游戲的合約賬戶,所以后面需要將寫(xiě)好的代碼部署的上面,這就需要用到RAM了,而購(gòu)買(mǎi)RAM就需要一定的EOS,所以我們先去搞一些EOS。好在這里我們使用的是測(cè)試網(wǎng)絡(luò),一切都可以免費(fèi)得到。
?看到右上角的4個(gè)圖標(biāo)了嗎?第二個(gè)就是免費(fèi)獲取EOS的,有個(gè)很生動(dòng)的名稱叫faucet,點(diǎn)擊一下就給你100EOS,每個(gè)賬號(hào)每天只能獲取1000個(gè)EOS。接著繼續(xù)點(diǎn)擊第三個(gè)圖標(biāo),購(gòu)買(mǎi)RAM,點(diǎn)擊一下,這是我們的資源就是這樣了:
?擁有200個(gè)EOS,使用了大概6個(gè)去購(gòu)買(mǎi)RAM,現(xiàn)在RAM是209。36KB。CPU和NET我沒(méi)有找到可以抵押的按鈕,沒(méi)關(guān)系,后面需要用到的時(shí)候,我們直接用CLEOS命令來(lái)抵押就可以了。
?有了資源,我們可以新建一個(gè)項(xiàng)目:點(diǎn)擊左上角"Create New Project...",在彈窗選擇位置為上創(chuàng)建的kof目錄,輸入項(xiàng)目名稱,這里項(xiàng)目名稱提示我們必須是EOS賬號(hào),所以這里輸入剛剛注冊(cè)好的:kingofighter
目錄結(jié)構(gòu)
?工具自動(dòng)為我們生成了兩個(gè)C++文件,隨便瀏覽下,發(fā)現(xiàn)是寫(xiě)helloworld的相關(guān)代碼,里面其實(shí)是一個(gè)完整的合約demo了。重點(diǎn)看下cpp的文件:
#include <kingofighter.hpp>
ACTION kingofighter::hi(name user) {
require_auth(user);
print("Hello, ", name{user});
}
?合約中一個(gè)接口稱為action,這個(gè)action的名字是hi,入?yún)⒂幸粋€(gè)name類型的user,所以這里的意思是user必須傳入一個(gè)EOS賬號(hào)類型。v1.2版本是叫account_name類型。require_auth(user);是要求當(dāng)前調(diào)用者必須是user,如果不是就直接終止。請(qǐng)記住這一句代碼,在安全性方面這一句很重要,特別是在一些涉及EOS交易的合約中,而且后面我們也會(huì)經(jīng)常使用
print("Hello, ", name{user});打印出“Hello,賬號(hào)名稱”。name{}是轉(zhuǎn)換成字符串的形式顯示,因?yàn)閚ame類型實(shí)際上存儲(chǔ)類型是uint64_t,無(wú)符號(hào)64位整形,所以需要進(jìn)行轉(zhuǎn)換。
?跟著下來(lái),我們嘗試下構(gòu)建和部署合約,嘗試點(diǎn)擊左上角的??圖標(biāo)(Build)。

?嗯,很合理的報(bào)錯(cuò)了。直接看錯(cuò)誤信息,很明顯是不知道他在說(shuō)什么的,于是我去了他們論壇搜,沒(méi)搜到,然后自己發(fā)了一個(gè)帖子,等了幾個(gè)小時(shí),沒(méi)人回答。后來(lái)直接去電報(bào)找到軟件的作者尋找解決辦法:

?根據(jù)作者的回復(fù),是要在 Add a resource path for inclusion -R 那一項(xiàng) 隨意填一些內(nèi)容就可以了,這應(yīng)該是軟件的一個(gè)BUG。我填寫(xiě)的是合約的名稱,再點(diǎn)擊構(gòu)建:

?發(fā)現(xiàn)多處了兩個(gè)文件.abi、.wasm。一個(gè)是描述文件,告訴外界這個(gè)合約有哪些action及參數(shù),另一個(gè)是合約的代碼文件。
?接著,我們嘗試部署(Deploy),很順利的成功了,這時(shí)候我們回到賬號(hào)信息界面,發(fā)現(xiàn)RAM已被使用了大概14KB:

?好,我試下最后一個(gè)功能測(cè)試(Test),點(diǎn)擊后,要求安裝一些必要的工具,這里我選默認(rèn)項(xiàng)目,點(diǎn)擊初始化:

?初始化完成后,界面展示了幾段JS代碼,我估計(jì)這里所謂測(cè)試就是幫你下載了一些eosjs相關(guān)的包,然后通過(guò)調(diào)用eosjs提供的接口來(lái)實(shí)現(xiàn)單元測(cè)試,我們將第三段的
can get account "eosio"修改一下:
//期望部署的合約與我們指定的名稱相同
it('can get account "kingofighter"', async () => {
const eosioAccount = await eos.getAccount('kingofighter');
expect(eosioAccount.account_name).to.equal('kingofighter');
});
?然后保存文件,點(diǎn)擊Test按鈕:
Global eos
? is an object
? can get chain info and chainId is 5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191 (1072ms)
? can get account "kingofighter" (1108ms)
3 passing (2s)
?當(dāng)然還可以測(cè)試更多的信息,我嘗試去EOS Studio官網(wǎng)看看有沒(méi)有關(guān)于Test的文檔,發(fā)現(xiàn)這個(gè)版塊還在建設(shè)中

?如果你對(duì)eosjs很熟悉可以繼續(xù)深入,我還是等等官方到時(shí)候給出的列子吧,加上測(cè)試這里不影響后面的進(jìn)度。
總結(jié)
?本章開(kāi)頭講了一些關(guān)于EOS游戲的發(fā)展,重點(diǎn)嘗試了EOS Studio的各項(xiàng)重要功能,總得來(lái)說(shuō)EOS Studio為開(kāi)發(fā)Dapp提供了很大的便利性:以前需要安裝EOSIO客戶端,合約的 很多操作都需要使用CLEOS來(lái)實(shí)現(xiàn),比較麻煩。當(dāng)然不足的地方也不少:只是實(shí)現(xiàn)了最基本的功能、無(wú)法直接跳轉(zhuǎn)的源代碼、缺少快捷鍵、假死情況頻繁等。但畢竟是剛剛上線的產(chǎn)品,可以理解。這里感謝開(kāi)發(fā)者的無(wú)私付出。
?好了,下一章開(kāi)始智能合約的設(shè)計(jì)與編寫(xiě)...


