如何在Ethereum上編寫自己的CryptoKitties風格的游戲

吸血鬼貓

【翻譯】原文:https://medium.com/loom-network/how-to-code-your-own-cryptokitties-style-game-on-ethereum-7c8ac86a4eb3

CryptoKitties?做了很棒的工作,他展示除了簡單的金融交易之外還可以使用區(qū)塊鏈做什么。

我希望將來我們會看到更多創(chuàng)新的區(qū)塊鏈用法则剃,所以我想快速瀏覽CryptoKitties背后的代碼巾兆,以展示它背后是如何實現(xiàn)的。

本文是為開發(fā)人員編寫的秆吵,雖然這不是一個絕對的初學(xué)者對Solidity的介紹淮椰,但是我試圖包含文檔的鏈接,以便盡可能適合所有開發(fā)者。

讓我們開始...

CryptoKitties源碼

幾乎所有的CryptoKitties代碼都是開源的主穗,因此找出它的工作原理的最好方法是閱讀源代碼泻拦。

總共大約有2000行,所以在這篇文章中忽媒,我只會講解我認為最重要的部分争拐。 但是,如果您想單獨閱讀晦雨,請參閱EthFiddle上的完整合約代碼副本:

CryptoKitties Source Code

總概:

如果你不了解CryptoKitties是什么架曹,它基本上是一個購買,銷售和繁殖數(shù)字貓的游戲闹瞧。 每只貓都有一個獨特的外觀绑雄,由它的基因所定義,當你通過兩只貓繁殖時奥邮,它們的基因以一種獨特的方式結(jié)合在一起產(chǎn)生一個后代万牺,然后你可以繁殖或出售它。

CryptoKitties 的代碼分為許多相關(guān)的較小的合約洽腺, 而不是一個單一的包含所有東西的巨大文件

子合約像下面這樣繼承主kitty合約:

所以KittyCore是最終應(yīng)用程序指向的合約地址脚粟,他繼承了前面合約的所有的屬性和方法?

讓我們一個一個的看看這些合約:

1.?KittyAccessControl:誰控制合約?

這個合約管理只能由特定角色執(zhí)行操作的各種地址和約束已脓。這些角色叫CEO, CFO and COO.

這個合約是為了管理合約珊楼,根本不涉及到游戲的機制。他為CEO, COO 和CFO提供有“setter”方法度液, 他們(CEO, COO, CFO)是對合約具有特殊所有權(quán)和控制權(quán)的以太坊地址厕宗。

KittyAccessControl? 定義一些modifier函數(shù)例如 onlyCEO(只有CEO才能執(zhí)行),還有暫停/恢復(fù)合約的方法或者提現(xiàn)方法


pause() 函數(shù)可能被添加堕担,以便開發(fā)人員可以更新一個新的版本已慢,以防有任何不可預(yù)見的錯誤... 但正如我的同事Luke指出,這實際上將允許開發(fā)人員完全凍結(jié)合約霹购,使其沒有人可以轉(zhuǎn)讓佑惠,出售或繁殖他們的小貓! 并不是說他們會這么做 - 但是有趣的是齐疙,由于大多數(shù)人認為DApp完全是去中心化的膜楷,只是因為它在以太坊上。

繼續(xù)贞奋。赌厅。。

2. KittyBase: Kitty是什么轿塔?

這是我們定義在整個核心功能中共享的最基本代碼的地方特愿。 這包括我們的主要數(shù)據(jù)存儲仲墨,常量和數(shù)據(jù)類型,以及用于管理這些數(shù)據(jù)的內(nèi)部函數(shù)揍障。

KittyBase?定義了應(yīng)用程序的很多核心數(shù)據(jù)目养。首先它將Kitty定義為一個結(jié)構(gòu)體:

所以一只kitty實際上只是一串無符號的整數(shù)...

展開每個屬性:

genes—代表貓的遺傳密碼的256位整數(shù)。 這是決定貓的長相的核心數(shù)據(jù)毒嫡。

birthTime—貓出生時的時間戳

cooldownEndBlock—之后這只貓可以再次繁殖的最小時間戳

matronId&sireId—分別是貓的母親和父親的ID

siringWithId—如果貓當前懷孕癌蚁,則設(shè)置為父親的ID,否則為零

