[英]Handling multiple ERC721 Tokens in the same Contract
同一個合約可以處理多個ERC721
代幣嗎? 如果是這樣,怎么辦?
假設您正在制作一款游戲,您需要跟蹤兩種類型的ERC721
令牌:獨特的武器和獨特的車輛。
您可以為它們設置結構,如下所示:
struct Weapon {
uint256 IDNumber;
string type; // Sword, Bow&Arrow, Gun, Rifle, etc.
string specialFeature;
}
struct Vehicle {
uint256 IDNumber;
string type; // Car, Airplane, Boat, Spaceship, etc.
uint256 damageFactor;
}
要跟蹤他們的所有權,您可以將管理它們的 arrays 加倍 - 例如,而不是擁有標准:
// Enumerable mapping from token ids to their owners
EnumerableMap.UintToAddressMap private _tokenOwners;
你會這樣做:
// Enumerable mapping from token ids to their owners
EnumerableMap.UintToAddressMap private _weaponTokenOwners;
EnumerableMap.UintToAddressMap private _vehicleTtokenOwners;
(這可能不是最優雅的方式,但它是一個開始。)
但真正的問題是:您將如何處理作為ERC721
標准一部分的強制性功能,例如balanceOf()
和ownerOf()
?
具體來說,您是否可以說在這些方法的簽名中添加一個附加參數以幫助指示您正在查詢的特定令牌?
例如,而不是這個:
function balanceOf(address owner) public view override returns (uint256) {
}
您將tokenName
參數添加到函數的簽名中,如下所示:
function balanceOf(address owner, string tokenName) public view override returns (uint256) {
if(tokenName == “weapon”) {
return ownerAndHisWeaponTokensDictionary[owner].length;
}
else if(tokenName == “vehicle”) {
return ownerAndHisVehicleTokensDictionary[owner].length;
}
}
你會為ownerOf()
做類似的事情嗎?
這是允許的嗎? 這甚至是解決這個問題的正確方法 - 還是有不同的方法來推理所有這些並以不同的方式處理它?
我的方法是在 3 個單獨的地址上定義 3 個單獨的合約:
0x123123
作為 Weapons ERC-721 代幣合約0x456456
作為 Vehicles ERC-721 代幣合約0x789789
作為實際游戲合約在游戲合約中,您可以調用 NFTs 合約來獲取或驗證值:
function attack(uint attackerWeaponId) {
require(weaponsContract.isOwnerOf(msg.sender, attackerWeaponId));
// ...
}
isOwnerOf()
function 需要 2 個 arguments、 address owner
和uint256 weaponId
。 此外,用戶可能擁有更多武器,這就是我展示驗證的原因。
武器合約balanceOf(address)
將反映用戶擁有的武器 NFT 總量。
mapping (address => Weapon[]) userOwnedWeapons;
function balanceOf(address owner) external view returns (uint256) {
return userOwnedWeapons[msg.sender].length;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.