由ERC 721Token代表的游戲裝備
從 Cryptokitties 開(kāi)始,目前的以太坊 Dapps 游戲以Token為中心,符合ERC 721標(biāo)準(zhǔn)。 ERC 721Token標(biāo)準(zhǔn)定義了不FungibleToken元數(shù)據(jù),并將其用作游戲裝備或角色。
例如,在 Cryptokitties中 ,我們定義了一個(gè)連接到ERC 721TokenID的Kitty結(jié)構(gòu)(struct),并在那里存儲(chǔ)了角色的必要參數(shù)。
:kitty.sol
struct Kitty {
uint256 gene;
uint64 birthTime;
uint64 cooldownEndBlock;
uint32 matronId;
uint32 sireId;
uint32 siringWithId;
uint16 cooldownIndex;
uint16 generation;
}
在Cryptokitteis中 ,此結(jié)構(gòu)中包含的參數(shù)管理由ERC 721Token表示的字符的元數(shù)據(jù)。 各種 Dapps 游戲存在時(shí),符合ERC721Token, 是由擺動(dòng)到一個(gè)單一Token元數(shù)據(jù)和ID來(lái)區(qū)分的裝備。
用 Dapp表達(dá) 游戲物品
由這種元數(shù)據(jù)的“游戲裝備抽象化”是 Dapps 開(kāi)發(fā)中非常重要的元素。 在CryptoKitties 的示例中,除了作為決定外觀的因素的gene之外,元數(shù)據(jù)還包括關(guān)于交配,父母和世代的信息。 通過(guò)在元數(shù)據(jù)中包含這樣的信息,它對(duì)應(yīng)于拍賣功能和配對(duì)功能,但是將來(lái)可能難以添加更多功能。
因此,在 Dapp中 ,可以說(shuō)在開(kāi)始時(shí)定義的數(shù)據(jù)結(jié)構(gòu)在此之后極大地影響了游戲的發(fā)展。
查看Etheremon 示例,以下結(jié)構(gòu)被定義為表示怪物的結(jié)構(gòu)。
:etheremon.sol
struct MonsterObj {
uint64 monsterId;
uint32 classId;
string name;
uint32 exp;
uint8[] statBases;
uint8[] skills;
uint32 createIndex;
uint32 lastClaimIndex;
uint createTime;
}
例如,在這個(gè) 結(jié)構(gòu)中,可以想象 statBases 表示添加了早期怪物參數(shù),技能的技能和參數(shù)。 正如我們?cè)?CryptoKitties 的例子中所證實(shí)的那樣 ,開(kāi)頭定義的元數(shù)據(jù)結(jié)構(gòu)在此之后改變了游戲的可擴(kuò)展性。
在下文中,我們將考慮ERC 721Token是否能夠正確表示游戲裝備以及ERC 1155Token的有用性,以及它們的示例。
ERC 721代幣可以代表游戲物品嗎?
在符合 ERC 721Token的Dapps 游戲中,游戲物品被表示為Non-Fungible Token ,因此可以逐一區(qū)分它們。 當(dāng)然,對(duì)于每個(gè)裝備都有自己的屬性或參數(shù)隨用戶開(kāi)發(fā)而變化的裝備,可以說(shuō)使用Non-FungibleToken是合適的。
然而,物品如配件的參數(shù)為不變的物品及裝備(如:“草藥”,“劍”,“石子”等等), 這類更準(zhǔn)確的應(yīng)該被分為FungibleToken。 為固有的虛擬代幣提供單獨(dú)的元數(shù)據(jù)可以減少游戲裝備的流動(dòng)性,這可以說(shuō)是區(qū)塊鏈游戲創(chuàng)新的核心以及在想要節(jié)省數(shù)據(jù)資源的區(qū)塊鏈游戲中會(huì)產(chǎn)生多余的情況的一個(gè)原因。
我們來(lái)舉一個(gè)具體的例子。假設(shè)存在不必逐一區(qū)分的“普通的劍”和在游戲中逐個(gè)參數(shù)不同的“稀有的劍”。 將前者表示為Fungible,將后者表示為Non FungibleToken是恰當(dāng)?shù)摹?但是,當(dāng)所有物品都被歸類為Non Fungible時(shí),當(dāng)你想要逐一交換“10把普通劍”和“1把稀有劍”,“10把普通劍”時(shí)它需要被替換為一把單獨(dú)的劍。
因此,在交易時(shí)會(huì)產(chǎn)生額外的交易成本。 這被認(rèn)為是區(qū)塊鏈游戲中的一大損失,其中交易費(fèi)是一個(gè)大問(wèn)題。
在這方面,我認(rèn)為需要一個(gè)可以代替Non-FungibleToken和FungibleToken的新Token標(biāo)準(zhǔn) ,取代ERC 721標(biāo)準(zhǔn)。 從接下來(lái)一張我們開(kāi)始講述我們計(jì)劃采用的ERC1155Token。
ERC 1155標(biāo)準(zhǔn)的概述
為了管理多種Token類型的智能合約的標(biāo)準(zhǔn)接口。 單個(gè)ERC 1155Contract可以包括Fungible Token,Non Fungible Token或其他配置(例如,半替代Token)的任何組合。
此標(biāo)準(zhǔn)是一個(gè)智能合約界面,可以表示 任意數(shù)量的 Fungible和Non-FungibleToken類型。 現(xiàn)有標(biāo)準(zhǔn)(如ERC-20)要求為每種Token類型部署單獨(dú)的Contract。 ERC-721標(biāo)準(zhǔn)中的TokenID是單個(gè)非替代索引,這些非替代組被部署為包含整個(gè)集合的設(shè)置的單個(gè)Contract。 相反,ERC-1155多Token標(biāo)準(zhǔn)允許每個(gè)TokenID 表示新的可配置Token類型 。 此Token類型具有自己的元數(shù)據(jù),耗材和其他屬性。
_id參數(shù)包含在每個(gè)函數(shù)的參數(shù)中,并指示交易中的特定標(biāo)記或標(biāo)記類型。
諸如ERC-20和ERC-721之類的Token標(biāo)準(zhǔn)要求您為每種類型的Token部署單獨(dú)的Contract。 這會(huì)在以太坊區(qū)塊鏈中放置大量冗余字節(jié)碼,并將每個(gè)TokenContract分成其自己的授權(quán)地址,這也限制了某些功能。 隨著區(qū)塊鏈游戲和支持它們的平臺(tái)的出現(xiàn),游戲開(kāi)發(fā)者可能已經(jīng)創(chuàng)建了數(shù)千種Token類型,并且需要新類型的Token標(biāo)準(zhǔn)來(lái)支持它們 。 但是,ERC-1155并非特定于游戲,因此許多其他應(yīng)用程序可以從這種靈活性中受益。
此設(shè)計(jì)允許新功能,例如一次傳輸多個(gè)Token類型,從而節(jié)省交易成本。 可以在此標(biāo)準(zhǔn)上構(gòu)建多個(gè)Token交易(托管/原子交換),從而無(wú)需單獨(dú)“批準(zhǔn)”單個(gè)TokenContract。 在單個(gè)Contract中描述和混合多個(gè)可替代或不FungibleToken類型也很容易。
ERC1155的規(guī)格
以下 說(shuō)明基于EIP1155的ERC1155Token所要求的特征部分。
· 區(qū)分Fungible和Non Fungible
Contract中使用的_id是uint256,前半部分和后半部分可以除以128位。
為方便起見(jiàn),前半部分稱為 TokenId ,后半部分稱為IndexId 。
例如, 通過(guò)運(yùn)行薄荷功能ERC1155, 產(chǎn)生一次FungibleToken,_id 是: 在 mintNonFungible 函數(shù)發(fā)生兩次NonFungibleToken。
也就是說(shuō),它具有以下特征。
· FT的負(fù)責(zé)人總是0
· FT的 IndexId (后半部分Id)將始終為0000000000000000
· NFT的負(fù)責(zé)人總是1
· 每次執(zhí)行 mintNonFungible 函數(shù)時(shí), NFT的 IndexId (下半部分的Id)都會(huì)增加。
因此,在 ERC 1155中,F(xiàn)T和NFT之間的區(qū)別在_id的開(kāi)始(0或1)處執(zhí)行,并且NFT之間的區(qū)別 由后半部分中的 IndexId 執(zhí)行。 當(dāng)然,F(xiàn)T之間沒(méi)有區(qū)別。
· Token的移動(dòng)
:erc1155Spec.sol
//移動(dòng)多個(gè)Token
function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external;
//移動(dòng)Token
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
正如上面提到的,ERC1155Token, 除了safeTransferFrom, 支持功能還提供了safeBatchTransferFrom。 在這里,使用uint256 [] _ ids,uint256_value,可以指定要移動(dòng)的多個(gè)標(biāo)記和值的ID。
也就是說(shuō), 可以在單個(gè)交易中交換十個(gè)FungibleTokenA,一個(gè)Non FungibleTokenB和一個(gè)Non FungibleTokenC.
如何定義ERC1155Token的元數(shù)據(jù)
如開(kāi)頭所述,在定義游戲項(xiàng)時(shí)如何定義元數(shù)據(jù)結(jié)構(gòu)非常重要。
雖然ERC 1155Token允許以后自由生成Token,但以后無(wú)法自由設(shè)置元數(shù)據(jù)。 因此,當(dāng)使用ERC 1155Token作為游戲項(xiàng)時(shí),有必要在開(kāi)始時(shí)仔細(xì)設(shè)置元數(shù)據(jù)。
正如我們?cè)谇懊娴氖纠锌吹降模?CryptoKitties 元數(shù)據(jù)和 Etheremon 元數(shù)據(jù)是完全不同的。 這是因?yàn)?,雖然 CryptoKitties中沒(méi)有所謂游戲中戰(zhàn)斗的概念,但 Etheremon 具有諸如戰(zhàn)斗,技能增長(zhǎng)和進(jìn)化等參數(shù)。 如果您打算創(chuàng)建一個(gè)高度可擴(kuò)展的游戲,例如,以NonFungibleToken示例,將需要同時(shí)擁有想要戰(zhàn)斗的裝備(角色)和與戰(zhàn)斗無(wú)關(guān)的裝備(例如:怪物和裝備物品)。 此外,一些裝備 (角色)將隨著游戲的進(jìn)展而增長(zhǎng), 并且一些角色將保持與其初始值不變。 另外,對(duì)于FungibleToken,有“收獲”是恢復(fù)裝備,并且還有諸如“劍”和“槍”之類的裝備,這些也會(huì)增強(qiáng)裝備技能。
如何設(shè)置可以表達(dá)這些差異的抽象元數(shù)據(jù)? 當(dāng)使用ERC 1155Token作為游戲物品時(shí),這一點(diǎn)被認(rèn)為是非常困難的一點(diǎn)。
作為不FungibleERC1 155Token的元數(shù)據(jù),參考ERC 721案例,定義gene和技能等元數(shù)據(jù),并且在具有增長(zhǎng)和變化的Token的情況下,適當(dāng)?shù)馗淖冞@些值。有可能通過(guò)表達(dá)角色的成長(zhǎng)
另一方面,在 FungibleToken中, 除了包括在現(xiàn)有ERC 20標(biāo)記中的 totalSupply 和name之類的參數(shù)之外 ,我們認(rèn)為還應(yīng)包括關(guān)于裝備特征,string和 uint 類型的,像skills和effects這樣的信息參數(shù)。
在任何情況下,通過(guò)設(shè)置適當(dāng)?shù)脑獢?shù)據(jù),將能夠創(chuàng)建比現(xiàn)有 Dapps 游戲更具有可擴(kuò)展性和流暢性的游戲。
ERC1155Token元數(shù)據(jù)設(shè)置示例
以下是 使用ERC1155的游戲道具的示例。 例如,以下的Non FungibleToken為例。
:nonFungible.sol
struct NonFungibleMetaData {
uint256 id;
uint256 genes;
uint8[] skills;
string name;
uint256 winCount;
uint256 papaId;
uint256 momId;
uint256 saleDuration;
bool isOnSale;
}
在此示例中 ,設(shè)置元數(shù)據(jù)以支持Non-FungibleToken的名稱,能力,外觀,交配和拍賣等功能。 如果這是現(xiàn)有 Dapp 字符 的 圖像,則上述功能可能不是必需的和充分的。
另一方面, 請(qǐng)將以下內(nèi)容視為FungibleToken。
:fungible.sol
struct FungibleItems {
string name;
uint256 totalSupply;
uint256 itemPrice;
FungibleItemExecInterface tokenContract;
mapping(address =》 uint256) balances;
}
在這里,我們準(zhǔn)備了FungibleToken名稱,總供應(yīng)量,價(jià)格,持有量和裝備執(zhí)行界面。
通過(guò)設(shè)置 FungibleItemExecInterface ,可以將如草藥和武器之類的Fungible物品抽象化,甚至可以執(zhí)行其物品。
下面是 FungibleItemExecInterface的示例。
:fungibleItemEffect.sol
contract FungibleItemExecInterface {
function modifyGenes(uint256 _gene) external returns(uint256);
function modifySkills(uint8[] _skills) external returns(uint8[]);
}
這里 定義了兩個(gè)函數(shù)。 modifyGenes 是一個(gè)接收 nonFungibleItem 的gene之后并將修改的gene 返送回去的函數(shù)。
另外,ModifySkills 是接收NonFungibleItem的skills后將修改的skills返送回去的函數(shù)。
通過(guò)以這種方式定義界面,可以為更改每個(gè)裝備賦予角色的效果。
如果想為每個(gè)游戲(例如戰(zhàn)斗或抽獎(jiǎng)系統(tǒng))實(shí)現(xiàn)獨(dú)特的功能,則需要考慮進(jìn)一步考慮與線下時(shí)的合作,但通過(guò)設(shè)置如上所述的元數(shù)據(jù),它將適用于多個(gè)裝備,更有可能靈活的對(duì)應(yīng)。
Dex 與ERC1155Token的兼容
Moldex α版本通過(guò)構(gòu)造符合帶有如上所述的ERC1155Token的 Dex 實(shí)現(xiàn)更具有靈活性的Token傳輸 。
目前的 ERC 721的 Dex 僅支持Non FungibleToken,但是通過(guò)支持包括Fungible Tokens在內(nèi)的ERC 1155標(biāo)準(zhǔn), Moldex 不僅適用于Non Fungible和角色,還適用于“購(gòu)買10個(gè)草藥”這樣Fungible的裝備。 這不僅會(huì)增加游戲間的資產(chǎn)轉(zhuǎn)移,還會(huì)促進(jìn)ERC 1155Token的傳播,并有望為 Dapps Games做出進(jìn)一步的發(fā)展與貢獻(xiàn) 。
評(píng)論