我想实现的是自毁令牌。
例如,我希望将一些可更新的TTL值分配给我的令牌。如果到达TTL,则应该自动刻录令牌。
对于这样的任务,最好的解决方案是什么?
这样的实现不安全吗?好的做法是什么?
发布于 2019-10-02 03:15:28
有趣的问题是,你描述的东西类似于一个基于时间的资源,比如一个事件的门票或一个日历约会,它在某个截止日期之前就有价值,之后变得毫无价值(除了作为出席情况的证明)。
您自己的令牌不必为ERC20或ERC721使用标准的ERC20合同,但仍符合标准。你定义的“烧”或“活”取决于你的合同。在返回"ownerOf“或"balanceOf”时,您只需做一次额外的检查,查看TTL是否仍然有效。
contract TTL_ERC721 {
mapping(uint256 => uint256) public deadBlockNumbers;
...
function ownerOf(uint256 _tokenId) view public returns (address _owner) {
if ((deadBlockNumber[_tokenId] == 0) || (block.number > deadBlockNumber[_tokenId])) {
return "0x0000000000000000000000000000000000"; // check to make sure this is the correct number of zeros
}
return owners[_tokenId];
}
function mint(uint256 _tokenId, uint256 _owner, uint256 _blocksFromNow) public {
// do some checks / requires here to make sure msg.sender is able to own this token
owners[_tokenId] = _owner;
deadBlockNumber[_tokenId] = _blocksFromNow;
}
}祝你好运,希望这能帮上忙。
发布于 2019-10-01 15:40:39
这是不可能使它的自动燃烧,因为每一个行动在埃瑟姆区块链需要交易。在发生erc721刻录的情况下,您需要调用特定的刻录函数。您所能做的就是为每个唯一的令牌添加一些标识符(status),并创建一个公共视图函数,它根据TTL或其他条件返回状态(例如活动/过期)--这将在没有事务的情况下每次计算。然后,您可以使用它作为标记,如果需要,可以手动或在其他智能契约调用期间刻录过期令牌。
发布于 2019-10-01 18:56:53
ERC-721包括此事件发射要求:
/// @dev This emits when ownership of any NFT changes by any mechanism.
/// This event emits when NFTs are created (`from` == 0) and destroyed
/// (`to` == 0). Exception: during contract creation, any number of NFTs
/// may be created and assigned without emitting Transfer. At the time of
/// any transfer, the approved address for that NFT (if any) is reset to none.
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);如果您的TTL需要特定的时间/块号来燃烧,那么就不可能以符合标准的方式做到这一点。这是因为如果您需要在块12345上执行操作,那么任何人都可以创建块12345,并且他们可能会排除您的事务(必须从链上启动)。
但如果你需要这个,那就不要遵循标准!您可以实现getter,这样在特定的时间之后,所有这样的标记实际上都是不存在的,因为关于它们的任何查询都不会返回任何信息。
https://ethereum.stackexchange.com/questions/76393
复制相似问题