【解密】OpenSea免费创造的NFT都没上链竟能出现在我的钱包里?
内容概要
粉丝反馈,他在opensea无gas免费创建的NFT资产,竟能出现在小狐狸钱包里,而opensea官方声明的此NFT在正式交易前是未上链铸造的,这就很奇怪,中心化应用的资产出现在为去中心化应用服务的钱包里,到底是官方代付gas上链还是乌龙,随我一文揭晓!
目录大纲
1. 背景简述
2. 破案历程
2.1 小狐狸网络抓包
2.2 链上的交易统计
2.3 合约反编译分
3. 破案总结
面向对象
Web3新手,有无技术背景均可理解此文解密过程
背景简述
1.1 opensea 是什么?
全球最大的公链NFT交易平台,也是目前除以太坊链底层外营收最大的web3平台,下文简述为os
1.2 NFT是什么?
可见前文:【源码解读】你买的NFT到底是什么?
1.3 NFT铸造是什么?
可见前文:当奈飞的NFT忘记了web2的业务安全
大意是,只有在链上Mint后的才能认为是资产,且一般用户需要付gas
1.4 os的免费创造NFT服务是什么?
NFT上链成本高,标准ERC721的mint需要8W的gas,约5刀
NFT定制合约难,虽有标准但顶级NFT项目会定制且部分强化功能,例如azuki(出品721A,降低批量mint成本)
因此,易用性一直就是市场的痛点,毕竟艺术家不是合约工程师,需更低成本的试错来探索有价值的艺术品,官方也特别说明过(原文见附录)
在opensea.io上create的NFT,符合ERC1155标准,即使是它们存在于链上之前,这些 NFT 也可以在任何平台上出售,在交易时才上链铸造
破案历程
2.1 案例来源
某粉丝很惊奇发现,自己确实可以在os上按流程进行create,但按官方说法此时是未上链的,但是他尝试在小狐狸钱包里导入资产时发现, 竟然已经可见,甚至尝试导入一个自己未create的NFTID时也能导入成功,因此反馈我寻找技术维度的全貌解读
2.2 还原方式
1:os上 createNFT(附录有官方教程)得到合约地址与ID
2:小狐狸上开启NFT检测后,再手动添加收藏品,即出现Shared Storefront
2.3 调查不易
其实查询资产是否上链是个非常容易的过程,用区块链浏览器即可
见前文:当我们在看Etherscan的时候,到底在看什么?
但是由于此os的NFT共享商店的合约并没有做验证。所以无法直接看源码查数据
但使用未经开源以及安全审计的合约,着实让我这从事多年安全行业的职业强迫症有些难受
如果真存在风险,其危害是巨大的
如果真未上链,小狐狸钱包去读取中心化平台数据?放在我的资产里?
如果真上了链,用户无需gas,则可能官方付费上链,雷同羊毛有被攻击风险
未上链的资产,如产生冲突风险,那此NFT属于谁的?
2.4 小狐狸app抓包
首先咱们通过对照实验做手机抓包,发现整体小狐狸会做的事情很多
拉取地址余额,交易,最新块内容,指定地址合约字节码等等
对数百个网络包逐个分析后,发现其小狐狸会使用infura(提供api接口同以太坊节点做交互的平台)的eth-call方法,功能是查询指定NFT合约中标准的balanceof方法
为何我如此肯定?此请求包里没有balanceof呀?
咱们用实验说话双向校验,标准的1155协议的标准函数名及参数为:
function balanceOf(address,uint256)
由于data构建指定函数调用,其生成Mothod-ID的原理是名字+参数类型组合,因此他构建的call方法,data字段的开头必然为00fdd58e
我输 入的要添加资产是123号,其data参数末尾对应是7b=(7*16+11=123) 也对应上。
同时发现其缺乏防重放的措施,所以我可以直接编辑参数
重发请求查询其他NFT合约所有权来对比
azuki:721标准,无得到0,有则非0
爱死机:1155标准,无得到0,有则得1
查os共享商店,修改参数尾数(刚才的123)确实会得到值但意义不明
所以这里我得出的一大惊奇猜想是(是错误的):
链上可查得NFT所有权的值,难道真的上链了吗?
2.5 链上交易统计
如果真上链其实也可以不由用户支付gas,有种“元交易”的技术手法,就是交易发起方和gas支付者不同的形式,并且openzepplin里特地有个content 合约就是用于额外支持元交易产生的msg.sender 可能特殊化的问题
但是,我通过对此合约的链上交易数据统计(etherscan+dune),抽取23号一天出现的交易频率可见下图,都证明了好像并没有固定由官方发起的元交易类型交易
2.6 破局得靠合约反编译
由于官方没有验证合约,导致分析起来费劲多了,但可通过合约反编译来大致摸清逻辑
如果只是openzepplin的标准1155库进行反编译的话,行数是170行
但是此1155则反编译后是1000行,因此必然有较多自定义实现
反编译后整体是吻合1155的数据标准
mapping (uint256 => [uint256]) _balanceOf;
mapping (uint256 => [uint256]) _setApprovalForAll;
uint256[] _name;
uint256[] _symbol;
mapping (uint256 => [uint256]) _totalSupply;
但是也显著有不是标准数据部分
mapping (uint256 => [uint256]) owner_a;
mapping (uint256 => [uint256]) _creator;
由于链上数据读取返回了结果,所以重点分析balanceOf 函数,他整体实现用了30多行,这是很明显重写了原先的标准函数
//此为标准1155协议的balanceOf 函数实现,只是读取指定id和地址的数值而已
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {require(account != address(0), "ERC1155: balance query for the zero address");return _balances[id][account];}
由于os他依旧是沿用标准,所以他的两个参数是固定的可以理解为:
- Varg0 = 待查询NFTid所有权的用户地址
- varg1 = 待查询的NFTID 数字
从反编译程序里看逻辑,他会读取待查地址的_balanceOf总余额数,以及此NFTID是否被_creator等等
//此为反编译os合约的片段(太长不粘来,反编译网址在附录)
function balanceOf(address varg0, uint256 varg1) public payable { require(msg.data.length - 4 >= 64);v0 = v1 = _balanceOf[varg0];if (address(_creator[varg1]) == 0) {v2 = v3 = address(varg1 >> 96) == varg0;if (address(varg1 >> 96) != varg0) {if (!(0xff & owner_a[varg0])) { 。。。
最关键的一句address(varg1 >> 96) != varg0
由于反编译不会完全按照solidity的语法,所以原本不支持的位移运算符就出现了
不讲复杂的,总之这里将varg1 (NFTID)的其中一部分,和varg0(用户地址)做比较
这也意味着,原来此NFT的ID包含了用户的地址
我顿然醒悟,写个进制转换,将我在os上create得到的NFTid传入,解密得出
这个数值也和我在小狐狸抓包看到的data后半段内容是一致
这里还可以继续研读代码来挖掘细节
比如balanceOf 返回结果为2个值,会审计编号是否会超出_totalSupply 限定发行量
比如safeTransferFrom 专门设置_mint 防重放攻击,在其中若未mint则进行首次铸造
在解读出NFTID的组成后,我也顿时明白此合约的核心逻辑了
此ID由3部分构成,用户地址+系列编号+指定ID ,这也意味着无论我铸造多少次,前xx位都是固定的,即我的钱包地址转为10进制而已,而他查询的balanceof函数也因为我前缀统一,从而判别我是未铸造前的所有者,因此理论上我的铸造空间极其大。
因此小狐狸确实能导入,因为前缀一致,balanceof 在没有所有者的情况下,会默认依据此NFTID对应的空间的所有者返回结果,如果发生铸造转移,也有合约中配套的owner_a 和_creator 来证明这个创作者和当前所有者的关系。
至于为何小狐狸能出现NFT图,这点是他官方声明过的设置,出于读取更多维度的描述说明、稀有度、原图uri等信息,且用户可关闭这个钱包去查询os中心化数据库的功能。
破案总结
小狐狸是无辜的,他只是用标准方法走infura读取链上数据而已,并没有特别加工并修改返回数据
os不去验证合约,有一定自我市场竞争保护的目的,但是不能阻挡妙手玩家对合约分析,却给不少用户带来无法证明资产所有的困境
最终,确实其NFT资产在交易转移前未被铸造上链,但由NFTID定义的空间已经被特殊设计可查得余额结果,所以理论上其他交易平台也可买卖此NFT
附录:
gas价格图:https://etherscan.io/gastracker
反编译平台:https://library.dedaub.com/decompile
metamask的NFT检测功能说明:
https://metamask.zendesk.com/hc/en-us/articles/360058238591-NFT-tokens-in-your-MetaMask-wallet
os共享商店合约地址:
0x495f947276749ce646f68ac8c248420045cb7b5e
OS官方声明:
【ERC-1155 NFT 会出现在我的钱包中吗?】
https://support.opensea.io/hc/en-us/articles/1500003082561-Will-ERC-1155-NFTs-appear-in-my-wallet-
【在 OpenSea 上免费创建 NFT指南】
https://opensea.io/blog/announcements/introducing-the-collection-manager/
写在最后:
前文回顾
【源码解读】你买的NFT到底是什么?
EIP-5058 能否防止NFT项目方提桶跑路?
当我们在看Etherscan的时候,到底在看什么?
当奈飞的NFT忘记了web2的业务安全
欢迎各位同学从后台提交有趣的合约或交易哈希。
关注十四,用技术的眼光发现价值。
看到这里,帅气的你不点个赞吗?
【解密】OpenSea免费创造的NFT都没上链竟能出现在我的钱包里?相关推荐
- 给2021金三银四的程序员们-投简历100份,1份面试通知都没收到,哪里出了问题
与该岗位契合度 写好简历要重点把握住以下几个方面: 人职匹配.HR招聘.看简历的一个基本原则就是"人职"匹配,因此整个简历呈现出的你的知识.技能.能力等综合素质,要和个人应聘的职位 ...
- 双十一,假如有人把支付宝存储服务器炸了,你的钱是不是都没了?
作者:净整些没用的 原文链接: https://www.zhihu.com/question/350997893/answer/875003181 前几天微信支付出了点问题,今天在知乎看到了一个问题& ...
- 马斯克蝉联美国CEO薪酬榜No.1,年入41亿,库克皮猜纳德拉加起来都没他高
郭一璞 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 硅谷钢铁侠.星链缔造者.特斯拉血汗工厂资本家.新造车势力的噩梦.中国人民的好朋友.煎饼果子爱好者,一龙·马斯克,现在又有了一个新的t ...
- 互掐了半辈子的两个数学巨头,到最后连单身问题都没解决
我居然跑不赢 一只龟 看文章前,我们先来讨论一个问题:"假设有一笔钱,先花它一半,再花它剩下的一半,这么花下去,是不是永远花不完?". 看起来这个问题无懈可击,找不到bug,但是实 ...
- 985博士:导师是院士,直到毕业,我们都没单独说过一句话
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理:公众号@机器学习算法与Python学习 本文仅做学术分享,如有侵权,请联系删除. 在哈佛大学,教 ...
- 又一个智商税产品“路由器防辐射笼”,信号都没了,还能火爆全网...
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 今天在办公室,听到几位怀孕的准妈妈在聊防辐射的问题,其中 ...
- 电脑屏幕卡住了按什么都没反应_手机突然“死机”了关机也不行,怎么按都没反应,怎么办?...
阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注. 人有生老病死,手机也可 ...
- 做了5年测试连一门语言都没学?逆袭后拿到3个超22K offer!
所谓的"眼睛一睁一闭,一天就过去了,日子就是这样."--只是逃脱不出舒适区泥淖的人,给自己画地为牢,还安慰自己众生皆如是. 生活没有一个模样. 而是,你把生活过成了什么样. 大家都 ...
- 我是个程序员,每天敲敲打打,哪天电脑崩溃了会发现我这辈子啥都没留下
2019独角兽企业重金招聘Python工程师标准>>> 我尽量用平和一点的口吻跟你说说关于程序员的那点事儿. 1. 我在一个叫XXXX的公司上班,那地方有50%的人整天干的事情就是催 ...
最新文章
- 裸奔的支付X聊天,你还敢用吗?
- 劳动节特别活动,钉钉、支付宝合种,2-4天领证,限量9个名额
- 通常,Node.js如何处理10,000个并发请求?
- 在IIS中写Python的CGI脚本
- 区块链:新经济蓝图及导读
- ODBC连接到400
- python根据坐标点画线_拖动鼠标绘制一条线,并在opencv中获得线端点的坐标Python...
- java ee 的使用方法_改善Java EE生产支持技能的8种方法
- html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
- 人从众!五一假期全国旅游收入破千亿 你贡献了多少?
- LVS的VS/NAT及VS/DR类型实现
- 编译裁剪busybox
- The Truman Show
- vue之表格数据渲染,实现点击表格某列按钮弹出框显示剩余数据(模态框知识点)
- 让你一遍就会的【单纯形法解线性规划最优】
- 布兰迪斯大学计算机美国大学排名,布兰迪斯大学排名多少 美国和世界排名介绍...
- idea 2020.1 连接MySQL数据库的两种方法
- 全球都在研发的虚拟气候设备,是治愈“失眠”的最优解吗?
- 【wpf】Page的Unloaded事件
- jquery(文本框添加符号)
热门文章
- 从大数据挖掘大智慧,华为创造AI时代速度新高度
- 经线、纬线、本初子午线、南北东西半球
- python电玩城源码_2019最新最全价值2W的微信H5电玩城游戏全套源码+架设教程+配置文档...
- Windows磁盘管理(Raid)
- 使用Python批量将PDF转换成图片
- windows11安装方法
- 5个最好的WordPress电商插件比较 - 2019年
- AfxGetThreadState 与 _AFX_THREAD_STATE 剖析
- 电脑端微信双开,教你两种简单的方法,上手即用!
- Db2 SQL PL简介