你可以通过两个措施来保护你的项目:
- 限制每个钱包的可铸币量
- 检查
msg.sender == tx.origin
,即检查是否有人通过其他合约来调用铸币函数,如果不等,说明是通过合约调用铸币函数,这时应该拒绝铸币请求!
当用户通过一个合约调用你的铸币函数时,
msg.sender
将是合约地址,但tx.origin
将是调用该合约的人的地址。
NFT狙击是指有人知道哪些代币是稀有的,并且知道代币被铸造的顺序。因此,他们选择适当的时间去铸造一堆NFT,目标是获取稀有的NFT。 我们需要避免NFT被狙击,以保证每个人都能公平地分配代币。
首先,NFT狙击由2个问题造成:
- 暴露了代币元数据(让狙击手推断出代币的稀有性);
- 以确定的顺序铸造代币(让狙击手推断铸造稀有代币的正确时间);
对于第一个问题,你可以通过在代币被铸造后才披露元数据来解决,或者你可以使用分批渐进式披露,这通常是盲盒的设计,你可以去看看NFT盲盒的代码。
另外所有的链上数据都会被读取和利用。所以在铸币开始前不要验证你的合约。
第二个问题可以通过随机化铸币顺序来解决。链上随机化是很难的。以太坊没有内置的随机数生成器,所以人们一直在使用各种技巧,如使用当前区块号作为种子和/或将其与矿工地址相结合以获得额外的随机性。由于这不是真正的随机性,这些类型的技巧很容易被高级狙击手识破。
你可以使用一个随机化的预言机(Chainlink),但即使如此,高级狙击手也可以通过偷看NFT来绕过它, 其可以实现:如果铸币的NFT被证明并不罕见,就回退交易(例子这里)。因此,不幸的是,没有100%的方法来解决第二个问题。 你可以做的一件事是添加白名单机制,但这只有在整个NFT集合可以被限制在白名单的社区内时才有效。