【发布时间】:2021-02-18 23:53:38
【问题描述】:
同一个合约可以处理多个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;
}
要跟踪它们的所有权,您可以将管理它们的数组加倍 - 例如,而不是使用标准:
// 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()?
具体来说,您是否可以说在这些方法的签名中添加一个额外的参数,以帮助指示您查询的是哪个特定的 Token?
例如,而不是这个:
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()做类似的事情吗?
这是允许的吗? 这甚至是解决这个问题的正确方法 - 还是有不同的方法来推理所有这些并以不同的方式处理它?
【问题讨论】:
标签: blockchain ethereum tokenize solidity