cooldownIndex—目前這只貓的冷卻時間(貓需要等待多久才能繁殖)

generation—這只貓的“世代號”审胚。 第一只貓被合約創(chuàng)造是0代匈勋,新一代的貓是他們的父母一代中較大的一個,再加上1.

請注意膳叨,在Crypto Kitties中洽洁,貓是無性的,任何2只貓都可以一起繁殖 - 因此貓沒有性別菲嘴。

KittyBase?合約定義了一個kitty 數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)


KittyBase?合約

這個數(shù)組包含了所有Kitty的數(shù)據(jù)饿自,所以它就像一個Kitty的數(shù)據(jù)庫一樣。 無論何時創(chuàng)建一個新的貓龄坪,它都會被添加到這個數(shù)組中昭雌,數(shù)組的索引成為貓的ID,就像這個 ID為'1'的創(chuàng)世喵:


索引為 “1”!


該合約還包含從貓的ID到其擁有者地址的映射健田,以跟蹤擁有貓的人:


還有一些其他的映射也被定義烛卧,但為了保持這篇文章的合理長度,我不會仔細研究每一個細節(jié)妓局。

每當小貓從一個人轉(zhuǎn)移到下一個時总放,這個kittyIndexToOwner映射就會被更新以反映新的所有者:


轉(zhuǎn)移所有權(quán) 設(shè)置Kitty的ID指向接收人`_to`的地址。

現(xiàn)在我們來看看在創(chuàng)建一個新的kitty時會發(fā)生什么:

這個函數(shù)傳遞了母親和父親的ID好爬,小貓的世代號碼局雄,256位遺傳密碼和所有者的地址。 然后創(chuàng)建小貓存炮,將其加入到Kitty數(shù)組炬搭,然后調(diào)用_transfer() 將其分配給它的新所有者。

Cool - 現(xiàn)在我們可以看到CryptoKitties如何將一只貓咪定義為一種數(shù)據(jù)類型穆桂,它如何將所有小貓都存儲在區(qū)塊鏈中宫盔,以及如何跟蹤誰擁有哪些小貓。

3.?KittyOwnership: Kitties代幣化

這提供了遵循ERC-721規(guī)范草案的基本不可互換令牌交易所需的方法享完。

CryptoKitties符合ERC721代幣規(guī)范飘言,這是一種不可替換的代幣類型,它非常適合在MMORPG中跟蹤數(shù)字收集游戲(如數(shù)字撲克牌或稀有物品)的所有權(quán)驼侠。

關(guān)于Fungibility的說明:Ether是可互換的姿鸿,因為任何5個ETH都與其他5個ETH一樣好。 但是像CryptoKitties這樣的是非可互換代幣倒源,并不是每只貓都是平等的苛预,所以它們不能互相交換。

您可以從合約定義中看出笋熬,KittyOwnership繼承了ERC721合約:

而所有ERC721令牌都遵循相同的標準热某,所以KittyOwnership合約實現(xiàn)了以下功能:


由于這些方法是公開的,這就為用戶提供了一個標準的方式來與CryptoKitties令牌進行交互胳螟,就像他們與任何其他ERC721令牌進行交互一樣昔馋。 您可以通過直接與以太坊區(qū)塊鏈上的CryptoKitties合約進行交互,而不必通過他們的Web界面來將您的代幣轉(zhuǎn)讓給其他人糖耸,所以從這個意義上說秘遏,您真的擁有自己的小貓。 (除非CEO暫停合約)嘉竟。

我不會解讀所有這些方法的實現(xiàn)邦危,但是你可以在EthFiddle(搜索“KittyOwnership”)上查看它們。

4.?KittyBreeding:貓的繁殖

這個文件包含了將貓一起繁殖所必需的方法舍扰,包括跟蹤繁殖提供者倦蚪,并依靠外部基因組合合約。

“外部基因組合合約”(geneScience)存儲在一個不是開源的單獨合約中边苹。

KittyBreeding?合約包含一個方法陵且,讓CEO設(shè)置這個外部基因組合約地址:


他們這樣做是為了讓游戲變得不那么容易 - 如果你能夠讀懂一只小貓的DNA是如何確定的,那么就知道為了得到一只“奇特的貓”而跟哪只貓繁殖會容易得多个束。

這個外部 geneScience合約之后會在theGiveBirth() (我們稍后會看到)函數(shù)中使用慕购,以確定新貓的DNA。

