目錄
- 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)買裝備或者素材拙吉,可以升級(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)寫合約代碼群发,然后來(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)編寫前端代碼,也可以使用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)買壶唤,所以都叫buy ram,你也可以將你多余的RAM賣出去棕所。二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è)作為游戲的合約賬戶批幌,所以后面需要將寫好的代碼部署的上面,這就需要用到RAM了嗓节,而購(gòu)買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)買RAM,點(diǎn)擊一下外驱,這是我們的資源就是這樣了:
?擁有200個(gè)EOS育灸,使用了大概6個(gè)去購(gòu)買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
?工具自動(dòng)為我們生成了兩個(gè)C++文件,隨便瀏覽下也切,發(fā)現(xiàn)是寫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。我填寫的是合約的名稱碗殷,再點(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ì)與編寫...