这是一篇sleep minting的骗术揭秘文章,请所有web3参与者务必全文认真阅读。
现在已经有了很多追踪巨鲸交易的工具,巨鲸们的动作成为了很多人对于项目判断的风向标,就像是在赌场里你跟着庄家下注准没错,所以很多项目方会想尽办法让自己的NFT与这些巨鲸扯上点关系,目前常见的操作有2种:1
1.直接空投给巨鲸
2.直接用巨鲸钱包地址来mint,伪装成巨鲸mint了你的NFT
这两种操作都不是本文要讲的骗术,因为它们这种操作已经比较低级很容易让小韭菜们看破。
假设将第二种升级,V神mint了一个NFT,然后V神把这个NFT转移给了我,你会怎么想?
本文将拆解第三种骗术的具体实现过程,注意本文的目的是让大家避免被骗,不是让大家学会这种骗术去骗别人,若产生了纠纷请自负。
这种骗术是第二种的升级版,所以我们要先实现第二种的效果。
首先我们看一下正常的mint函数是什么样的,只传入了一个参数numberOfTokens用来表示被mint的NFT编号,执行_safeMint,msg.sender则代表当前正在操作者的地址,比如是我在操作,于是就实现了“我的钱包地址mint了一个编号为3的NFT”。
我们将这个函数修改一下,新加一个传入的参数mintAddress,并将msg.sender替换为mintAddress,则我可以指定将编号为3的NFTmint给某个人。
然后我在地址中输入V神的地址,编号输入1,点击transact进行交易,
交易完成后,我们可以看到这个NFT是从0x00地址到了V神的钱包,这意味着V神mint了我的NFT。
也可以查询到V神确实拥有了这个NFT。
到这里,第二种骗术已经实现了,这时候可能会有不明就里的人说“卧槽V神mint了一个NFT项目,赶快冲!”
但这种骗术已经麻了,那更高级的是“卧槽V神mint了一个NFT项目,而且把它交易给了另外一个人,赶快冲!”
所以我需要将V神的这个NFT从他的账户中转移到我的账户。
所以我将from地址填为V神,to地址填为我,tokenid填为刚才mint的编号1,点击transact执行。
在预料之中这个交易被拦截了,我如果能从V神的钱包中转移NFT,那我还在这写公众号干嘛呢早都游艇豪宅了。
接下来需要做一些底层的事,将ERC721协议的合约代码进行修改,来开一个后门。
我们来到openzeppelin,这是一个官方封装好的协议库,进入Ownable.sol中。
在里面增加一个秘密持有人_secretOwner,并把我自己的地址写进去。
接下来要将我的地址赋予最高权限,我们可以看到onlyOwner修饰符中的校验逻辑是当前操作人是否为owner,如果不是则会被拦截。
我们将其修改为新增一个或逻辑,校验当前操作人是否是我自己,如果是的话则予以通过,它的性质就像是我是一栋楼的楼管,你们每个人都有自己的钥匙可以打开自己的房子,但是我有一把万能钥匙,可以打开你们所有人的房子。
然后我们进到ERC721.sol协议合约中,还是先定义全局变量 _secretOwner为我的地址。
再修改approve函数,其表示是否将资产的操作权限授权给某个人,可以看到这里有两层校验:
1.交易发起者是否为owner本身
2.调用isApprovedForAll校验onwer是否给发起者授权
我新增一个校验逻辑:交易发起者是否为_secretOwner我自己。
_isApprovedOrOwner是用来校验是否授权或者为tokenowner,在这里也是将我自己加进去。
接下来我们再回到一开始的操作,from输入V神地址,to输入我自己的地址,tokenid为存放在V神的NFT,点击transact交易。
可以看到钱包正常的被调起,并提示我将转移一个doodlesNFT和gas费,继续下一步确认。
交易成功!
交易记录显示这个NFT是由V神转移给我的!
经历这么一通操作,我成功的实现了“一个项目方发行了NFT,然后V神去mint了一个,还将其转移给了我”,大家可以想象一下,我如果拿着这个NFT去招摇撞骗,不知道会有多少人上当。
不可能让所有NFT交易者都具备这样熟练的代码阅读能力,在购买NFT项目时认真审阅合约代码是否有后门,这也就是去中心化的另一面,在无监管的状态下,底层代码和上层交易都是自由开放状态,利用技术来注入恶意代码从而即使产生了欺诈,也只能吃哑巴亏无法追回。
技术不好的如之前文章提到的阿狸NFT到底做错了什么?坑的是自己,但是技术好的则在某种程度上是掌握了规则操控能力的,在整个开放的web3世界中可以犹如开了外挂般以上帝之手操纵这个世界运转的规则。