現(xiàn)在讓我們看看當兩只貓在一起時會發(fā)生什么:


這個函數(shù)需要母親和父親的ID播急,在kitties數(shù)組中查找它們脓钾,并將母親上的siringWithId設(shè)置為父親的ID。 (當siringWithId不為零時桩警,表示母親懷孕)可训。

它也執(zhí)行父母雙方的triggerCooldown函數(shù),這會使他們在一段時間內(nèi)不能再一次繁殖捶枢。

接下來握截,有一個公開的 giveBirth() 函數(shù) 創(chuàng)建一個新的貓:



代碼是非常明顯的。 基本上烂叔,代碼首先執(zhí)行一些檢查谨胞,看看母親是否準備好生孩子。 然后使用geneScience.mixGenes() 確定孩子的基因蒜鸡,將新基因的所有權(quán)分配給母親胯努,然后調(diào)用我們在KittyBase中的函數(shù)_createKitty()牢裳。

請注意,geneScience.mixGenes() 函數(shù)是一個黑匣子叶沛,因為該合約是閉源的蒲讯。 所以我們實際上并不知道孩子的基因是如何決定的,但我們知道這是母親基因和父親基因的功能灰署,還有母親的cooldownEndBlock判帮。

5. KittyAuctions: 買賣和繁殖服務(wù)(出臺)

在這里,我們有公開的方法來拍賣貓或招標貓或繁殖貓溉箕。 實際的拍賣功能是在兩個兄弟合約(一個用于買賣晦墙,一個用于繁殖)中處理的,而拍賣的創(chuàng)建和投標主要是通過核心合約肴茄。

根據(jù)開發(fā)者的說法晌畅,他們將這個拍賣功能分為“兄弟”合約,是因為“他們的邏輯有點復(fù)雜独郎,總是存在微妙的bug風險踩麦。 通過保留它們自己的合約,我們可以升級它們而不會中斷追蹤小貓所有權(quán)的主合約氓癌∥角“

因此,這個KittyAuctions合約包含函數(shù) setSaleAuctionAddress() 和setSiringAuctionAddress() 贪婉,像 setGeneScienceAddress() 只能由CEO調(diào)用反粥,并設(shè)置處理這些函數(shù)的外部合約的地址。

注意:“Siring”指的是把你的貓拉出來 - 把它拍賣疲迂,在那里另一個用戶可以付錢給你以太才顿,讓你的貓與他們一起繁殖。哈哈尤蒿。

這意味著郑气,即使CryptoKitties合約本身是不可變的,首席執(zhí)行官也可以靈活地改變這些拍賣合約的地址腰池,從而改變拍賣規(guī)則尾组。 同樣,不一定是壞事示弓,因為有時候開發(fā)人員需要修正bug讳侨,但是這是要注意的事情。

我不打算詳細討論如何處理拍賣和出價邏輯奏属,以防止這篇文章過長(已經(jīng)夠長了?缈纭),但是您可以在EthFiddle(搜索KittyAuctions)中查看代碼囱皿。

6. KittyMinting: 創(chuàng)世貓工廠

最后一個方面包含我們用來創(chuàng)建新的gen0貓的功能勇婴。 我們最多可以制作5000只可以贈送的“營銷”貓(在社區(qū)初期的時候尤為重要)忱嘹,其他所有的貓只能通過算法確定的起始價格創(chuàng)建,然后立即投入拍賣耕渴。 不管它們是如何創(chuàng)造的德谅,都有50k gen0貓的硬性極限。 之后萨螺,社群就要繁殖,繁殖愧驱,繁殖慰技!

合約能夠創(chuàng)建的promo cats和gen0 cat的數(shù)量在這里是硬編碼的:


這里是“COO”可以創(chuàng)建營銷小貓和gen0小貓的代碼:



所以通過createPromoKitty(),看起來COO可以用任何他想要的基因創(chuàng)建一個新的kitty组砚,然后發(fā)送給任何他想要給的人(最多5000個kitty)吻商。 我猜測他們是為了早期測試者,朋友和家人糟红,為了促銷目的而贈送免費的小貓咪等等艾帐。

但是這也意味著你的貓可能并不像你想象的那樣獨一無二,因為他可能會有5000個相同的副本盆偿!

