ERC721x标准本质上为NFT提供了双因素身份验证(2FA),为NFT增加了多层安全性
原文标题:(Re)Introducing ERC721x: A safer implementation of the ERC721 standard
原文作者:CyberKongz
原文来源:cyberkongz
编译:Kate, Marsbit
这是已经公开的,你可以在这里找到。
CyberKongz的Solidity开发负责人OwlofMoistness开发了ERC721x标准,继续努力开发WEB3技术并推动该领域向前发展。简而言之,该标准为你的NFT增加了多层安全性,让你在晚上睡得舒适。
众所周知,在这个领域有一些糟糕的玩家。WEB3 中的诈骗行为十分猖獗,只需轻轻一按,你钱包中的所有东西就会被掏空。我们的目标是用技术来改变这一点,以保护我们的持有者。该标准本质上为你的NFT提供了双因素身份验证(2FA),指定第二个钱包作为“监护人”,防止你宝贵的NFT在未经你授权的情况下被转移。
我们很高兴地宣布,下一个CyberKongz mint将使用ERC721x,继续我们在Web3中拥有最安全社区的传统。
ERC721x有2层,“锁定”和“保护”。
当你“锁定”你的NFT时,你正在使用锁定注册表,这是一个将自己插入ERC721标准的系统,只需要很少的gas,并允许白名单地址锁定和解锁资产。在从锁定注册表中取消分配之前,不能移动资产。
质押你的资产而不是去所有权。锁注册表在构建时考虑了并行质押的能力。资产可以在多个系统中使用,在这些系统中,将资产锁定在适当的位置将是有益的。
监护人合约的执行方式与锁定类似,但进行了一些调整……持有NFT的钱包(钱包A)不会锁定NFT,持有钱包会指定第二个钱包(钱包B)作为“监护人”。然后监护人钱包可以第二次将资产锁定在持有钱包中。然而,这一次是监护人钱包需要批准资产转移,表面上是创建链上2FA。建议使用硬钱包或冷钱包,以确保最高的安全性。
在Owl的GitHub上阅读更多关于监护人合约的信息。
在Owl's Medium 上阅读有关锁定和保护的更多信息。
ERC721x好处
我们都知道热钱包很方便,我们喜欢在日常活动中使用它们,但这种便利也带来了巨大的漏洞……监护人合约让你享受热钱包的便利,同时增加了冷/硬件/多签名钱包的安全性。它甚至允许你使用第二个硬件钱包来保护已经驻留在硬件钱包上的资产,以增加另一层保护,防止签署不需要的转移或批准交易。
此外,诈骗将更难实施。
电子邮件诈骗,社会工程诈骗,引诱用户批准OpenSea销售,批准一些流氓合约,热钱包黑客攻击或泄露助记词等……
如果你的资产被锁定,所有这些诈骗方法都不起作用。
黑客攻击的数量将大幅减少,从而为用户节省数十万甚至数百万的NFT价值。
让我们看一下技术细节。
ERC721x它是如何工作的
ERC721x合约
该标准允许实现ILock接口的合约锁定/解锁资产,以启用/禁用资产转移。
这是如何工作的呢?
锁注册表包含四个映射:
mapping(address => bool) public approvedContract;
mapping(uint256 => uint256) public lockCount;
mapping(uint256 => mapping(uint256 => address)) public lockMap;
mapping(uint256 => mapping(address => uint256)) public lockMapIndex;
第一个是approvedContract,它是一个映射,用于检查是否允许某个地址锁定/解锁集合中的资产。该映射由合约的所有者(例如EOA或多重签名)更新。
lockCount是跟踪代币拥有多少锁的映射。只要锁计数> 0,代币就不能移动。一旦没有更多的锁,代币就可以再次自由移动。
lockMap和lockMapIndex一起工作。
lockMap是一个二维映射,它将代币ID连接到锁定它的地址。
lockMap[tokenId][lockIndex] =>被锁定的合约
lockMapIndex是一个二维映射,它将代币ID连接到锁定它的地址的lockIndex。
lockMapIndex[tokenId][lockingContract] =>锁定合约的锁定索引
当合约解锁代币时,这两个映射对于轻松跟踪和删除锁是必要的。
接口
IERC721x接口非常简单:
interface IERC721x {
/**
* @dev Returns if the token is locked (non-transferrable) or not.
*/
function isUnlocked(uint256 _id) external view returns(bool);
/**
* @dev Returns the amount of locks on the token.
*/
function lockCount(uint256 _tokenId) external view returns(uint256);
/**
* @dev Returns if a contract is allowed to lock/unlock tokens.
*/
function approvedContract(address _contract) external view returns(bool);
/**
* @dev Returns the contract that locked a token at a specific index in the mapping.
*/
function lockMap(uint256 _tokenId, uint256 _index) external view returns(address);
/**
* @dev Returns the mapping index of a contract that locked a token.
*/
function lockMapIndex(uint256 _tokenId, address _contract) external view returns(uint256);
/**
* @dev Locks a token, preventing it from being transferrable
*/
function lockId(uint256 _id) external;
/**
* @dev Unlocks a token.
*/
function unlockId(uint256 _id) external;
/**
* @dev Unlocks a token from a given contract if the contract is no longer approved.
*/
function freeId(uint256 _id, address _contract) external;
}
被批准的合约可以锁定或解锁资产。锁定资产两次将恢复,与两次解锁的行为相同。
freeId是一个紧急函数,只能在特定条件下调用。它的行为类似于unlockId函数。只有当先前批准的锁定资产的合约不再被批准时,才能调用它。这意味着你将需要通过调用updateApprovedContracts来更改approvedContract[badContract] => false,并取消初始批准合约的设置。只有当锁定合约逻辑错误并阻止人们解锁资产时,才会发生这种情况。通过不批准有缺陷的合约,我们允许用户解除锁定,以便在他们选择的情况下转移他们的资产。
CyberKongz Genkai mint将利用这一新标准,继续我们在Web3中拥有最安全社区的传统。我们相信这项技术是朝着web3安全性的正确方向迈出的一步。我们鼓励该领域的其他项目采用ERC721x标准,我们已经看到一些著名的集合,如9gag和Keungz在他们的集合中实施了该标准。有关该标准的更多信息以及在你自己的项目中实现它,请阅读Owl的Medium和Github。
加入我们的Discord以保持最新状态并成为我们社区的一部分:https://discord.com/invite/cyberkongz