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