對于createGen0Auction()柒爸,COO也提供新基因的遺傳密碼。 但不是將其分配給特定的人的地址事扭,而是創(chuàng)建一個用戶可以出價購買小貓的拍賣捎稚。

7. KittyCore: 主合約

這是主要的CryptoKitties合約,編譯和運行在以太坊區(qū)塊鏈上求橄。 這份合約把所有東西聯(lián)系在一起今野。

由于繼承結(jié)構(gòu),它繼承了我們之前所看到的所有合約罐农,并增加了幾個最終的方法条霜,就像這個使用ID來獲取所有的Kitty數(shù)據(jù)的函數(shù):


這是一個公共方法,它返回區(qū)塊鏈中特定小貓的所有數(shù)據(jù)涵亏。 我想這是他們的Web服務(wù)器在網(wǎng)站上顯示的貓的查詢宰睡。

等等...我沒有看到任何圖像數(shù)據(jù)。 什么決定了小貓的樣子溯乒?

從上面的代碼可以看出夹厌,一個“小貓”基本上歸結(jié)為一個256位的無符號整數(shù),代表其遺傳密碼裆悄。

Solidity合約代碼中沒有任何內(nèi)容存儲貓的圖像或其描述矛纹,或者確定這個256位整數(shù)的實際含義。 該遺傳密碼的解釋發(fā)生在CryptoKitty的網(wǎng)絡(luò)服務(wù)器上光稼。

所以雖然這是區(qū)塊鏈上游戲的一個非常聰明的演示或南,但實際上并不是100%的區(qū)塊鏈孩等。 如果將來他們的網(wǎng)站被脫機,除非有人備份了所有的圖像采够,否則只剩下一個毫無意義的256位整數(shù)肄方。

在合約代碼中,我找到了一個名為ERC721Metadata的合約蹬癌,但它永遠不會被用于任何事情权她。 所以我的猜測是,他們最初計劃將所有內(nèi)容都存儲在區(qū)塊鏈中逝薪,但之后卻決定不要這么做(在Ethereum中存儲大量數(shù)據(jù)的代價太高)隅要,所以他們最終需要將其存儲在Web服務(wù)器上。

總結(jié)一下:

小貓如何表現(xiàn)為數(shù)據(jù)

現(xiàn)存的所有小貓如何存儲在一個智能合約中董济,以及如何跟蹤誰擁有什么

gen0小貓如何生產(chǎn)

小貓如何在一起繁殖步清,形成新的小貓

https://medium.com/loom-network/how-to-code-your-own-cryptokitties-style-game-on-ethereum-7c8ac86a4eb3?


----------------------------------------------分割線-----------------------------------------------------


我買的小貓??

https://www.cryptokitties.co/kitty/83194

http://cryptokittydex.com/??cryptokitties數(shù)據(jù)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虏肾,隨后出現(xiàn)的幾起案子廓啊,更是在濱河造成了極大的恐慌,老刑警劉巖封豪,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴轮,死亡現(xiàn)場離奇詭異,居然都是意外死亡撑毛,警方通過查閱死者的電腦和手機书聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藻雌,“玉大人雌续,你說我怎么就攤上這事】韬迹” “怎么了驯杜?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長做个。 經(jīng)常有香客問我鸽心,道長,這世上最難降的妖魔是什么居暖? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任顽频,我火速辦了婚禮,結(jié)果婚禮上太闺,老公的妹妹穿的比我還像新娘糯景。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布蟀淮。 她就那樣靜靜地躺著最住,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怠惶。 梳的紋絲不亂的頭發(fā)上涨缚,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音策治,去河邊找鬼脓魏。 笑死,一個胖子當著我的面吹牛通惫,可吹牛的內(nèi)容都是我干的轧拄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讽膏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拄丰?” 一聲冷哼從身側(cè)響起府树,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎料按,沒想到半個月后奄侠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡载矿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年垄潮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷盔。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弯洗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逢勾,到底是詐尸還是另有隱情牡整,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布溺拱,位于F島的核電站逃贝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迫摔。R本人自食惡果不足惜沐扳,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望句占。 院中可真熱鬧沪摄,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戏阅,卻和暖如春昼弟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奕筐。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工舱痘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人离赫。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓芭逝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渊胸。 傳聞我的和親對象是個殘疾皇子旬盯,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354