内容概要

粉丝反馈,他在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上链成本高,标准ERC721mint需要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都没上链竟能出现在我的钱包里?相关推荐

  1. 给2021金三银四的程序员们-投简历100份,1份面试通知都没收到,哪里出了问题

    与该岗位契合度 写好简历要重点把握住以下几个方面: 人职匹配.HR招聘.看简历的一个基本原则就是"人职"匹配,因此整个简历呈现出的你的知识.技能.能力等综合素质,要和个人应聘的职位 ...

  2. 双十一,假如有人把支付宝存储服务器炸了,你的钱是不是都没了?

    作者:净整些没用的 原文链接: https://www.zhihu.com/question/350997893/answer/875003181 前几天微信支付出了点问题,今天在知乎看到了一个问题& ...

  3. 马斯克蝉联美国CEO薪酬榜No.1,年入41亿,库克皮猜纳德拉加起来都没他高

    郭一璞 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 硅谷钢铁侠.星链缔造者.特斯拉血汗工厂资本家.新造车势力的噩梦.中国人民的好朋友.煎饼果子爱好者,一龙·马斯克,现在又有了一个新的t ...

  4. 互掐了半辈子的两个数学巨头,到最后连单身问题都没解决

    我居然跑不赢 一只龟 看文章前,我们先来讨论一个问题:"假设有一笔钱,先花它一半,再花它剩下的一半,这么花下去,是不是永远花不完?". 看起来这个问题无懈可击,找不到bug,但是实 ...

  5. 985博士:导师是院士,直到毕业,我们都没单独说过一句话

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理:公众号@机器学习算法与Python学习 本文仅做学术分享,如有侵权,请联系删除. 在哈佛大学,教 ...

  6. 又一个智商税产品“路由器防辐射笼”,信号都没了,还能火爆全网...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 今天在办公室,听到几位怀孕的准妈妈在聊防辐射的问题,其中 ...

  7. 电脑屏幕卡住了按什么都没反应_手机突然“死机”了关机也不行,怎么按都没反应,怎么办?...

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注. 人有生老病死,手机也可 ...

  8. 做了5年测试连一门语言都没学?逆袭后拿到3个超22K offer!

    所谓的"眼睛一睁一闭,一天就过去了,日子就是这样."--只是逃脱不出舒适区泥淖的人,给自己画地为牢,还安慰自己众生皆如是. 生活没有一个模样. 而是,你把生活过成了什么样. 大家都 ...

  9. 我是个程序员,每天敲敲打打,哪天电脑崩溃了会发现我这辈子啥都没留下

    2019独角兽企业重金招聘Python工程师标准>>> 我尽量用平和一点的口吻跟你说说关于程序员的那点事儿. 1. 我在一个叫XXXX的公司上班,那地方有50%的人整天干的事情就是催 ...

最新文章

  1. 裸奔的支付X聊天,你还敢用吗?
  2. 劳动节特别活动,钉钉、支付宝合种,2-4天领证,限量9个名额
  3. 通常,Node.js如何处理10,000个并发请求?
  4. 在IIS中写Python的CGI脚本
  5. 区块链:新经济蓝图及导读
  6. ODBC连接到400
  7. python根据坐标点画线_拖动鼠标绘制一条线,并在opencv中获得线端点的坐标Python...
  8. java ee 的使用方法_改善Java EE生产支持技能的8种方法
  9. html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
  10. 人从众!五一假期全国旅游收入破千亿 你贡献了多少?
  11. LVS的VS/NAT及VS/DR类型实现
  12. 编译裁剪busybox
  13. The Truman Show
  14. vue之表格数据渲染,实现点击表格某列按钮弹出框显示剩余数据(模态框知识点)
  15. 让你一遍就会的【单纯形法解线性规划最优】
  16. 布兰迪斯大学计算机美国大学排名,布兰迪斯大学排名多少 美国和世界排名介绍...
  17. idea 2020.1 连接MySQL数据库的两种方法
  18. 全球都在研发的虚拟气候设备,是治愈“失眠”的最优解吗?
  19. 【wpf】Page的Unloaded事件
  20. jquery(文本框添加符号)

热门文章

  1. 从大数据挖掘大智慧,华为创造AI时代速度新高度
  2. 经线、纬线、本初子午线、南北东西半球
  3. python电玩城源码_2019最新最全价值2W的微信H5电玩城游戏全套源码+架设教程+配置文档...
  4. Windows磁盘管理(Raid)
  5. 使用Python批量将PDF转换成图片
  6. windows11安装方法
  7. 5个最好的WordPress电商插件比较 - 2019年
  8. AfxGetThreadState 与 _AFX_THREAD_STATE 剖析
  9. 电脑端微信双开,教你两种简单的方法,上手即用!
  10. Db2 SQL PL简介